]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/models/video/video-blacklist.ts
Fix live ending banner
[github/Chocobozzz/PeerTube.git] / server / models / video / video-blacklist.ts
index dc49852b66a3ca8e239bd6ca61310ecf527c91b6..aa18896da05a7360da197f42a76fd6a1c19a4045 100644 (file)
-import * as Sequelize from 'sequelize'
-
-import { addMethodsToModel, getSort } from '../utils'
-import {
-  BlacklistedVideoInstance,
-  BlacklistedVideoAttributes,
-
-  BlacklistedVideoMethods
-} from './video-blacklist-interface'
-
-let BlacklistedVideo: Sequelize.Model<BlacklistedVideoInstance, BlacklistedVideoAttributes>
-let toFormattedJSON: BlacklistedVideoMethods.ToFormattedJSON
-let countTotal: BlacklistedVideoMethods.CountTotal
-let list: BlacklistedVideoMethods.List
-let listForApi: BlacklistedVideoMethods.ListForApi
-let loadById: BlacklistedVideoMethods.LoadById
-let loadByVideoId: BlacklistedVideoMethods.LoadByVideoId
-
-export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
-  BlacklistedVideo = sequelize.define<BlacklistedVideoInstance, BlacklistedVideoAttributes>('BlacklistedVideo',
-    {},
+import { FindOptions } from 'sequelize'
+import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
+import { MVideoBlacklist, MVideoBlacklistFormattable } from '@server/types/models'
+import { VideoBlacklist, VideoBlacklistType } from '../../../shared/models/videos'
+import { isVideoBlacklistReasonValid, isVideoBlacklistTypeValid } from '../../helpers/custom-validators/video-blacklist'
+import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
+import { getBlacklistSort, searchAttribute, SortType, throwIfNotValid } from '../utils'
+import { ThumbnailModel } from './thumbnail'
+import { VideoModel } from './video'
+import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from './video-channel'
+
+@Table({
+  tableName: 'videoBlacklist',
+  indexes: [
     {
-      indexes: [
-        {
-          fields: [ 'videoId' ],
-          unique: true
-        }
-      ]
+      fields: [ 'videoId' ],
+      unique: true
     }
-  )
+  ]
+})
+export class VideoBlacklistModel extends Model {
 
-  const classMethods = [
-    associate,
+  @AllowNull(true)
+  @Is('VideoBlacklistReason', value => throwIfNotValid(value, isVideoBlacklistReasonValid, 'reason', true))
+  @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max))
+  reason: string
 
-    countTotal,
-    list,
-    listForApi,
-    loadById,
-    loadByVideoId
-  ]
-  const instanceMethods = [
-    toFormattedJSON
-  ]
-  addMethodsToModel(BlacklistedVideo, classMethods, instanceMethods)
+  @AllowNull(false)
+  @Column
+  unfederated: boolean
 
-  return BlacklistedVideo
-}
+  @AllowNull(false)
+  @Default(null)
+  @Is('VideoBlacklistType', value => throwIfNotValid(value, isVideoBlacklistTypeValid, 'type'))
+  @Column
+  type: VideoBlacklistType
 
-// ------------------------------ METHODS ------------------------------
+  @CreatedAt
+  createdAt: Date
 
-toFormattedJSON = function (this: BlacklistedVideoInstance) {
-  return {
-    id: this.id,
-    videoId: this.videoId,
-    createdAt: this.createdAt
-  }
-}
+  @UpdatedAt
+  updatedAt: Date
 
-// ------------------------------ STATICS ------------------------------
+  @ForeignKey(() => VideoModel)
+  @Column
+  videoId: number
 
-function associate (models) {
-  BlacklistedVideo.belongsTo(models.Video, {
+  @BelongsTo(() => VideoModel, {
     foreignKey: {
-      name: 'videoId',
       allowNull: false
     },
-    onDelete: 'CASCADE'
+    onDelete: 'cascade'
   })
-}
-
-countTotal = function () {
-  return BlacklistedVideo.count()
-}
+  Video: VideoModel
+
+  static listForApi (parameters: {
+    start: number
+    count: number
+    sort: SortType
+    search?: string
+    type?: VideoBlacklistType
+  }) {
+    const { start, count, sort, search, type } = parameters
+
+    function buildBaseQuery (): FindOptions {
+      return {
+        offset: start,
+        limit: count,
+        order: getBlacklistSort(sort.sortModel, sort.sortValue)
+      }
+    }
 
-list = function () {
-  return BlacklistedVideo.findAll()
-}
+    const countQuery = buildBaseQuery()
+
+    const findQuery = buildBaseQuery()
+    findQuery.include = [
+      {
+        model: VideoModel,
+        required: true,
+        where: searchAttribute(search, 'name'),
+        include: [
+          {
+            model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, { withAccount: true } as SummaryOptions ] }),
+            required: true
+          },
+          {
+            model: ThumbnailModel,
+            attributes: [ 'type', 'filename' ],
+            required: false
+          }
+        ]
+      }
+    ]
+
+    if (type) {
+      countQuery.where = { type }
+      findQuery.where = { type }
+    }
 
-listForApi = function (start: number, count: number, sort: string) {
-  const query = {
-    offset: start,
-    limit: count,
-    order: [ getSort(sort) ]
+    return Promise.all([
+      VideoBlacklistModel.count(countQuery),
+      VideoBlacklistModel.findAll(findQuery)
+    ]).then(([ count, rows ]) => {
+      return {
+        data: rows,
+        total: count
+      }
+    })
   }
 
-  return BlacklistedVideo.findAndCountAll(query).then(({ rows, count }) => {
-    return {
-      data: rows,
-      total: count
+  static loadByVideoId (id: number): Promise<MVideoBlacklist> {
+    const query = {
+      where: {
+        videoId: id
+      }
     }
-  })
-}
 
-loadById = function (id: number) {
-  return BlacklistedVideo.findById(id)
-}
+    return VideoBlacklistModel.findOne(query)
+  }
 
-loadByVideoId = function (id: number) {
-  const query = {
-    where: {
-      videoId: id
+  toFormattedJSON (this: MVideoBlacklistFormattable): VideoBlacklist {
+    return {
+      id: this.id,
+      createdAt: this.createdAt,
+      updatedAt: this.updatedAt,
+      reason: this.reason,
+      unfederated: this.unfederated,
+      type: this.type,
+
+      video: this.Video.toFormattedJSON()
     }
   }
-
-  return BlacklistedVideo.findOne(query)
 }