From 2e7cf5ae0cf8fbc9526742b67a0079d42211644c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 26 Sep 2018 14:08:35 +0200 Subject: Fix video files duplicated when fps is null Null values are not considered equal in a UNIQUE index --- server/initializers/constants.ts | 2 +- .../migrations/0260-upload-quota-daily.ts | 23 +++++++++++++++ .../migrations/0260-upload_quota_daily.ts | 23 --------------- .../migrations/0275-video-file-unique.ts | 34 ++++++++++++++++++++++ server/lib/activitypub/videos.ts | 2 +- server/models/account/account.ts | 1 - server/models/video/video-file.ts | 4 +-- 7 files changed, 61 insertions(+), 28 deletions(-) create mode 100644 server/initializers/migrations/0260-upload-quota-daily.ts delete mode 100644 server/initializers/migrations/0260-upload_quota_daily.ts create mode 100644 server/initializers/migrations/0275-video-file-unique.ts diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index de426c16e..09ecedfa5 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -16,7 +16,7 @@ let config: IConfig = require('config') // --------------------------------------------------------------------------- -const LAST_MIGRATION_VERSION = 270 +const LAST_MIGRATION_VERSION = 275 // --------------------------------------------------------------------------- diff --git a/server/initializers/migrations/0260-upload-quota-daily.ts b/server/initializers/migrations/0260-upload-quota-daily.ts new file mode 100644 index 000000000..d25154ba6 --- /dev/null +++ b/server/initializers/migrations/0260-upload-quota-daily.ts @@ -0,0 +1,23 @@ +import * as Sequelize from 'sequelize' +import { CONSTRAINTS_FIELDS } from '../constants' + +async function up (utils: { + transaction: Sequelize.Transaction + queryInterface: Sequelize.QueryInterface + sequelize: Sequelize.Sequelize +}): Promise { + { + const data = { + type: Sequelize.BIGINT, + allowNull: false, + defaultValue: -1 + } + await utils.queryInterface.addColumn('user', 'videoQuotaDaily', data) + } +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { up, down } diff --git a/server/initializers/migrations/0260-upload_quota_daily.ts b/server/initializers/migrations/0260-upload_quota_daily.ts deleted file mode 100644 index d25154ba6..000000000 --- a/server/initializers/migrations/0260-upload_quota_daily.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as Sequelize from 'sequelize' -import { CONSTRAINTS_FIELDS } from '../constants' - -async function up (utils: { - transaction: Sequelize.Transaction - queryInterface: Sequelize.QueryInterface - sequelize: Sequelize.Sequelize -}): Promise { - { - const data = { - type: Sequelize.BIGINT, - allowNull: false, - defaultValue: -1 - } - await utils.queryInterface.addColumn('user', 'videoQuotaDaily', data) - } -} - -function down (options) { - throw new Error('Not implemented.') -} - -export { up, down } diff --git a/server/initializers/migrations/0275-video-file-unique.ts b/server/initializers/migrations/0275-video-file-unique.ts new file mode 100644 index 000000000..fd89188c0 --- /dev/null +++ b/server/initializers/migrations/0275-video-file-unique.ts @@ -0,0 +1,34 @@ +import * as Sequelize from 'sequelize' + +async function up (utils: { + transaction: Sequelize.Transaction + queryInterface: Sequelize.QueryInterface + sequelize: Sequelize.Sequelize +}): Promise { + { + const query = 'DELETE FROM "videoFile" vf1 USING "videoFile" vf2 WHERE vf1.id < vf2.id ' + + 'AND vf1."videoId" = vf2."videoId" AND vf1.resolution = vf2.resolution AND vf1.fps IS NULL' + await utils.sequelize.query(query) + } + + { + const query = 'UPDATE "videoFile" SET fps = -1 WHERE fps IS NULL;' + await utils.sequelize.query(query) + } + + { + const data = { + type: Sequelize.INTEGER, + allowNull: false, + defaultValue: -1 + } + await utils.queryInterface.changeColumn('videoFile', 'fps', data) + } + +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { up, down } diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index db72ef23c..3dccabe12 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts @@ -478,7 +478,7 @@ function videoFileActivityUrlToDBAttributes (videoCreated: VideoModel, videoObje resolution: fileUrl.height, size: fileUrl.size, videoId: videoCreated.id, - fps: fileUrl.fps + fps: fileUrl.fps || -1 } as VideoFileModel attributes.push(attribute) } diff --git a/server/models/account/account.ts b/server/models/account/account.ts index 580d920ce..27c75d886 100644 --- a/server/models/account/account.ts +++ b/server/models/account/account.ts @@ -19,7 +19,6 @@ import { isAccountDescriptionValid } from '../../helpers/custom-validators/accou import { sendDeleteActor } from '../../lib/activitypub/send' import { ActorModel } from '../activitypub/actor' import { ApplicationModel } from '../application/application' -import { AvatarModel } from '../avatar/avatar' import { ServerModel } from '../server/server' import { getSort, throwIfNotValid } from '../utils' import { VideoChannelModel } from '../video/video-channel' diff --git a/server/models/video/video-file.ts b/server/models/video/video-file.ts index 0887a3738..f040803b9 100644 --- a/server/models/video/video-file.ts +++ b/server/models/video/video-file.ts @@ -66,8 +66,8 @@ export class VideoFileModel extends Model { @Column infoHash: string - @AllowNull(true) - @Default(null) + @AllowNull(false) + @Default(-1) @Is('VideoFileFPS', value => throwIfNotValid(value, isVideoFPSResolutionValid, 'fps')) @Column fps: number -- cgit v1.2.3