]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame_incremental - server/models/video/video-abuse.ts
Add outbox
[github/Chocobozzz/PeerTube.git] / server / models / video / video-abuse.ts
... / ...
CommitLineData
1import * as Sequelize from 'sequelize'
2
3import { CONFIG } from '../../initializers'
4import { isVideoAbuseReasonValid } from '../../helpers'
5
6import { addMethodsToModel, getSort } from '../utils'
7import {
8 VideoAbuseInstance,
9 VideoAbuseAttributes,
10
11 VideoAbuseMethods
12} from './video-abuse-interface'
13import { VideoAbuseObject } from '../../../shared/models/activitypub/objects/video-abuse-object'
14
15let VideoAbuse: Sequelize.Model<VideoAbuseInstance, VideoAbuseAttributes>
16let toFormattedJSON: VideoAbuseMethods.ToFormattedJSON
17let listForApi: VideoAbuseMethods.ListForApi
18let toActivityPubObject: VideoAbuseMethods.ToActivityPubObject
19
20export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
21 VideoAbuse = sequelize.define<VideoAbuseInstance, VideoAbuseAttributes>('VideoAbuse',
22 {
23 reason: {
24 type: DataTypes.STRING,
25 allowNull: false,
26 validate: {
27 reasonValid: value => {
28 const res = isVideoAbuseReasonValid(value)
29 if (res === false) throw new Error('Video abuse reason is not valid.')
30 }
31 }
32 }
33 },
34 {
35 indexes: [
36 {
37 fields: [ 'videoId' ]
38 },
39 {
40 fields: [ 'reporterAccountId' ]
41 }
42 ]
43 }
44 )
45
46 const classMethods = [
47 associate,
48
49 listForApi
50 ]
51 const instanceMethods = [
52 toFormattedJSON,
53 toActivityPubObject
54 ]
55 addMethodsToModel(VideoAbuse, classMethods, instanceMethods)
56
57 return VideoAbuse
58}
59
60// ------------------------------ METHODS ------------------------------
61
62toFormattedJSON = function (this: VideoAbuseInstance) {
63 let reporterServerHost
64
65 if (this.Account.Server) {
66 reporterServerHost = this.Account.Server.host
67 } else {
68 // It means it's our video
69 reporterServerHost = CONFIG.WEBSERVER.HOST
70 }
71
72 const json = {
73 id: this.id,
74 reason: this.reason,
75 reporterUsername: this.Account.name,
76 reporterServerHost,
77 videoId: this.Video.id,
78 videoUUID: this.Video.uuid,
79 videoName: this.Video.name,
80 createdAt: this.createdAt
81 }
82
83 return json
84}
85
86toActivityPubObject = function (this: VideoAbuseInstance) {
87 const videoAbuseObject: VideoAbuseObject = {
88 type: 'Flag' as 'Flag',
89 content: this.reason,
90 object: this.Video.url
91 }
92
93 return videoAbuseObject
94}
95
96// ------------------------------ STATICS ------------------------------
97
98function associate (models) {
99 VideoAbuse.belongsTo(models.Account, {
100 foreignKey: {
101 name: 'reporterAccountId',
102 allowNull: true
103 },
104 onDelete: 'CASCADE'
105 })
106
107 VideoAbuse.belongsTo(models.Video, {
108 foreignKey: {
109 name: 'videoId',
110 allowNull: false
111 },
112 onDelete: 'CASCADE'
113 })
114}
115
116listForApi = function (start: number, count: number, sort: string) {
117 const query = {
118 offset: start,
119 limit: count,
120 order: [ getSort(sort) ],
121 include: [
122 {
123 model: VideoAbuse['sequelize'].models.Account,
124 required: true,
125 include: [
126 {
127 model: VideoAbuse['sequelize'].models.Server,
128 required: false
129 }
130 ]
131 },
132 {
133 model: VideoAbuse['sequelize'].models.Video,
134 required: true
135 }
136 ]
137 }
138
139 return VideoAbuse.findAndCountAll(query).then(({ rows, count }) => {
140 return { total: count, data: rows }
141 })
142}