Split files in activitypub server
This commit is contained in:
parent
16f29007dc
commit
e251f170b0
server
controllers/activitypub
lib/activitypub
|
@ -5,7 +5,7 @@ import { activityPubCollectionPagination, activityPubContextify } from '../../he
|
||||||
import { pageToStartAndCount } from '../../helpers/core-utils'
|
import { pageToStartAndCount } from '../../helpers/core-utils'
|
||||||
import { ACTIVITY_PUB, CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers'
|
import { ACTIVITY_PUB, CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers'
|
||||||
import { buildVideoAnnounce } from '../../lib/activitypub/send'
|
import { buildVideoAnnounce } from '../../lib/activitypub/send'
|
||||||
import { audiencify, getAudience } from '../../lib/activitypub/send/misc'
|
import { audiencify, getAudience } from '../../lib/activitypub/audience'
|
||||||
import { createActivityData } from '../../lib/activitypub/send/send-create'
|
import { createActivityData } from '../../lib/activitypub/send/send-create'
|
||||||
import { asyncMiddleware, executeIfActivityPub, localAccountValidator } from '../../middlewares'
|
import { asyncMiddleware, executeIfActivityPub, localAccountValidator } from '../../middlewares'
|
||||||
import { videoChannelsGetValidator, videosGetValidator, videosShareValidator } from '../../middlewares/validators'
|
import { videoChannelsGetValidator, videosGetValidator, videosShareValidator } from '../../middlewares/validators'
|
||||||
|
|
|
@ -6,7 +6,7 @@ import { pageToStartAndCount } from '../../helpers/core-utils'
|
||||||
import { logger } from '../../helpers/logger'
|
import { logger } from '../../helpers/logger'
|
||||||
import { ACTIVITY_PUB } from '../../initializers/constants'
|
import { ACTIVITY_PUB } from '../../initializers/constants'
|
||||||
import { announceActivityData, createActivityData } from '../../lib/activitypub/send'
|
import { announceActivityData, createActivityData } from '../../lib/activitypub/send'
|
||||||
import { buildAudience } from '../../lib/activitypub/send/misc'
|
import { buildAudience } from '../../lib/activitypub/audience'
|
||||||
import { asyncMiddleware, localAccountValidator } from '../../middlewares'
|
import { asyncMiddleware, localAccountValidator } from '../../middlewares'
|
||||||
import { AccountModel } from '../../models/account/account'
|
import { AccountModel } from '../../models/account/account'
|
||||||
import { ActorModel } from '../../models/activitypub/actor'
|
import { ActorModel } from '../../models/activitypub/actor'
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
import { Transaction } from 'sequelize'
|
||||||
|
import { ActivityAudience } from '../../../shared/models/activitypub'
|
||||||
|
import { ACTIVITY_PUB } from '../../initializers'
|
||||||
|
import { ActorModel } from '../../models/activitypub/actor'
|
||||||
|
import { VideoModel } from '../../models/video/video'
|
||||||
|
import { VideoCommentModel } from '../../models/video/video-comment'
|
||||||
|
import { VideoShareModel } from '../../models/video/video-share'
|
||||||
|
|
||||||
|
function getVideoAudience (video: VideoModel, actorsInvolvedInVideo: ActorModel[]) {
|
||||||
|
return {
|
||||||
|
to: [ video.VideoChannel.Account.Actor.url ],
|
||||||
|
cc: actorsInvolvedInVideo.map(a => a.followersUrl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getVideoCommentAudience (
|
||||||
|
videoComment: VideoCommentModel,
|
||||||
|
threadParentComments: VideoCommentModel[],
|
||||||
|
actorsInvolvedInVideo: ActorModel[],
|
||||||
|
isOrigin = false
|
||||||
|
) {
|
||||||
|
const to = [ ACTIVITY_PUB.PUBLIC ]
|
||||||
|
const cc = [ ]
|
||||||
|
|
||||||
|
// 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) {
|
||||||
|
cc.push(parentComment.Account.Actor.url)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
to,
|
||||||
|
cc: cc.concat(actorsInvolvedInVideo.map(a => a.followersUrl))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getObjectFollowersAudience (actorsInvolvedInObject: ActorModel[]) {
|
||||||
|
return {
|
||||||
|
to: [ ACTIVITY_PUB.PUBLIC ].concat(actorsInvolvedInObject.map(a => a.followersUrl)),
|
||||||
|
cc: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getActorsInvolvedInVideo (video: VideoModel, t: Transaction) {
|
||||||
|
const actors = await VideoShareModel.loadActorsByShare(video.id, t)
|
||||||
|
actors.push(video.VideoChannel.Account.Actor)
|
||||||
|
|
||||||
|
return actors
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getAudience (actorSender: ActorModel, t: Transaction, isPublic = true) {
|
||||||
|
return buildAudience([ actorSender.followersUrl ], isPublic)
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildAudience (followerInboxUrls: string[], isPublic = true) {
|
||||||
|
// Thanks Mastodon: https://github.com/tootsuite/mastodon/blob/master/app/lib/activitypub/tag_manager.rb#L47
|
||||||
|
let to = []
|
||||||
|
let cc = []
|
||||||
|
|
||||||
|
if (isPublic) {
|
||||||
|
to = [ ACTIVITY_PUB.PUBLIC ]
|
||||||
|
cc = followerInboxUrls
|
||||||
|
} else { // Unlisted
|
||||||
|
to = [ ]
|
||||||
|
cc = [ ]
|
||||||
|
}
|
||||||
|
|
||||||
|
return { to, cc }
|
||||||
|
}
|
||||||
|
|
||||||
|
function audiencify <T> (object: T, audience: ActivityAudience) {
|
||||||
|
return Object.assign(object, audience)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export {
|
||||||
|
buildAudience,
|
||||||
|
getAudience,
|
||||||
|
getVideoAudience,
|
||||||
|
getActorsInvolvedInVideo,
|
||||||
|
getObjectFollowersAudience,
|
||||||
|
audiencify,
|
||||||
|
getVideoCommentAudience
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
export * from './process'
|
export * from './process'
|
||||||
export * from './send'
|
export * from './send'
|
||||||
export * from './actor'
|
export * from './actor'
|
||||||
export * from './fetch'
|
|
||||||
export * from './share'
|
export * from './share'
|
||||||
export * from './videos'
|
export * from './videos'
|
||||||
export * from './video-comments'
|
export * from './video-comments'
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { VideoModel } from '../../../models/video/video'
|
import { VideoModel } from '../../../models/video/video'
|
||||||
import { VideoShareModel } from '../../../models/video/video-share'
|
import { VideoShareModel } from '../../../models/video/video-share'
|
||||||
import { getOrCreateActorAndServerAndModel } from '../actor'
|
import { getOrCreateActorAndServerAndModel } from '../actor'
|
||||||
import { forwardActivity } from '../send/misc'
|
import { forwardActivity } from '../send/utils'
|
||||||
import { getOrCreateAccountAndVideoAndChannel } from '../videos'
|
import { getOrCreateAccountAndVideoAndChannel } from '../videos'
|
||||||
|
|
||||||
async function processAnnounceActivity (activity: ActivityAnnounce) {
|
async function processAnnounceActivity (activity: ActivityAnnounce) {
|
||||||
|
|
|
@ -9,9 +9,10 @@ import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { VideoAbuseModel } from '../../../models/video/video-abuse'
|
import { VideoAbuseModel } from '../../../models/video/video-abuse'
|
||||||
import { VideoCommentModel } from '../../../models/video/video-comment'
|
import { VideoCommentModel } from '../../../models/video/video-comment'
|
||||||
import { getOrCreateActorAndServerAndModel } from '../actor'
|
import { getOrCreateActorAndServerAndModel } from '../actor'
|
||||||
import { forwardActivity, getActorsInvolvedInVideo } from '../send/misc'
|
import { getActorsInvolvedInVideo } from '../audience'
|
||||||
import { resolveThread } from '../video-comments'
|
import { resolveThread } from '../video-comments'
|
||||||
import { getOrCreateAccountAndVideoAndChannel } from '../videos'
|
import { getOrCreateAccountAndVideoAndChannel } from '../videos'
|
||||||
|
import { forwardActivity } from '../send/utils'
|
||||||
|
|
||||||
async function processCreateActivity (activity: ActivityCreate) {
|
async function processCreateActivity (activity: ActivityCreate) {
|
||||||
const activityObject = activity.object
|
const activityObject = activity.object
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { VideoModel } from '../../../models/video/video'
|
||||||
import { VideoChannelModel } from '../../../models/video/video-channel'
|
import { VideoChannelModel } from '../../../models/video/video-channel'
|
||||||
import { VideoCommentModel } from '../../../models/video/video-comment'
|
import { VideoCommentModel } from '../../../models/video/video-comment'
|
||||||
import { getOrCreateActorAndServerAndModel } from '../actor'
|
import { getOrCreateActorAndServerAndModel } from '../actor'
|
||||||
import { forwardActivity } from '../send/misc'
|
import { forwardActivity } from '../send/utils'
|
||||||
|
|
||||||
async function processDeleteActivity (activity: ActivityDelete) {
|
async function processDeleteActivity (activity: ActivityDelete) {
|
||||||
const objectUrl = typeof activity.object === 'string' ? activity.object : activity.object.id
|
const objectUrl = typeof activity.object === 'string' ? activity.object : activity.object.id
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { sequelizeTypescript } from '../../../initializers'
|
||||||
import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
|
import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
|
||||||
import { ActorModel } from '../../../models/activitypub/actor'
|
import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { getOrCreateActorAndServerAndModel } from '../actor'
|
import { getOrCreateActorAndServerAndModel } from '../actor'
|
||||||
import { forwardActivity } from '../send/misc'
|
import { forwardActivity } from '../send/utils'
|
||||||
import { getOrCreateAccountAndVideoAndChannel } from '../videos'
|
import { getOrCreateAccountAndVideoAndChannel } from '../videos'
|
||||||
|
|
||||||
async function processLikeActivity (activity: ActivityLike) {
|
async function processLikeActivity (activity: ActivityLike) {
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { AccountModel } from '../../../models/account/account'
|
||||||
import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
|
import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
|
||||||
import { ActorModel } from '../../../models/activitypub/actor'
|
import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
||||||
import { forwardActivity } from '../send/misc'
|
import { forwardActivity } from '../send/utils'
|
||||||
import { getOrCreateAccountAndVideoAndChannel } from '../videos'
|
import { getOrCreateAccountAndVideoAndChannel } from '../videos'
|
||||||
import { VideoShareModel } from '../../../models/video/video-share'
|
import { VideoShareModel } from '../../../models/video/video-share'
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,8 @@ import { VideoFileModel } from '../../../models/video/video-file'
|
||||||
import { fetchAvatarIfExists, getOrCreateActorAndServerAndModel, updateActorAvatarInstance, updateActorInstance } from '../actor'
|
import { fetchAvatarIfExists, getOrCreateActorAndServerAndModel, updateActorAvatarInstance, updateActorInstance } from '../actor'
|
||||||
import {
|
import {
|
||||||
generateThumbnailFromUrl,
|
generateThumbnailFromUrl,
|
||||||
getOrCreateAccountAndVideoAndChannel, getOrCreateVideoChannel,
|
getOrCreateAccountAndVideoAndChannel,
|
||||||
|
getOrCreateVideoChannel,
|
||||||
videoActivityObjectToDBAttributes,
|
videoActivityObjectToDBAttributes,
|
||||||
videoFileActivityUrlToDBAttributes
|
videoFileActivityUrlToDBAttributes
|
||||||
} from '../videos'
|
} from '../videos'
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { ActivityAccept, ActivityFollow } from '../../../../shared/models/activi
|
||||||
import { ActorModel } from '../../../models/activitypub/actor'
|
import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
||||||
import { getActorFollowAcceptActivityPubUrl, getActorFollowActivityPubUrl } from '../url'
|
import { getActorFollowAcceptActivityPubUrl, getActorFollowActivityPubUrl } from '../url'
|
||||||
import { unicastTo } from './misc'
|
import { unicastTo } from './utils'
|
||||||
import { followActivityData } from './send-follow'
|
import { followActivityData } from './send-follow'
|
||||||
|
|
||||||
async function sendAccept (actorFollow: ActorFollowModel) {
|
async function sendAccept (actorFollow: ActorFollowModel) {
|
||||||
|
|
|
@ -3,7 +3,8 @@ import { ActivityAnnounce, ActivityAudience } from '../../../../shared/models/ac
|
||||||
import { ActorModel } from '../../../models/activitypub/actor'
|
import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { VideoModel } from '../../../models/video/video'
|
import { VideoModel } from '../../../models/video/video'
|
||||||
import { VideoShareModel } from '../../../models/video/video-share'
|
import { VideoShareModel } from '../../../models/video/video-share'
|
||||||
import { broadcastToFollowers, getActorsInvolvedInVideo, getAudience, getObjectFollowersAudience } from './misc'
|
import { broadcastToFollowers } from './utils'
|
||||||
|
import { getActorsInvolvedInVideo, getAudience, getObjectFollowersAudience } from '../audience'
|
||||||
|
|
||||||
async function buildVideoAnnounce (byActor: ActorModel, videoShare: VideoShareModel, video: VideoModel, t: Transaction) {
|
async function buildVideoAnnounce (byActor: ActorModel, videoShare: VideoShareModel, video: VideoModel, t: Transaction) {
|
||||||
const announcedObject = video.url
|
const announcedObject = video.url
|
||||||
|
|
|
@ -7,17 +7,15 @@ import { VideoModel } from '../../../models/video/video'
|
||||||
import { VideoAbuseModel } from '../../../models/video/video-abuse'
|
import { VideoAbuseModel } from '../../../models/video/video-abuse'
|
||||||
import { VideoCommentModel } from '../../../models/video/video-comment'
|
import { VideoCommentModel } from '../../../models/video/video-comment'
|
||||||
import { getVideoAbuseActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoViewActivityPubUrl } from '../url'
|
import { getVideoAbuseActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoViewActivityPubUrl } from '../url'
|
||||||
|
import { broadcastToActors, broadcastToFollowers, unicastTo } from './utils'
|
||||||
import {
|
import {
|
||||||
audiencify,
|
audiencify,
|
||||||
broadcastToActors,
|
|
||||||
broadcastToFollowers,
|
|
||||||
getActorsInvolvedInVideo,
|
getActorsInvolvedInVideo,
|
||||||
getAudience,
|
getAudience,
|
||||||
getObjectFollowersAudience,
|
getObjectFollowersAudience,
|
||||||
getOriginVideoAudience,
|
getVideoAudience,
|
||||||
getVideoCommentAudience,
|
getVideoCommentAudience
|
||||||
unicastTo
|
} from '../audience'
|
||||||
} from './misc'
|
|
||||||
|
|
||||||
async function sendCreateVideo (video: VideoModel, t: Transaction) {
|
async function sendCreateVideo (video: VideoModel, t: Transaction) {
|
||||||
if (video.privacy === VideoPrivacy.PRIVATE) return undefined
|
if (video.privacy === VideoPrivacy.PRIVATE) return undefined
|
||||||
|
@ -83,7 +81,7 @@ async function sendCreateView (byActor: ActorModel, video: VideoModel, t: Transa
|
||||||
|
|
||||||
// Send to origin
|
// Send to origin
|
||||||
if (video.isOwned() === false) {
|
if (video.isOwned() === false) {
|
||||||
const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
|
const audience = getVideoAudience(video, actorsInvolvedInVideo)
|
||||||
const data = await createActivityData(url, byActor, viewActivityData, t, audience)
|
const data = await createActivityData(url, byActor, viewActivityData, t, audience)
|
||||||
|
|
||||||
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
||||||
|
@ -107,7 +105,7 @@ async function sendCreateDislike (byActor: ActorModel, video: VideoModel, t: Tra
|
||||||
|
|
||||||
// Send to origin
|
// Send to origin
|
||||||
if (video.isOwned() === false) {
|
if (video.isOwned() === false) {
|
||||||
const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
|
const audience = getVideoAudience(video, actorsInvolvedInVideo)
|
||||||
const data = await createActivityData(url, byActor, dislikeActivityData, t, audience)
|
const data = await createActivityData(url, byActor, dislikeActivityData, t, audience)
|
||||||
|
|
||||||
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
||||||
|
|
|
@ -5,7 +5,8 @@ import { VideoModel } from '../../../models/video/video'
|
||||||
import { VideoCommentModel } from '../../../models/video/video-comment'
|
import { VideoCommentModel } from '../../../models/video/video-comment'
|
||||||
import { VideoShareModel } from '../../../models/video/video-share'
|
import { VideoShareModel } from '../../../models/video/video-share'
|
||||||
import { getDeleteActivityPubUrl } from '../url'
|
import { getDeleteActivityPubUrl } from '../url'
|
||||||
import { audiencify, broadcastToActors, broadcastToFollowers, getActorsInvolvedInVideo, getVideoCommentAudience, unicastTo } from './misc'
|
import { broadcastToActors, broadcastToFollowers, unicastTo } from './utils'
|
||||||
|
import { audiencify, getActorsInvolvedInVideo, getVideoCommentAudience } from '../audience'
|
||||||
|
|
||||||
async function sendDeleteVideo (video: VideoModel, t: Transaction) {
|
async function sendDeleteVideo (video: VideoModel, t: Transaction) {
|
||||||
const url = getDeleteActivityPubUrl(video.url)
|
const url = getDeleteActivityPubUrl(video.url)
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { ActivityFollow } from '../../../../shared/models/activitypub'
|
||||||
import { ActorModel } from '../../../models/activitypub/actor'
|
import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
||||||
import { getActorFollowActivityPubUrl } from '../url'
|
import { getActorFollowActivityPubUrl } from '../url'
|
||||||
import { unicastTo } from './misc'
|
import { unicastTo } from './utils'
|
||||||
|
|
||||||
function sendFollow (actorFollow: ActorFollowModel) {
|
function sendFollow (actorFollow: ActorFollowModel) {
|
||||||
const me = actorFollow.ActorFollower
|
const me = actorFollow.ActorFollower
|
||||||
|
|
|
@ -3,15 +3,8 @@ import { ActivityAudience, ActivityLike } from '../../../../shared/models/activi
|
||||||
import { ActorModel } from '../../../models/activitypub/actor'
|
import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { VideoModel } from '../../../models/video/video'
|
import { VideoModel } from '../../../models/video/video'
|
||||||
import { getVideoLikeActivityPubUrl } from '../url'
|
import { getVideoLikeActivityPubUrl } from '../url'
|
||||||
import {
|
import { broadcastToFollowers, unicastTo } from './utils'
|
||||||
audiencify,
|
import { audiencify, getActorsInvolvedInVideo, getAudience, getObjectFollowersAudience, getVideoAudience } from '../audience'
|
||||||
broadcastToFollowers,
|
|
||||||
getActorsInvolvedInVideo,
|
|
||||||
getAudience,
|
|
||||||
getObjectFollowersAudience,
|
|
||||||
getOriginVideoAudience,
|
|
||||||
unicastTo
|
|
||||||
} from './misc'
|
|
||||||
|
|
||||||
async function sendLike (byActor: ActorModel, video: VideoModel, t: Transaction) {
|
async function sendLike (byActor: ActorModel, video: VideoModel, t: Transaction) {
|
||||||
const url = getVideoLikeActivityPubUrl(byActor, video)
|
const url = getVideoLikeActivityPubUrl(byActor, video)
|
||||||
|
@ -20,7 +13,7 @@ async function sendLike (byActor: ActorModel, video: VideoModel, t: Transaction)
|
||||||
|
|
||||||
// Send to origin
|
// Send to origin
|
||||||
if (video.isOwned() === false) {
|
if (video.isOwned() === false) {
|
||||||
const audience = getOriginVideoAudience(video, accountsInvolvedInVideo)
|
const audience = getVideoAudience(video, accountsInvolvedInVideo)
|
||||||
const data = await likeActivityData(url, byActor, video, t, audience)
|
const data = await likeActivityData(url, byActor, video, t, audience)
|
||||||
|
|
||||||
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
||||||
|
|
|
@ -11,15 +11,8 @@ import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
||||||
import { VideoModel } from '../../../models/video/video'
|
import { VideoModel } from '../../../models/video/video'
|
||||||
import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
|
import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
|
||||||
import {
|
import { broadcastToFollowers, unicastTo } from './utils'
|
||||||
audiencify,
|
import { audiencify, getActorsInvolvedInVideo, getAudience, getObjectFollowersAudience, getVideoAudience } from '../audience'
|
||||||
broadcastToFollowers,
|
|
||||||
getActorsInvolvedInVideo,
|
|
||||||
getAudience,
|
|
||||||
getObjectFollowersAudience,
|
|
||||||
getOriginVideoAudience,
|
|
||||||
unicastTo
|
|
||||||
} from './misc'
|
|
||||||
import { createActivityData, createDislikeActivityData } from './send-create'
|
import { createActivityData, createDislikeActivityData } from './send-create'
|
||||||
import { followActivityData } from './send-follow'
|
import { followActivityData } from './send-follow'
|
||||||
import { likeActivityData } from './send-like'
|
import { likeActivityData } from './send-like'
|
||||||
|
@ -48,7 +41,7 @@ async function sendUndoLike (byActor: ActorModel, video: VideoModel, t: Transact
|
||||||
|
|
||||||
// Send to origin
|
// Send to origin
|
||||||
if (video.isOwned() === false) {
|
if (video.isOwned() === false) {
|
||||||
const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
|
const audience = getVideoAudience(video, actorsInvolvedInVideo)
|
||||||
const data = await undoActivityData(undoUrl, byActor, object, t, audience)
|
const data = await undoActivityData(undoUrl, byActor, object, t, audience)
|
||||||
|
|
||||||
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
||||||
|
@ -70,7 +63,7 @@ async function sendUndoDislike (byActor: ActorModel, video: VideoModel, t: Trans
|
||||||
const object = await createActivityData(dislikeUrl, byActor, dislikeActivity, t)
|
const object = await createActivityData(dislikeUrl, byActor, dislikeActivity, t)
|
||||||
|
|
||||||
if (video.isOwned() === false) {
|
if (video.isOwned() === false) {
|
||||||
const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
|
const audience = getVideoAudience(video, actorsInvolvedInVideo)
|
||||||
const data = await undoActivityData(undoUrl, byActor, object, t, audience)
|
const data = await undoActivityData(undoUrl, byActor, object, t, audience)
|
||||||
|
|
||||||
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
||||||
|
|
|
@ -7,7 +7,8 @@ import { VideoModel } from '../../../models/video/video'
|
||||||
import { VideoChannelModel } from '../../../models/video/video-channel'
|
import { VideoChannelModel } from '../../../models/video/video-channel'
|
||||||
import { VideoShareModel } from '../../../models/video/video-share'
|
import { VideoShareModel } from '../../../models/video/video-share'
|
||||||
import { getUpdateActivityPubUrl } from '../url'
|
import { getUpdateActivityPubUrl } from '../url'
|
||||||
import { audiencify, broadcastToFollowers, getAudience } from './misc'
|
import { broadcastToFollowers } from './utils'
|
||||||
|
import { audiencify, getAudience } from '../audience'
|
||||||
|
|
||||||
async function sendUpdateVideo (video: VideoModel, t: Transaction) {
|
async function sendUpdateVideo (video: VideoModel, t: Transaction) {
|
||||||
const byActor = video.VideoChannel.Account.Actor
|
const byActor = video.VideoChannel.Account.Actor
|
||||||
|
|
|
@ -1,12 +1,8 @@
|
||||||
import { Transaction } from 'sequelize'
|
import { Transaction } from 'sequelize'
|
||||||
import { Activity, ActivityAudience } from '../../../../shared/models/activitypub'
|
import { Activity } from '../../../../shared/models/activitypub'
|
||||||
import { logger } from '../../../helpers/logger'
|
import { logger } from '../../../helpers/logger'
|
||||||
import { ACTIVITY_PUB } from '../../../initializers'
|
|
||||||
import { ActorModel } from '../../../models/activitypub/actor'
|
import { ActorModel } from '../../../models/activitypub/actor'
|
||||||
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
||||||
import { VideoModel } from '../../../models/video/video'
|
|
||||||
import { VideoCommentModel } from '../../../models/video/video-comment'
|
|
||||||
import { VideoShareModel } from '../../../models/video/video-share'
|
|
||||||
import { JobQueue } from '../../job-queue'
|
import { JobQueue } from '../../job-queue'
|
||||||
|
|
||||||
async function forwardActivity (
|
async function forwardActivity (
|
||||||
|
@ -89,78 +85,16 @@ async function unicastTo (data: any, byActor: ActorModel, toActorUrl: string) {
|
||||||
return JobQueue.Instance.createJob({ type: 'activitypub-http-unicast', payload })
|
return JobQueue.Instance.createJob({ type: 'activitypub-http-unicast', payload })
|
||||||
}
|
}
|
||||||
|
|
||||||
function getOriginVideoAudience (video: VideoModel, actorsInvolvedInVideo: ActorModel[]) {
|
// ---------------------------------------------------------------------------
|
||||||
return {
|
|
||||||
to: [ video.VideoChannel.Account.Actor.url ],
|
export {
|
||||||
cc: actorsInvolvedInVideo.map(a => a.followersUrl)
|
broadcastToFollowers,
|
||||||
}
|
unicastTo,
|
||||||
|
forwardActivity,
|
||||||
|
broadcastToActors
|
||||||
}
|
}
|
||||||
|
|
||||||
function getVideoCommentAudience (
|
// ---------------------------------------------------------------------------
|
||||||
videoComment: VideoCommentModel,
|
|
||||||
threadParentComments: VideoCommentModel[],
|
|
||||||
actorsInvolvedInVideo: ActorModel[],
|
|
||||||
isOrigin = false
|
|
||||||
) {
|
|
||||||
const to = [ ACTIVITY_PUB.PUBLIC ]
|
|
||||||
const cc = [ ]
|
|
||||||
|
|
||||||
// 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) {
|
|
||||||
cc.push(parentComment.Account.Actor.url)
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
to,
|
|
||||||
cc: cc.concat(actorsInvolvedInVideo.map(a => a.followersUrl))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getObjectFollowersAudience (actorsInvolvedInObject: ActorModel[]) {
|
|
||||||
return {
|
|
||||||
to: [ ACTIVITY_PUB.PUBLIC ].concat(actorsInvolvedInObject.map(a => a.followersUrl)),
|
|
||||||
cc: []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getActorsInvolvedInVideo (video: VideoModel, t: Transaction) {
|
|
||||||
const actors = await VideoShareModel.loadActorsByShare(video.id, t)
|
|
||||||
actors.push(video.VideoChannel.Account.Actor)
|
|
||||||
|
|
||||||
return actors
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getAudience (actorSender: ActorModel, t: Transaction, isPublic = true) {
|
|
||||||
return buildAudience([ actorSender.followersUrl ], isPublic)
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildAudience (followerInboxUrls: string[], isPublic = true) {
|
|
||||||
// Thanks Mastodon: https://github.com/tootsuite/mastodon/blob/master/app/lib/activitypub/tag_manager.rb#L47
|
|
||||||
let to = []
|
|
||||||
let cc = []
|
|
||||||
|
|
||||||
if (isPublic) {
|
|
||||||
to = [ ACTIVITY_PUB.PUBLIC ]
|
|
||||||
cc = followerInboxUrls
|
|
||||||
} else { // Unlisted
|
|
||||||
to = [ ]
|
|
||||||
cc = [ ]
|
|
||||||
}
|
|
||||||
|
|
||||||
return { to, cc }
|
|
||||||
}
|
|
||||||
|
|
||||||
function audiencify <T> (object: T, audience: ActivityAudience) {
|
|
||||||
return Object.assign(object, audience)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function computeFollowerUris (toActorFollower: ActorModel[], actorsException: ActorModel[], t: Transaction) {
|
async function computeFollowerUris (toActorFollower: ActorModel[], actorsException: ActorModel[], t: Transaction) {
|
||||||
const toActorFollowerIds = toActorFollower.map(a => a.id)
|
const toActorFollowerIds = toActorFollower.map(a => a.id)
|
||||||
|
@ -177,20 +111,3 @@ async function computeUris (toActors: ActorModel[], actorsException: ActorModel[
|
||||||
return Array.from(toActorSharedInboxesSet)
|
return Array.from(toActorSharedInboxesSet)
|
||||||
.filter(sharedInbox => sharedInboxesException.indexOf(sharedInbox) === -1)
|
.filter(sharedInbox => sharedInboxesException.indexOf(sharedInbox) === -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
export {
|
|
||||||
broadcastToFollowers,
|
|
||||||
unicastTo,
|
|
||||||
buildAudience,
|
|
||||||
getAudience,
|
|
||||||
getOriginVideoAudience,
|
|
||||||
getActorsInvolvedInVideo,
|
|
||||||
getObjectFollowersAudience,
|
|
||||||
forwardActivity,
|
|
||||||
audiencify,
|
|
||||||
getVideoCommentAudience,
|
|
||||||
computeUris,
|
|
||||||
broadcastToActors
|
|
||||||
}
|
|
Loading…
Reference in New Issue