X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-import.ts;h=c040e0fda69661a5cf5c041284e338971049fde8;hb=4cf800a350972a078c074da6b31da2b98ab4b007;hp=1d82960609904c3c872da37bdf1fafa494d96eb3;hpb=7b51ede977c299a74728171d8c124bcc4cbba6ea;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-import.ts b/server/models/video/video-import.ts index 1d8296060..c040e0fda 100644 --- a/server/models/video/video-import.ts +++ b/server/models/video/video-import.ts @@ -1,4 +1,4 @@ -import { WhereOptions } from 'sequelize' +import { IncludeOptions, Op, WhereOptions } from 'sequelize' import { AfterUpdate, AllowNull, @@ -22,8 +22,17 @@ import { isVideoImportStateValid, isVideoImportTargetUrlValid } from '../../help 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 { getSort, searchAttribute, throwIfNotValid } from '../shared' import { ScopeNames as VideoModelScopeNames, VideoModel } from './video' +import { VideoChannelSyncModel } from './video-channel-sync' + +const defaultVideoScope = () => { + return VideoModel.scope([ + VideoModelScopeNames.WITH_ACCOUNT_DETAILS, + VideoModelScopeNames.WITH_TAGS, + VideoModelScopeNames.WITH_THUMBNAILS + ]) +} @DefaultScope(() => ({ include: [ @@ -32,11 +41,11 @@ import { ScopeNames as VideoModelScopeNames, VideoModel } from './video' required: true }, { - model: VideoModel.scope([ - VideoModelScopeNames.WITH_ACCOUNT_DETAILS, - VideoModelScopeNames.WITH_TAGS, - VideoModelScopeNames.WITH_THUMBNAILS - ]), + model: defaultVideoScope(), + required: false + }, + { + model: VideoChannelSyncModel.unscoped(), required: false } ] @@ -113,6 +122,18 @@ export class VideoImportModel extends Model VideoChannelSyncModel) + @Column + videoChannelSyncId: number + + @BelongsTo(() => VideoChannelSyncModel, { + foreignKey: { + allowNull: true + }, + onDelete: 'set null' + }) + VideoChannelSync: VideoChannelSyncModel + @AfterUpdate static deleteVideoIfFailed (instance: VideoImportModel, options) { if (instance.state === VideoImportState.FAILED) { @@ -132,23 +153,44 @@ export class VideoImportModel extends Model ({ total, data })) } + static async urlAlreadyImported (channelId: number, targetUrl: string): Promise { + const element = await VideoImportModel.unscoped().findOne({ + where: { + targetUrl, + state: { + [Op.in]: [ VideoImportState.PENDING, VideoImportState.PROCESSING, VideoImportState.SUCCESS ] + } + }, + include: [ + { + model: VideoModel, + required: true, + where: { + channelId + } + } + ] + }) + + return !!element + } + getTargetIdentifier () { return this.targetUrl || this.magnetUri || this.torrentName } @@ -174,6 +238,10 @@ export class VideoImportModel extends Model t.name) }) : undefined + const videoChannelSync = this.VideoChannelSync + ? { id: this.VideoChannelSync.id, externalChannelUrl: this.VideoChannelSync.externalChannelUrl } + : undefined + return { id: this.id, @@ -188,7 +256,8 @@ export class VideoImportModel extends Model