]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/controllers/api/abuse.ts
Add abuse messages management in my account
[github/Chocobozzz/PeerTube.git] / server / controllers / api / abuse.ts
CommitLineData
d95d1559
C
1import * as express from 'express'
2import { createAccountAbuse, createVideoAbuse, createVideoCommentAbuse } from '@server/lib/moderation'
3import { AbuseModel } from '@server/models/abuse/abuse'
edbc9325 4import { AbuseMessageModel } from '@server/models/abuse/abuse-message'
d95d1559
C
5import { getServerActor } from '@server/models/application/application'
6import { AbuseCreate, abusePredefinedReasonsMap, AbuseState, UserRight } from '../../../shared'
7import { getFormattedObjects } from '../../helpers/utils'
8import { sequelizeTypescript } from '../../initializers/database'
9import {
10 abuseGetValidator,
edbc9325 11 abuseListForAdminsValidator,
d95d1559
C
12 abuseReportValidator,
13 abusesSortValidator,
14 abuseUpdateValidator,
edbc9325 15 addAbuseMessageValidator,
d95d1559
C
16 asyncMiddleware,
17 asyncRetryTransactionMiddleware,
18 authenticate,
94148c90 19 checkAbuseValidForMessagesValidator,
edbc9325 20 deleteAbuseMessageValidator,
d95d1559 21 ensureUserHasRight,
edbc9325 22 getAbuseValidator,
d95d1559
C
23 paginationValidator,
24 setDefaultPagination,
25 setDefaultSort
26} from '../../middlewares'
27import { AccountModel } from '../../models/account/account'
28
29const abuseRouter = express.Router()
30
57f6896f 31abuseRouter.get('/',
d95d1559
C
32 authenticate,
33 ensureUserHasRight(UserRight.MANAGE_ABUSES),
34 paginationValidator,
35 abusesSortValidator,
36 setDefaultSort,
37 setDefaultPagination,
edbc9325
C
38 abuseListForAdminsValidator,
39 asyncMiddleware(listAbusesForAdmins)
d95d1559 40)
57f6896f 41abuseRouter.put('/:id',
d95d1559
C
42 authenticate,
43 ensureUserHasRight(UserRight.MANAGE_ABUSES),
44 asyncMiddleware(abuseUpdateValidator),
45 asyncRetryTransactionMiddleware(updateAbuse)
46)
57f6896f 47abuseRouter.post('/',
d95d1559
C
48 authenticate,
49 asyncMiddleware(abuseReportValidator),
50 asyncRetryTransactionMiddleware(reportAbuse)
51)
57f6896f 52abuseRouter.delete('/:id',
d95d1559
C
53 authenticate,
54 ensureUserHasRight(UserRight.MANAGE_ABUSES),
55 asyncMiddleware(abuseGetValidator),
56 asyncRetryTransactionMiddleware(deleteAbuse)
57)
58
edbc9325
C
59abuseRouter.get('/:id/messages',
60 authenticate,
61 asyncMiddleware(getAbuseValidator),
94148c90 62 checkAbuseValidForMessagesValidator,
edbc9325
C
63 asyncRetryTransactionMiddleware(listAbuseMessages)
64)
65
66abuseRouter.post('/:id/messages',
67 authenticate,
68 asyncMiddleware(getAbuseValidator),
94148c90 69 checkAbuseValidForMessagesValidator,
edbc9325
C
70 addAbuseMessageValidator,
71 asyncRetryTransactionMiddleware(addAbuseMessage)
72)
73
74abuseRouter.delete('/:id/messages/:messageId',
75 authenticate,
76 asyncMiddleware(getAbuseValidator),
94148c90 77 checkAbuseValidForMessagesValidator,
edbc9325
C
78 asyncMiddleware(deleteAbuseMessageValidator),
79 asyncRetryTransactionMiddleware(deleteAbuseMessage)
80)
81
d95d1559
C
82// ---------------------------------------------------------------------------
83
84export {
85 abuseRouter,
86
87 // FIXME: deprecated in 2.3. Remove these exports
edbc9325 88 listAbusesForAdmins,
d95d1559
C
89 updateAbuse,
90 deleteAbuse,
91 reportAbuse
92}
93
94// ---------------------------------------------------------------------------
95
edbc9325 96async function listAbusesForAdmins (req: express.Request, res: express.Response) {
d95d1559
C
97 const user = res.locals.oauth.token.user
98 const serverActor = await getServerActor()
99
edbc9325 100 const resultList = await AbuseModel.listForAdminApi({
d95d1559
C
101 start: req.query.start,
102 count: req.query.count,
103 sort: req.query.sort,
104 id: req.query.id,
57f6896f 105 filter: req.query.filter,
d95d1559
C
106 predefinedReason: req.query.predefinedReason,
107 search: req.query.search,
108 state: req.query.state,
109 videoIs: req.query.videoIs,
110 searchReporter: req.query.searchReporter,
111 searchReportee: req.query.searchReportee,
112 searchVideo: req.query.searchVideo,
113 searchVideoChannel: req.query.searchVideoChannel,
114 serverAccountId: serverActor.Account.id,
115 user
116 })
117
edbc9325
C
118 return res.json({
119 total: resultList.total,
120 data: resultList.data.map(d => d.toFormattedAdminJSON())
121 })
d95d1559
C
122}
123
124async function updateAbuse (req: express.Request, res: express.Response) {
125 const abuse = res.locals.abuse
126
127 if (req.body.moderationComment !== undefined) abuse.moderationComment = req.body.moderationComment
128 if (req.body.state !== undefined) abuse.state = req.body.state
129
130 await sequelizeTypescript.transaction(t => {
131 return abuse.save({ transaction: t })
132 })
133
edbc9325
C
134 // TODO: Notification
135
310b5219 136 // Do not send the delete to other instances, we updated OUR copy of this abuse
d95d1559
C
137
138 return res.type('json').status(204).end()
139}
140
141async function deleteAbuse (req: express.Request, res: express.Response) {
142 const abuse = res.locals.abuse
143
144 await sequelizeTypescript.transaction(t => {
145 return abuse.destroy({ transaction: t })
146 })
147
310b5219 148 // Do not send the delete to other instances, we delete OUR copy of this abuse
d95d1559
C
149
150 return res.type('json').status(204).end()
151}
152
153async function reportAbuse (req: express.Request, res: express.Response) {
154 const videoInstance = res.locals.videoAll
155 const commentInstance = res.locals.videoCommentFull
156 const accountInstance = res.locals.account
157
158 const body: AbuseCreate = req.body
159
160 const { id } = await sequelizeTypescript.transaction(async t => {
161 const reporterAccount = await AccountModel.load(res.locals.oauth.token.User.Account.id, t)
162 const predefinedReasons = body.predefinedReasons?.map(r => abusePredefinedReasonsMap[r])
163
164 const baseAbuse = {
165 reporterAccountId: reporterAccount.id,
166 reason: body.reason,
167 state: AbuseState.PENDING,
168 predefinedReasons
169 }
170
171 if (body.video) {
172 return createVideoAbuse({
173 baseAbuse,
174 videoInstance,
175 reporterAccount,
176 transaction: t,
177 startAt: body.video.startAt,
178 endAt: body.video.endAt
179 })
180 }
181
182 if (body.comment) {
183 return createVideoCommentAbuse({
184 baseAbuse,
185 commentInstance,
186 reporterAccount,
187 transaction: t
188 })
189 }
190
191 // Account report
192 return createAccountAbuse({
193 baseAbuse,
194 accountInstance,
195 reporterAccount,
196 transaction: t
197 })
198 })
199
200 return res.json({ abuse: { id } })
201}
edbc9325
C
202
203async function listAbuseMessages (req: express.Request, res: express.Response) {
204 const abuse = res.locals.abuse
205
206 const resultList = await AbuseMessageModel.listForApi(abuse.id)
207
208 return res.json(getFormattedObjects(resultList.data, resultList.total))
209}
210
211async function addAbuseMessage (req: express.Request, res: express.Response) {
212 const abuse = res.locals.abuse
213 const user = res.locals.oauth.token.user
214
215 const abuseMessage = await AbuseMessageModel.create({
216 message: req.body.message,
217 byModerator: abuse.reporterAccountId !== user.Account.id,
218 accountId: user.Account.id,
219 abuseId: abuse.id
220 })
221
222 // TODO: Notification
223
224 return res.json({
225 abuseMessage: {
226 id: abuseMessage.id
227 }
228 })
229}
230
231async function deleteAbuseMessage (req: express.Request, res: express.Response) {
232 const abuseMessage = res.locals.abuseMessage
233
234 await sequelizeTypescript.transaction(t => {
235 return abuseMessage.destroy({ transaction: t })
236 })
237
238 return res.sendStatus(204)
239}