]>
Commit | Line | Data |
---|---|---|
d26836cd C |
1 | import { logger } from '@server/helpers/logger' |
2 | import { WEBSERVER } from '@server/initializers/constants' | |
3 | import { getAbuseTargetUrl } from '@server/lib/activitypub/url' | |
4 | import { UserModel } from '@server/models/user/user' | |
5 | import { UserNotificationModel } from '@server/models/user/user-notification' | |
6 | import { MAbuseFull, MUserDefault, MUserWithNotificationSetting, UserNotificationModelForApi } from '@server/types/models' | |
7 | import { UserAbuse, UserNotificationType, UserRight } from '@shared/models' | |
8 | import { AbstractNotification } from '../common/abstract-notification' | |
9 | ||
10 | export type NewAbusePayload = { abuse: UserAbuse, abuseInstance: MAbuseFull, reporter: string } | |
11 | ||
12 | export class NewAbuseForModerators extends AbstractNotification <NewAbusePayload> { | |
13 | private moderators: MUserDefault[] | |
14 | ||
15 | async prepare () { | |
16 | this.moderators = await UserModel.listWithRight(UserRight.MANAGE_ABUSES) | |
17 | } | |
18 | ||
19 | log () { | |
20 | logger.info('Notifying %s user/moderators of new abuse %s.', this.moderators.length, getAbuseTargetUrl(this.payload.abuseInstance)) | |
21 | } | |
22 | ||
23 | getSetting (user: MUserWithNotificationSetting) { | |
24 | return user.NotificationSetting.abuseAsModerator | |
25 | } | |
26 | ||
27 | getTargetUsers () { | |
28 | return this.moderators | |
29 | } | |
30 | ||
31 | async createNotification (user: MUserWithNotificationSetting) { | |
32 | const notification = await UserNotificationModel.create<UserNotificationModelForApi>({ | |
33 | type: UserNotificationType.NEW_ABUSE_FOR_MODERATORS, | |
34 | userId: user.id, | |
35 | abuseId: this.payload.abuseInstance.id | |
36 | }) | |
37 | notification.Abuse = this.payload.abuseInstance | |
38 | ||
39 | return notification | |
40 | } | |
41 | ||
42 | createEmail (to: string) { | |
43 | const abuseInstance = this.payload.abuseInstance | |
44 | ||
45 | if (abuseInstance.VideoAbuse) return this.createVideoAbuseEmail(to) | |
46 | if (abuseInstance.VideoCommentAbuse) return this.createCommentAbuseEmail(to) | |
47 | ||
48 | return this.createAccountAbuseEmail(to) | |
49 | } | |
50 | ||
51 | private createVideoAbuseEmail (to: string) { | |
52 | const video = this.payload.abuseInstance.VideoAbuse.Video | |
53 | const videoUrl = WEBSERVER.URL + video.getWatchStaticPath() | |
54 | ||
55 | return { | |
56 | template: 'video-abuse-new', | |
57 | to, | |
58 | subject: `New video abuse report from ${this.payload.reporter}`, | |
59 | locals: { | |
60 | videoUrl, | |
61 | isLocal: video.remote === false, | |
62 | videoCreatedAt: new Date(video.createdAt).toLocaleString(), | |
63 | videoPublishedAt: new Date(video.publishedAt).toLocaleString(), | |
64 | videoName: video.name, | |
65 | reason: this.payload.abuse.reason, | |
66 | videoChannel: this.payload.abuse.video.channel, | |
67 | reporter: this.payload.reporter, | |
68 | action: this.buildEmailAction() | |
69 | } | |
70 | } | |
71 | } | |
72 | ||
73 | private createCommentAbuseEmail (to: string) { | |
74 | const comment = this.payload.abuseInstance.VideoCommentAbuse.VideoComment | |
75 | const commentUrl = WEBSERVER.URL + comment.Video.getWatchStaticPath() + ';threadId=' + comment.getThreadId() | |
76 | ||
77 | return { | |
78 | template: 'video-comment-abuse-new', | |
79 | to, | |
80 | subject: `New comment abuse report from ${this.payload.reporter}`, | |
81 | locals: { | |
82 | commentUrl, | |
83 | videoName: comment.Video.name, | |
84 | isLocal: comment.isOwned(), | |
85 | commentCreatedAt: new Date(comment.createdAt).toLocaleString(), | |
86 | reason: this.payload.abuse.reason, | |
87 | flaggedAccount: this.payload.abuseInstance.FlaggedAccount.getDisplayName(), | |
88 | reporter: this.payload.reporter, | |
89 | action: this.buildEmailAction() | |
90 | } | |
91 | } | |
92 | } | |
93 | ||
94 | private createAccountAbuseEmail (to: string) { | |
95 | const account = this.payload.abuseInstance.FlaggedAccount | |
96 | const accountUrl = account.getClientUrl() | |
97 | ||
98 | return { | |
99 | template: 'account-abuse-new', | |
100 | to, | |
101 | subject: `New account abuse report from ${this.payload.reporter}`, | |
102 | locals: { | |
103 | accountUrl, | |
104 | accountDisplayName: account.getDisplayName(), | |
105 | isLocal: account.isOwned(), | |
106 | reason: this.payload.abuse.reason, | |
107 | reporter: this.payload.reporter, | |
108 | action: this.buildEmailAction() | |
109 | } | |
110 | } | |
111 | } | |
112 | ||
113 | private buildEmailAction () { | |
114 | return { | |
115 | text: 'View report #' + this.payload.abuseInstance.id, | |
116 | url: WEBSERVER.URL + '/admin/moderation/abuses/list?search=%23' + this.payload.abuseInstance.id | |
117 | } | |
118 | } | |
119 | } |