]>
Commit | Line | Data |
---|---|---|
1 | import { Transaction } from 'sequelize' | |
2 | import { ActivityAudience } from '../../../shared/models/activitypub' | |
3 | import { ACTIVITY_PUB } from '../../initializers' | |
4 | import { ActorModel } from '../../models/activitypub/actor' | |
5 | import { VideoModel } from '../../models/video/video' | |
6 | import { VideoCommentModel } from '../../models/video/video-comment' | |
7 | import { VideoShareModel } from '../../models/video/video-share' | |
8 | ||
9 | function getRemoteVideoAudience (video: VideoModel, actorsInvolvedInVideo: ActorModel[]): ActivityAudience { | |
10 | return { | |
11 | to: [ video.VideoChannel.Account.Actor.url ], | |
12 | cc: actorsInvolvedInVideo.map(a => a.followersUrl) | |
13 | } | |
14 | } | |
15 | ||
16 | function getVideoCommentAudience ( | |
17 | videoComment: VideoCommentModel, | |
18 | threadParentComments: VideoCommentModel[], | |
19 | actorsInvolvedInVideo: ActorModel[], | |
20 | isOrigin = false | |
21 | ): ActivityAudience { | |
22 | const to = [ ACTIVITY_PUB.PUBLIC ] | |
23 | const cc: string[] = [] | |
24 | ||
25 | // Owner of the video we comment | |
26 | if (isOrigin === false) { | |
27 | cc.push(videoComment.Video.VideoChannel.Account.Actor.url) | |
28 | } | |
29 | ||
30 | // Followers of the poster | |
31 | cc.push(videoComment.Account.Actor.followersUrl) | |
32 | ||
33 | // Send to actors we reply to | |
34 | for (const parentComment of threadParentComments) { | |
35 | cc.push(parentComment.Account.Actor.url) | |
36 | } | |
37 | ||
38 | return { | |
39 | to, | |
40 | cc: cc.concat(actorsInvolvedInVideo.map(a => a.followersUrl)) | |
41 | } | |
42 | } | |
43 | ||
44 | function getAudienceFromFollowersOf (actorsInvolvedInObject: ActorModel[]): ActivityAudience { | |
45 | return { | |
46 | to: [ ACTIVITY_PUB.PUBLIC ].concat(actorsInvolvedInObject.map(a => a.followersUrl)), | |
47 | cc: [] | |
48 | } | |
49 | } | |
50 | ||
51 | async function getActorsInvolvedInVideo (video: VideoModel, t: Transaction) { | |
52 | const actors = await VideoShareModel.loadActorsByShare(video.id, t) | |
53 | ||
54 | const videoActor = video.VideoChannel && video.VideoChannel.Account | |
55 | ? video.VideoChannel.Account.Actor | |
56 | : await ActorModel.loadAccountActorByVideoId(video.id, t) | |
57 | ||
58 | actors.push(videoActor) | |
59 | ||
60 | return actors | |
61 | } | |
62 | ||
63 | function getAudience (actorSender: ActorModel, isPublic = true) { | |
64 | return buildAudience([ actorSender.followersUrl ], isPublic) | |
65 | } | |
66 | ||
67 | function buildAudience (followerUrls: string[], isPublic = true) { | |
68 | let to: string[] = [] | |
69 | let cc: string[] = [] | |
70 | ||
71 | if (isPublic) { | |
72 | to = [ ACTIVITY_PUB.PUBLIC ] | |
73 | cc = followerUrls | |
74 | } else { // Unlisted | |
75 | to = [] | |
76 | cc = [] | |
77 | } | |
78 | ||
79 | return { to, cc } | |
80 | } | |
81 | ||
82 | function audiencify<T> (object: T, audience: ActivityAudience) { | |
83 | return Object.assign(object, audience) | |
84 | } | |
85 | ||
86 | // --------------------------------------------------------------------------- | |
87 | ||
88 | export { | |
89 | buildAudience, | |
90 | getAudience, | |
91 | getRemoteVideoAudience, | |
92 | getActorsInvolvedInVideo, | |
93 | getAudienceFromFollowersOf, | |
94 | audiencify, | |
95 | getVideoCommentAudience | |
96 | } |