X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Fprocess%2Fprocess-update.ts;h=0b96ba3526593b731f607fab94fd25b661911dda;hb=418d092afa81e2c8fe8ac6838fc4b5eb0af6a782;hp=d3af1a181b0885b1c192f5471ee4dc654a3228d7;hpb=c48e82b5e0478434de30626d14594a97f2402e7c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/activitypub/process/process-update.ts b/server/lib/activitypub/process/process-update.ts index d3af1a181..0b96ba352 100644 --- a/server/lib/activitypub/process/process-update.ts +++ b/server/lib/activitypub/process/process-update.ts @@ -6,27 +6,36 @@ import { sequelizeTypescript } from '../../../initializers' import { AccountModel } from '../../../models/account/account' import { ActorModel } from '../../../models/activitypub/actor' import { VideoChannelModel } from '../../../models/video/video-channel' -import { fetchAvatarIfExists, getOrCreateActorAndServerAndModel, updateActorAvatarInstance, updateActorInstance } from '../actor' -import { getOrCreateVideoAndAccountAndChannel, updateVideoFromAP, getOrCreateVideoChannelFromVideoObject } from '../videos' +import { fetchAvatarIfExists, updateActorAvatarInstance, updateActorInstance } from '../actor' +import { getOrCreateVideoAndAccountAndChannel, getOrCreateVideoChannelFromVideoObject, updateVideoFromAP } from '../videos' import { sanitizeAndCheckVideoTorrentObject } from '../../../helpers/custom-validators/activitypub/videos' import { isCacheFileObjectValid } from '../../../helpers/custom-validators/activitypub/cache-file' -import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy' -import { createCacheFile, updateCacheFile } from '../cache-file' +import { createOrUpdateCacheFile } from '../cache-file' +import { forwardVideoRelatedActivity } from '../send/utils' +import { PlaylistObject } from '../../../../shared/models/activitypub/objects/playlist-object' +import { createOrUpdateVideoPlaylist } from '../playlist' -async function processUpdateActivity (activity: ActivityUpdate) { - const actor = await getOrCreateActorAndServerAndModel(activity.actor) +async function processUpdateActivity (activity: ActivityUpdate, byActor: ActorModel) { const objectType = activity.object.type if (objectType === 'Video') { - return retryTransactionWrapper(processUpdateVideo, actor, activity) + return retryTransactionWrapper(processUpdateVideo, byActor, activity) } if (objectType === 'Person' || objectType === 'Application' || objectType === 'Group') { - return retryTransactionWrapper(processUpdateActor, actor, activity) + // We need more attributes + const byActorFull = await ActorModel.loadByUrlAndPopulateAccountAndChannel(byActor.url) + return retryTransactionWrapper(processUpdateActor, byActorFull, activity) } if (objectType === 'CacheFile') { - return retryTransactionWrapper(processUpdateCacheFile, actor, activity) + // We need more attributes + const byActorFull = await ActorModel.loadByUrlAndPopulateAccountAndChannel(byActor.url) + return retryTransactionWrapper(processUpdateCacheFile, byActorFull, activity) + } + + if (objectType === 'Playlist') { + return retryTransactionWrapper(processUpdatePlaylist, byActor, activity) } return undefined @@ -48,27 +57,39 @@ async function processUpdateVideo (actor: ActorModel, activity: ActivityUpdate) return undefined } - const { video } = await getOrCreateVideoAndAccountAndChannel(videoObject.id) + const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoObject.id, allowRefresh: false }) const channelActor = await getOrCreateVideoChannelFromVideoObject(videoObject) - return updateVideoFromAP(video, videoObject, actor.Account, channelActor.VideoChannel, activity.to) + const updateOptions = { + video, + videoObject, + account: actor.Account, + channel: channelActor.VideoChannel, + overrideTo: activity.to + } + return updateVideoFromAP(updateOptions) } async function processUpdateCacheFile (byActor: ActorModel, activity: ActivityUpdate) { const cacheFileObject = activity.object as CacheFileObject - if (!isCacheFileObjectValid(cacheFileObject) === false) { - logger.debug('Cahe file object sent by update is not valid.', { cacheFileObject }) + if (!isCacheFileObjectValid(cacheFileObject)) { + logger.debug('Cache file object sent by update is not valid.', { cacheFileObject }) return undefined } - const redundancyModel = await VideoRedundancyModel.loadByUrl(cacheFileObject.id) - if (!redundancyModel) { - const { video } = await getOrCreateVideoAndAccountAndChannel(cacheFileObject.id) - return createCacheFile(cacheFileObject, video, byActor) - } + const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: cacheFileObject.object }) + + await sequelizeTypescript.transaction(async t => { + await createOrUpdateCacheFile(cacheFileObject, video, byActor, t) + }) + + if (video.isOwned()) { + // Don't resend the activity to the sender + const exceptions = [ byActor ] - return updateCacheFile(cacheFileObject, redundancyModel, byActor) + await forwardVideoRelatedActivity(activity, undefined, exceptions, video) + } } async function processUpdateActor (actor: ActorModel, activity: ActivityUpdate) { @@ -120,3 +141,12 @@ async function processUpdateActor (actor: ActorModel, activity: ActivityUpdate) throw err } } + +async function processUpdatePlaylist (byActor: ActorModel, activity: ActivityUpdate) { + const playlistObject = activity.object as PlaylistObject + const byAccount = byActor.Account + + if (!byAccount) throw new Error('Cannot update video playlist with the non account actor ' + byActor.url) + + await createOrUpdateVideoPlaylist(playlistObject, byAccount, activity.to) +}