X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-import.ts;h=1d82960609904c3c872da37bdf1fafa494d96eb3;hb=ba2684ceddf9b76312635b9cddc6bf6975ce436a;hp=588a13a4fb71a27cbe8859224f8732cf0298a36f;hpb=1735c825726edaa0af5035cb6cbb0cc0db502c6d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-import.ts b/server/models/video/video-import.ts index 588a13a4f..1d8296060 100644 --- a/server/models/video/video-import.ts +++ b/server/models/video/video-import.ts @@ -1,3 +1,4 @@ +import { WhereOptions } from 'sequelize' import { AfterUpdate, AllowNull, @@ -13,26 +14,33 @@ import { Table, UpdatedAt } from 'sequelize-typescript' +import { afterCommitIfTransaction } from '@server/helpers/database-utils' +import { MVideoImportDefault, MVideoImportFormattable } from '@server/types/models/video/video-import' +import { VideoImport, VideoImportState } from '@shared/models' +import { AttributesOnly } from '@shared/typescript-utils' +import { isVideoImportStateValid, isVideoImportTargetUrlValid } from '../../helpers/custom-validators/video-imports' +import { isVideoMagnetUriValid } from '../../helpers/custom-validators/videos' import { CONSTRAINTS_FIELDS, VIDEO_IMPORT_STATES } from '../../initializers/constants' +import { UserModel } from '../user/user' import { getSort, throwIfNotValid } from '../utils' import { ScopeNames as VideoModelScopeNames, VideoModel } from './video' -import { isVideoImportStateValid, isVideoImportTargetUrlValid } from '../../helpers/custom-validators/video-imports' -import { VideoImport, VideoImportState } from '../../../shared' -import { isVideoMagnetUriValid } from '../../helpers/custom-validators/videos' -import { UserModel } from '../account/user' -@DefaultScope({ +@DefaultScope(() => ({ include: [ { - model: () => UserModel.unscoped(), + model: UserModel.unscoped(), required: true }, { - model: () => VideoModel.scope([ VideoModelScopeNames.WITH_ACCOUNT_DETAILS, VideoModelScopeNames.WITH_TAGS]), + model: VideoModel.scope([ + VideoModelScopeNames.WITH_ACCOUNT_DETAILS, + VideoModelScopeNames.WITH_TAGS, + VideoModelScopeNames.WITH_THUMBNAILS + ]), required: false } ] -}) +})) @Table({ tableName: 'videoImport', @@ -46,7 +54,7 @@ import { UserModel } from '../account/user' } ] }) -export class VideoImportModel extends Model { +export class VideoImportModel extends Model>> { @CreatedAt createdAt: Date @@ -108,21 +116,35 @@ export class VideoImportModel extends Model { @AfterUpdate static deleteVideoIfFailed (instance: VideoImportModel, options) { if (instance.state === VideoImportState.FAILED) { - return instance.Video.destroy({ transaction: options.transaction }) + return afterCommitIfTransaction(options.transaction, () => instance.Video.destroy()) } return undefined } - static loadAndPopulateVideo (id: number) { + static loadAndPopulateVideo (id: number): Promise { return VideoImportModel.findByPk(id) } - static listUserVideoImportsForApi (userId: number, start: number, count: number, sort: string) { + static listUserVideoImportsForApi (options: { + userId: number + start: number + count: number + sort: string + + targetUrl?: string + }) { + const { userId, start, count, sort, targetUrl } = options + + const where: WhereOptions = { userId } + + if (targetUrl) where['targetUrl'] = targetUrl + const query = { distinct: true, include: [ { + attributes: [ 'id' ], model: UserModel.unscoped(), // FIXME: Without this, sequelize try to COUNT(DISTINCT(*)) which is an invalid SQL query required: true } @@ -130,25 +152,20 @@ export class VideoImportModel extends Model { offset: start, limit: count, order: getSort(sort), - where: { - userId - } + where } - return VideoImportModel.findAndCountAll(query) - .then(({ rows, count }) => { - return { - data: rows, - total: count - } - }) + return Promise.all([ + VideoImportModel.unscoped().count(query), + VideoImportModel.findAll(query) + ]).then(([ total, data ]) => ({ total, data })) } getTargetIdentifier () { return this.targetUrl || this.magnetUri || this.torrentName } - toFormattedJSON (): VideoImport { + toFormattedJSON (this: MVideoImportFormattable): VideoImport { const videoFormatOptions = { completeDescription: true, additionalAttributes: { state: true, waitTranscoding: true, scheduledUpdate: true }