X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-blacklist.ts;h=baef1d6ce80cb859fb99620489b0898888536252;hb=41b15c892192073828458d007256a9dfdf3bb6fb;hp=26167174abe8ff6234045ae0ab14897f6e64e234;hpb=3bb6c52645af84832212c99fdec04143e4230180;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-blacklist.ts b/server/models/video/video-blacklist.ts index 26167174a..baef1d6ce 100644 --- a/server/models/video/video-blacklist.ts +++ b/server/models/video/video-blacklist.ts @@ -1,7 +1,12 @@ -import { BelongsTo, Column, CreatedAt, ForeignKey, Model, Table, UpdatedAt } from 'sequelize-typescript' -import { SortType } from '../../helpers/utils' -import { getSortOnModel } from '../utils' -import { VideoModel } from './video' +import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' +import { getSortOnModel, SortType, throwIfNotValid } from '../utils' +import { ScopeNames as VideoModelScopeNames, VideoModel } from './video' +import { ScopeNames as VideoChannelScopeNames, VideoChannelModel } from './video-channel' +import { isVideoBlacklistReasonValid, isVideoBlacklistTypeValid } from '../../helpers/custom-validators/video-blacklist' +import { VideoBlacklist, VideoBlacklistType } from '../../../shared/models/videos' +import { CONSTRAINTS_FIELDS } from '../../initializers/constants' +import { FindOptions } from 'sequelize' +import { ThumbnailModel } from './thumbnail' @Table({ tableName: 'videoBlacklist', @@ -14,6 +19,21 @@ import { VideoModel } from './video' }) export class VideoBlacklistModel extends Model { + @AllowNull(true) + @Is('VideoBlacklistReason', value => throwIfNotValid(value, isVideoBlacklistReasonValid, 'reason', true)) + @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max)) + reason: string + + @AllowNull(false) + @Column + unfederated: boolean + + @AllowNull(false) + @Default(null) + @Is('VideoBlacklistType', value => throwIfNotValid(value, isVideoBlacklistTypeValid, 'type')) + @Column + type: VideoBlacklistType + @CreatedAt createdAt: Date @@ -32,21 +52,51 @@ export class VideoBlacklistModel extends Model { }) Video: VideoModel - static listForApi (start: number, count: number, sort: SortType) { - const query = { - offset: start, - limit: count, - order: getSortOnModel(sort.sortModel, sort.sortValue), - include: [ { model: VideoModel } ] + static listForApi (start: number, count: number, sort: SortType, type?: VideoBlacklistType) { + function buildBaseQuery (): FindOptions { + return { + offset: start, + limit: count, + order: getSortOnModel(sort.sortModel, sort.sortValue) + } } - return VideoBlacklistModel.findAndCountAll(query) - .then(({ rows, count }) => { - return { - data: rows, - total: count - } - }) + const countQuery = buildBaseQuery() + + const findQuery = buildBaseQuery() + findQuery.subQuery = false + findQuery.include = [ + { + model: VideoModel, + required: true, + include: [ + { + model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, true ] }), + required: true + }, + { + model: ThumbnailModel, + attributes: [ 'type', 'filename' ], + required: false + } + ] + } + ] + + if (type) { + countQuery.where = { type } + findQuery.where = { type } + } + + return Promise.all([ + VideoBlacklistModel.count(countQuery), + VideoBlacklistModel.findAll(findQuery) + ]).then(([ count, rows ]) => { + return { + data: rows, + total: count + } + }) } static loadByVideoId (id: number) { @@ -59,22 +109,16 @@ export class VideoBlacklistModel extends Model { return VideoBlacklistModel.findOne(query) } - toFormattedJSON () { - const video = this.Video - + toFormattedJSON (): VideoBlacklist { return { id: this.id, - videoId: this.videoId, createdAt: this.createdAt, updatedAt: this.updatedAt, - name: video.name, - uuid: video.uuid, - description: video.description, - duration: video.duration, - views: video.views, - likes: video.likes, - dislikes: video.dislikes, - nsfw: video.nsfw + reason: this.reason, + unfederated: this.unfederated, + type: this.type, + + video: this.Video.toFormattedJSON() } } }