]>
Commit | Line | Data |
---|---|---|
d26836cd C |
1 | import { logger } from '@server/helpers/logger' |
2 | import { isBlockedByServerOrAccount } from '@server/lib/blocklist' | |
3 | import { UserModel } from '@server/models/user/user' | |
4 | import { UserNotificationModel } from '@server/models/user/user-notification' | |
5 | import { MActorFollowFull, MUserDefault, MUserWithNotificationSetting, UserNotificationModelForApi } from '@server/types/models' | |
6 | import { UserNotificationType } from '@shared/models' | |
7 | import { AbstractNotification } from '../common/abstract-notification' | |
8 | ||
9 | export class FollowForUser extends AbstractNotification <MActorFollowFull> { | |
10 | private followType: 'account' | 'channel' | |
11 | private user: MUserDefault | |
12 | ||
13 | async prepare () { | |
14 | // Account follows one of our account? | |
15 | this.followType = 'channel' | |
16 | this.user = await UserModel.loadByChannelActorId(this.actorFollow.ActorFollowing.id) | |
17 | ||
18 | // Account follows one of our channel? | |
19 | if (!this.user) { | |
20 | this.user = await UserModel.loadByAccountActorId(this.actorFollow.ActorFollowing.id) | |
21 | this.followType = 'account' | |
22 | } | |
23 | } | |
24 | ||
25 | async isDisabled () { | |
26 | if (this.payload.ActorFollowing.isOwned() === false) return true | |
27 | ||
28 | const followerAccount = this.actorFollow.ActorFollower.Account | |
29 | const followerAccountWithActor = Object.assign(followerAccount, { Actor: this.actorFollow.ActorFollower }) | |
30 | ||
31 | return isBlockedByServerOrAccount(followerAccountWithActor, this.user.Account) | |
32 | } | |
33 | ||
34 | log () { | |
35 | logger.info('Notifying user %s of new follower: %s.', this.user.username, this.actorFollow.ActorFollower.Account.getDisplayName()) | |
36 | } | |
37 | ||
38 | getSetting (user: MUserWithNotificationSetting) { | |
39 | return user.NotificationSetting.newFollow | |
40 | } | |
41 | ||
42 | getTargetUsers () { | |
43 | if (!this.user) return [] | |
44 | ||
45 | return [ this.user ] | |
46 | } | |
47 | ||
785f1897 C |
48 | createNotification (user: MUserWithNotificationSetting) { |
49 | const notification = UserNotificationModel.build<UserNotificationModelForApi>({ | |
d26836cd C |
50 | type: UserNotificationType.NEW_FOLLOW, |
51 | userId: user.id, | |
52 | actorFollowId: this.actorFollow.id | |
53 | }) | |
54 | notification.ActorFollow = this.actorFollow | |
55 | ||
56 | return notification | |
57 | } | |
58 | ||
98ab5dc8 | 59 | createEmail (to: string) { |
d26836cd C |
60 | const following = this.actorFollow.ActorFollowing |
61 | const follower = this.actorFollow.ActorFollower | |
62 | ||
63 | const followingName = (following.VideoChannel || following.Account).getDisplayName() | |
64 | ||
65 | return { | |
66 | template: 'follower-on-channel', | |
67 | to, | |
68 | subject: `New follower on your channel ${followingName}`, | |
69 | locals: { | |
70 | followerName: follower.Account.getDisplayName(), | |
71 | followerUrl: follower.url, | |
72 | followingName, | |
73 | followingUrl: following.url, | |
74 | followType: this.followType | |
75 | } | |
76 | } | |
77 | } | |
78 | ||
79 | private get actorFollow () { | |
80 | return this.payload | |
81 | } | |
82 | } |