Use global uuid instead of remoteId for videos
[oweals/peertube.git] / server / models / video / video-abuse.ts
1 import * as Sequelize from 'sequelize'
2
3 import { CONFIG } from '../../initializers'
4 import { isVideoAbuseReporterUsernameValid, isVideoAbuseReasonValid } from '../../helpers'
5
6 import { addMethodsToModel, getSort } from '../utils'
7 import {
8   VideoAbuseInstance,
9   VideoAbuseAttributes,
10
11   VideoAbuseMethods
12 } from './video-abuse-interface'
13
14 let VideoAbuse: Sequelize.Model<VideoAbuseInstance, VideoAbuseAttributes>
15 let toFormatedJSON: VideoAbuseMethods.ToFormatedJSON
16 let listForApi: VideoAbuseMethods.ListForApi
17
18 export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
19   VideoAbuse = sequelize.define<VideoAbuseInstance, VideoAbuseAttributes>('VideoAbuse',
20     {
21       reporterUsername: {
22         type: DataTypes.STRING,
23         allowNull: false,
24         validate: {
25           reporterUsernameValid: function (value) {
26             const res = isVideoAbuseReporterUsernameValid(value)
27             if (res === false) throw new Error('Video abuse reporter username is not valid.')
28           }
29         }
30       },
31       reason: {
32         type: DataTypes.STRING,
33         allowNull: false,
34         validate: {
35           reasonValid: function (value) {
36             const res = isVideoAbuseReasonValid(value)
37             if (res === false) throw new Error('Video abuse reason is not valid.')
38           }
39         }
40       }
41     },
42     {
43       indexes: [
44         {
45           fields: [ 'videoId' ]
46         },
47         {
48           fields: [ 'reporterPodId' ]
49         }
50       ]
51     }
52   )
53
54   const classMethods = [
55     associate,
56
57     listForApi
58   ]
59   const instanceMethods = [
60     toFormatedJSON
61   ]
62   addMethodsToModel(VideoAbuse, classMethods, instanceMethods)
63
64   return VideoAbuse
65 }
66
67 // ------------------------------ METHODS ------------------------------
68
69 toFormatedJSON = function (this: VideoAbuseInstance) {
70   let reporterPodHost
71
72   if (this.Pod) {
73     reporterPodHost = this.Pod.host
74   } else {
75     // It means it's our video
76     reporterPodHost = CONFIG.WEBSERVER.HOST
77   }
78
79   const json = {
80     id: this.id,
81     reporterPodHost,
82     reason: this.reason,
83     reporterUsername: this.reporterUsername,
84     videoId: this.videoId,
85     createdAt: this.createdAt
86   }
87
88   return json
89 }
90
91 // ------------------------------ STATICS ------------------------------
92
93 function associate (models) {
94   VideoAbuse.belongsTo(models.Pod, {
95     foreignKey: {
96       name: 'reporterPodId',
97       allowNull: true
98     },
99     onDelete: 'CASCADE'
100   })
101
102   VideoAbuse.belongsTo(models.Video, {
103     foreignKey: {
104       name: 'videoId',
105       allowNull: false
106     },
107     onDelete: 'CASCADE'
108   })
109 }
110
111 listForApi = function (start: number, count: number, sort: string) {
112   const query = {
113     offset: start,
114     limit: count,
115     order: [ getSort(sort) ],
116     include: [
117       {
118         model: VideoAbuse['sequelize'].models.Pod,
119         required: false
120       }
121     ]
122   }
123
124   return VideoAbuse.findAndCountAll(query).then(({ rows, count }) => {
125     return { total: count, data: rows }
126   })
127 }