X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Fsend%2Fmisc.ts;h=2dc8d3d5915a7bfde2dc37fffb71464ebd59fca4;hb=f40bbe3146553ef45515ee6b6d93ce6028f045ca;hp=fd1add68eaceedb0efde9f4c7303af8e7b7ff6c9;hpb=4e50b6a1c9a3eb261e04ede73241648e6edf21d6;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/activitypub/send/misc.ts b/server/lib/activitypub/send/misc.ts index fd1add68e..2dc8d3d59 100644 --- a/server/lib/activitypub/send/misc.ts +++ b/server/lib/activitypub/send/misc.ts @@ -1,19 +1,17 @@ import { Transaction } from 'sequelize' -import { Activity } from '../../../../shared/models/activitypub/activity' -import { logger } from '../../../helpers/logger' -import { ACTIVITY_PUB, database as db } from '../../../initializers' -import { AccountInstance } from '../../../models/account/account-interface' -import { VideoChannelInstance } from '../../../models/index' -import { VideoInstance } from '../../../models/video/video-interface' -import { - activitypubHttpJobScheduler, - ActivityPubHttpPayload -} from '../../jobs/activitypub-http-job-scheduler/activitypub-http-job-scheduler' +import { Activity, ActivityAudience } from '../../../../shared/models/activitypub' +import { logger } from '../../../helpers' +import { ACTIVITY_PUB } from '../../../initializers' +import { ActorModel } from '../../../models/activitypub/actor' +import { ActorFollowModel } from '../../../models/activitypub/actor-follow' +import { VideoModel } from '../../../models/video/video' +import { VideoShareModel } from '../../../models/video/video-share' +import { activitypubHttpJobScheduler, ActivityPubHttpPayload } from '../../jobs/activitypub-http-job-scheduler' async function forwardActivity ( activity: Activity, t: Transaction, - followersException: AccountInstance[] = [] + followersException: ActorModel[] = [] ) { const to = activity.to || [] const cc = activity.cc || [] @@ -25,11 +23,11 @@ async function forwardActivity ( } } - const toAccountFollowers = await db.Account.listByFollowersUrls(followersUrls) - const uris = await computeFollowerUris(toAccountFollowers, followersException) + const toActorFollowers = await ActorModel.listByFollowersUrls(followersUrls, t) + const uris = await computeFollowerUris(toActorFollowers, followersException, t) if (uris.length === 0) { - logger.info('0 followers for %s, no forwarding.', toAccountFollowers.map(a => a.id).join(', ')) + logger.info('0 followers for %s, no forwarding.', toActorFollowers.map(a => a.id).join(', ')) return undefined } @@ -45,14 +43,14 @@ async function forwardActivity ( async function broadcastToFollowers ( data: any, - byAccount: AccountInstance, - toAccountFollowers: AccountInstance[], + byActor: ActorModel, + toActorFollowers: ActorModel[], t: Transaction, - followersException: AccountInstance[] = [] + followersException: ActorModel[] = [] ) { - const uris = await computeFollowerUris(toAccountFollowers, followersException) + const uris = await computeFollowerUris(toActorFollowers, followersException, t) if (uris.length === 0) { - logger.info('0 followers for %s, no broadcasting.', toAccountFollowers.map(a => a.id).join(', ')) + logger.info('0 followers for %s, no broadcasting.', toActorFollowers.map(a => a.id).join(', ')) return undefined } @@ -60,62 +58,48 @@ async function broadcastToFollowers ( const jobPayload: ActivityPubHttpPayload = { uris, - signatureAccountId: byAccount.id, + signatureActorId: byActor.id, body: data } return activitypubHttpJobScheduler.createJob(t, 'activitypubHttpBroadcastHandler', jobPayload) } -async function unicastTo (data: any, byAccount: AccountInstance, toAccountUrl: string, t: Transaction) { - logger.debug('Creating unicast job.', { uri: toAccountUrl }) +async function unicastTo (data: any, byActor: ActorModel, toActorUrl: string, t: Transaction) { + logger.debug('Creating unicast job.', { uri: toActorUrl }) const jobPayload: ActivityPubHttpPayload = { - uris: [ toAccountUrl ], - signatureAccountId: byAccount.id, + uris: [ toActorUrl ], + signatureActorId: byActor.id, body: data } return activitypubHttpJobScheduler.createJob(t, 'activitypubHttpUnicastHandler', jobPayload) } -function getOriginVideoAudience (video: VideoInstance, accountsInvolvedInVideo: AccountInstance[]) { +function getOriginVideoAudience (video: VideoModel, actorsInvolvedInVideo: ActorModel[]) { return { - to: [ video.VideoChannel.Account.url ], - cc: accountsInvolvedInVideo.map(a => a.followersUrl) + to: [ video.VideoChannel.Account.Actor.url ], + cc: actorsInvolvedInVideo.map(a => a.followersUrl) } } -function getOriginVideoChannelAudience (videoChannel: VideoChannelInstance, accountsInvolved: AccountInstance[]) { +function getObjectFollowersAudience (actorsInvolvedInObject: ActorModel[]) { return { - to: [ videoChannel.Account.url ], - cc: accountsInvolved.map(a => a.followersUrl) - } -} - -function getObjectFollowersAudience (accountsInvolvedInObject: AccountInstance[]) { - return { - to: accountsInvolvedInObject.map(a => a.followersUrl), + to: actorsInvolvedInObject.map(a => a.followersUrl), cc: [] } } -async function getAccountsInvolvedInVideo (video: VideoInstance) { - const accountsToForwardView = await db.VideoShare.loadAccountsByShare(video.id) - accountsToForwardView.push(video.VideoChannel.Account) - - return accountsToForwardView -} - -async function getAccountsInvolvedInVideoChannel (videoChannel: VideoChannelInstance) { - const accountsToForwardView = await db.VideoChannelShare.loadAccountsByShare(videoChannel.id) - accountsToForwardView.push(videoChannel.Account) +async function getActorsInvolvedInVideo (video: VideoModel, t: Transaction) { + const actorsToForwardView = await VideoShareModel.loadActorsByShare(video.id, t) + actorsToForwardView.push(video.VideoChannel.Account.Actor) - return accountsToForwardView + return actorsToForwardView } -async function getAudience (accountSender: AccountInstance, isPublic = true) { - const followerInboxUrls = await accountSender.getFollowerSharedInboxUrls() +async function getAudience (actorSender: ActorModel, t: Transaction, isPublic = true) { + const followerInboxUrls = await actorSender.getFollowerSharedInboxUrls(t) // Thanks Mastodon: https://github.com/tootsuite/mastodon/blob/master/app/lib/activitypub/tag_manager.rb#L47 let to = [] @@ -132,26 +116,27 @@ async function getAudience (accountSender: AccountInstance, isPublic = true) { return { to, cc } } -async function computeFollowerUris (toAccountFollower: AccountInstance[], followersException: AccountInstance[]) { - const toAccountFollowerIds = toAccountFollower.map(a => a.id) +function audiencify (object: any, audience: ActivityAudience) { + return Object.assign(object, audience) +} - const result = await db.AccountFollow.listAcceptedFollowerSharedInboxUrls(toAccountFollowerIds) - const followersSharedInboxException = followersException.map(f => f.sharedInboxUrl) - const uris = result.data.filter(sharedInbox => followersSharedInboxException.indexOf(sharedInbox) === -1) +async function computeFollowerUris (toActorFollower: ActorModel[], followersException: ActorModel[], t: Transaction) { + const toActorFollowerIds = toActorFollower.map(a => a.id) - return uris + const result = await ActorFollowModel.listAcceptedFollowerSharedInboxUrls(toActorFollowerIds, t) + const followersSharedInboxException = followersException.map(f => f.sharedInboxUrl) + return result.data.filter(sharedInbox => followersSharedInboxException.indexOf(sharedInbox) === -1) } // --------------------------------------------------------------------------- export { broadcastToFollowers, - getOriginVideoChannelAudience, unicastTo, getAudience, getOriginVideoAudience, - getAccountsInvolvedInVideo, - getAccountsInvolvedInVideoChannel, + getActorsInvolvedInVideo, getObjectFollowersAudience, - forwardActivity + forwardActivity, + audiencify }