2018-05-25 11:32:36 +02:00
|
|
|
import { Transaction } from 'sequelize'
|
|
|
|
import { ActivityAudience } from '../../../shared/models/activitypub'
|
2019-04-11 14:26:41 +02:00
|
|
|
import { ACTIVITY_PUB } from '../../initializers/constants'
|
2018-05-25 11:32:36 +02:00
|
|
|
import { ActorModel } from '../../models/activitypub/actor'
|
|
|
|
import { VideoModel } from '../../models/video/video'
|
|
|
|
import { VideoShareModel } from '../../models/video/video-share'
|
2020-02-04 16:14:33 +01:00
|
|
|
import { MActorFollowersUrl, MActorLight, MActorUrl, MCommentOwner, MCommentOwnerVideo, MVideoId } from '../../typings/models'
|
2018-05-25 11:32:36 +02:00
|
|
|
|
2020-02-04 16:14:33 +01:00
|
|
|
function getRemoteVideoAudience (accountActor: MActorUrl, actorsInvolvedInVideo: MActorFollowersUrl[]): ActivityAudience {
|
2018-05-25 11:32:36 +02:00
|
|
|
return {
|
2020-02-04 16:14:33 +01:00
|
|
|
to: [ accountActor.url ],
|
2018-05-25 11:32:36 +02:00
|
|
|
cc: actorsInvolvedInVideo.map(a => a.followersUrl)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getVideoCommentAudience (
|
2019-08-15 11:53:26 +02:00
|
|
|
videoComment: MCommentOwnerVideo,
|
|
|
|
threadParentComments: MCommentOwner[],
|
|
|
|
actorsInvolvedInVideo: MActorFollowersUrl[],
|
2018-05-25 11:32:36 +02:00
|
|
|
isOrigin = false
|
2018-09-14 16:51:35 +02:00
|
|
|
): ActivityAudience {
|
2018-05-25 11:32:36 +02:00
|
|
|
const to = [ ACTIVITY_PUB.PUBLIC ]
|
2018-07-25 22:01:25 +02:00
|
|
|
const cc: string[] = []
|
2018-05-25 11:32:36 +02:00
|
|
|
|
|
|
|
// Owner of the video we comment
|
|
|
|
if (isOrigin === false) {
|
|
|
|
cc.push(videoComment.Video.VideoChannel.Account.Actor.url)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Followers of the poster
|
|
|
|
cc.push(videoComment.Account.Actor.followersUrl)
|
|
|
|
|
|
|
|
// Send to actors we reply to
|
|
|
|
for (const parentComment of threadParentComments) {
|
2020-03-20 14:43:12 +01:00
|
|
|
if (parentComment.isDeleted()) continue
|
|
|
|
|
2018-05-25 11:32:36 +02:00
|
|
|
cc.push(parentComment.Account.Actor.url)
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
to,
|
|
|
|
cc: cc.concat(actorsInvolvedInVideo.map(a => a.followersUrl))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-15 11:53:26 +02:00
|
|
|
function getAudienceFromFollowersOf (actorsInvolvedInObject: MActorFollowersUrl[]): ActivityAudience {
|
2018-05-25 11:32:36 +02:00
|
|
|
return {
|
|
|
|
to: [ ACTIVITY_PUB.PUBLIC ].concat(actorsInvolvedInObject.map(a => a.followersUrl)),
|
|
|
|
cc: []
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-04 15:45:41 +01:00
|
|
|
async function getActorsInvolvedInVideo (video: MVideoId, t: Transaction) {
|
2019-08-15 11:53:26 +02:00
|
|
|
const actors: MActorLight[] = await VideoShareModel.loadActorsByShare(video.id, t)
|
2018-09-24 13:07:33 +02:00
|
|
|
|
2019-08-15 11:53:26 +02:00
|
|
|
const videoAll = video as VideoModel
|
|
|
|
|
|
|
|
const videoActor = videoAll.VideoChannel && videoAll.VideoChannel.Account
|
|
|
|
? videoAll.VideoChannel.Account.Actor
|
|
|
|
: await ActorModel.loadFromAccountByVideoId(video.id, t)
|
2018-09-24 13:07:33 +02:00
|
|
|
|
|
|
|
actors.push(videoActor)
|
2018-05-25 11:32:36 +02:00
|
|
|
|
|
|
|
return actors
|
|
|
|
}
|
|
|
|
|
2019-08-15 11:53:26 +02:00
|
|
|
function getAudience (actorSender: MActorFollowersUrl, isPublic = true) {
|
2018-05-25 11:32:36 +02:00
|
|
|
return buildAudience([ actorSender.followersUrl ], isPublic)
|
|
|
|
}
|
|
|
|
|
2018-05-28 12:13:00 +02:00
|
|
|
function buildAudience (followerUrls: string[], isPublic = true) {
|
2018-07-25 22:01:25 +02:00
|
|
|
let to: string[] = []
|
|
|
|
let cc: string[] = []
|
2018-05-25 11:32:36 +02:00
|
|
|
|
|
|
|
if (isPublic) {
|
|
|
|
to = [ ACTIVITY_PUB.PUBLIC ]
|
2018-05-28 12:13:00 +02:00
|
|
|
cc = followerUrls
|
2018-05-25 11:32:36 +02:00
|
|
|
} else { // Unlisted
|
2018-06-12 20:04:58 +02:00
|
|
|
to = []
|
|
|
|
cc = []
|
2018-05-25 11:32:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return { to, cc }
|
|
|
|
}
|
|
|
|
|
2018-06-12 20:04:58 +02:00
|
|
|
function audiencify<T> (object: T, audience: ActivityAudience) {
|
2018-05-25 11:32:36 +02:00
|
|
|
return Object.assign(object, audience)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
export {
|
|
|
|
buildAudience,
|
|
|
|
getAudience,
|
2018-09-14 16:51:35 +02:00
|
|
|
getRemoteVideoAudience,
|
2018-05-25 11:32:36 +02:00
|
|
|
getActorsInvolvedInVideo,
|
2018-09-14 16:51:35 +02:00
|
|
|
getAudienceFromFollowersOf,
|
2018-05-25 11:32:36 +02:00
|
|
|
audiencify,
|
|
|
|
getVideoCommentAudience
|
|
|
|
}
|