Add missing url unique index in local video viewer

pull/5548/head
Chocobozzz 2023-01-19 11:56:04 +01:00
parent 5bdfa604f1
commit f008e9f3f3
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
4 changed files with 34 additions and 19 deletions

View File

@ -415,8 +415,6 @@ export class VideosListComponent implements OnInit, OnChanges, OnDestroy {
.pipe(concatMap(({ reset, obs }) => obs.pipe(map(({ data }) => ({ data, reset })))))
.subscribe({
next: ({ data, reset }) => {
console.log(data[0].name)
this.hasDoneFirstQuery = true
this.lastQueryLength = data.length

View File

@ -6,7 +6,6 @@ import { randomInt, root } from '@shared/core-utils'
import {
AbuseState,
JobType,
UserRegistrationState,
VideoChannelSyncState,
VideoImportState,
VideoPrivacy,
@ -26,7 +25,7 @@ import { CONFIG, registerConfigChangedHandler } from './config'
// ---------------------------------------------------------------------------
const LAST_MIGRATION_VERSION = 750
const LAST_MIGRATION_VERSION = 755
// ---------------------------------------------------------------------------
@ -79,8 +78,6 @@ const SORTABLE_COLUMNS = {
ACCOUNT_FOLLOWERS: [ 'createdAt' ],
CHANNEL_FOLLOWERS: [ 'createdAt' ],
USER_REGISTRATIONS: [ 'createdAt', 'state' ],
VIDEOS: [ 'name', 'duration', 'createdAt', 'publishedAt', 'originallyPublishedAt', 'views', 'likes', 'trending', 'hot', 'best' ],
// Don't forget to update peertube-search-index with the same values
@ -293,10 +290,6 @@ const CONSTRAINTS_FIELDS = {
ABUSE_MESSAGES: {
MESSAGE: { min: 2, max: 3000 } // Length
},
USER_REGISTRATIONS: {
REASON_MESSAGE: { min: 2, max: 3000 }, // Length
MODERATOR_MESSAGE: { min: 2, max: 3000 } // Length
},
VIDEO_BLACKLIST: {
REASON: { min: 2, max: 300 } // Length
},
@ -523,12 +516,6 @@ const ABUSE_STATES: { [ id in AbuseState ]: string } = {
[AbuseState.ACCEPTED]: 'Accepted'
}
const USER_REGISTRATION_STATES: { [ id in UserRegistrationState ]: string } = {
[UserRegistrationState.PENDING]: 'Pending',
[UserRegistrationState.REJECTED]: 'Rejected',
[UserRegistrationState.ACCEPTED]: 'Accepted'
}
const VIDEO_PLAYLIST_PRIVACIES: { [ id in VideoPlaylistPrivacy ]: string } = {
[VideoPlaylistPrivacy.PUBLIC]: 'Public',
[VideoPlaylistPrivacy.UNLISTED]: 'Unlisted',
@ -673,7 +660,7 @@ const USER_PASSWORD_CREATE_LIFETIME = 60000 * 60 * 24 * 7 // 7 days
const TWO_FACTOR_AUTH_REQUEST_TOKEN_LIFETIME = 60000 * 10 // 10 minutes
const EMAIL_VERIFY_LIFETIME = 60000 * 60 // 60 minutes
const USER_EMAIL_VERIFY_LIFETIME = 60000 * 60 // 60 minutes
const NSFW_POLICY_TYPES: { [ id: string ]: NSFWPolicyType } = {
DO_NOT_LIST: 'do_not_list',
@ -1082,14 +1069,13 @@ export {
VIDEO_TRANSCODING_FPS,
FFMPEG_NICE,
ABUSE_STATES,
USER_REGISTRATION_STATES,
LRU_CACHE,
REQUEST_TIMEOUTS,
MAX_LOCAL_VIEWER_WATCH_SECTIONS,
USER_PASSWORD_RESET_LIFETIME,
USER_PASSWORD_CREATE_LIFETIME,
MEMOIZE_TTL,
EMAIL_VERIFY_LIFETIME,
USER_EMAIL_VERIFY_LIFETIME,
OVERVIEWS,
SCHEDULER_INTERVALS_MS,
REPEAT_JOBS,

View File

@ -0,0 +1,27 @@
import * as Sequelize from 'sequelize'
async function up (utils: {
transaction: Sequelize.Transaction
queryInterface: Sequelize.QueryInterface
sequelize: Sequelize.Sequelize
db: any
}): Promise<void> {
const { transaction } = utils
const query = 'DELETE FROM "localVideoViewer" t1 ' +
'USING (SELECT MIN(id) as id, "url" FROM "localVideoViewer" GROUP BY "url" HAVING COUNT(*) > 1) t2 ' +
'WHERE t1."url" = t2."url" AND t1.id <> t2.id'
await utils.sequelize.query(query, { transaction })
}
async function down (utils: {
queryInterface: Sequelize.QueryInterface
transaction: Sequelize.Transaction
}) {
}
export {
up,
down
}

View File

@ -21,6 +21,10 @@ import { LocalVideoViewerWatchSectionModel } from './local-video-viewer-watch-se
indexes: [
{
fields: [ 'videoId' ]
},
{
fields: [ 'url' ],
unique: true
}
]
})