X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Fshare.ts;h=0fefcbbc560fdfafb0febaa0d611ae9365803bc8;hb=49aa917509568a3b96967732512b5ef4ecc50b1b;hp=d2649e2d5977f4a21744b976888b4260d500fdf9;hpb=ae28cdf327d782e629379eee1999096ca2a5d74b;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/activitypub/share.ts b/server/lib/activitypub/share.ts index d2649e2d5..0fefcbbc5 100644 --- a/server/lib/activitypub/share.ts +++ b/server/lib/activitypub/share.ts @@ -1,20 +1,20 @@ +import { map } from 'bluebird' import { Transaction } from 'sequelize' -import { VideoPrivacy } from '../../../shared/models/videos' -import { getServerActor } from '../../helpers/utils' -import { VideoModel } from '../../models/video/video' +import { getServerActor } from '@server/models/application/application' +import { logger, loggerTagsFactory } from '../../helpers/logger' +import { doJSONRequest } from '../../helpers/requests' +import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers/constants' import { VideoShareModel } from '../../models/video/video-share' +import { MChannelActorLight, MVideo, MVideoAccountLight, MVideoId } from '../../types/models/video' +import { getAPId } from './activity' +import { getOrCreateAPActor } from './actors' import { sendUndoAnnounce, sendVideoAnnounce } from './send' -import { getVideoAnnounceActivityPubUrl } from './url' -import { VideoChannelModel } from '../../models/video/video-channel' -import * as Bluebird from 'bluebird' -import { doRequest } from '../../helpers/requests' -import { getOrCreateActorAndServerAndModel } from './actor' -import { logger } from '../../helpers/logger' -import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers' -import { checkUrlsSameHost, getActorUrl } from '../../helpers/activitypub' - -async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) { - if (video.privacy === VideoPrivacy.PRIVATE) return undefined +import { checkUrlsSameHost, getLocalVideoAnnounceActivityPubUrl } from './url' + +const lTags = loggerTagsFactory('share') + +async function shareVideoByServerAndChannel (video: MVideoAccountLight, t: Transaction) { + if (!video.hasPrivacyForFederation()) return undefined return Promise.all([ shareByServer(video, t), @@ -22,44 +22,25 @@ async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) ]) } -async function changeVideoChannelShare (video: VideoModel, oldVideoChannel: VideoChannelModel, t: Transaction) { - logger.info('Updating video channel of video %s: %s -> %s.', video.uuid, oldVideoChannel.name, video.VideoChannel.name) +async function changeVideoChannelShare ( + video: MVideoAccountLight, + oldVideoChannel: MChannelActorLight, + t: Transaction +) { + logger.info( + 'Updating video channel of video %s: %s -> %s.', video.uuid, oldVideoChannel.name, video.VideoChannel.name, + lTags(video.uuid) + ) await undoShareByVideoChannel(video, oldVideoChannel, t) await shareByVideoChannel(video, t) } -async function addVideoShares (shareUrls: string[], instance: VideoModel) { - await Bluebird.map(shareUrls, async shareUrl => { +async function addVideoShares (shareUrls: string[], video: MVideoId) { + await map(shareUrls, async shareUrl => { try { - // Fetch url - const { body } = await doRequest({ - uri: shareUrl, - json: true, - activityPub: true - }) - if (!body || !body.actor) throw new Error('Body or body actor is invalid') - - const actorUrl = getActorUrl(body.actor) - if (checkUrlsSameHost(shareUrl, actorUrl) !== true) { - throw new Error(`Actor url ${actorUrl} has not the same host than the share url ${shareUrl}`) - } - - const actor = await getOrCreateActorAndServerAndModel(actorUrl) - - const entry = { - actorId: actor.id, - videoId: instance.id, - url: shareUrl - } - - await VideoShareModel.findOrCreate({ - where: { - url: shareUrl - }, - defaults: entry - }) + await addVideoShare(shareUrl, video) } catch (err) { logger.warn('Cannot add share %s.', shareUrl, { err }) } @@ -74,11 +55,31 @@ export { // --------------------------------------------------------------------------- -async function shareByServer (video: VideoModel, t: Transaction) { +async function addVideoShare (shareUrl: string, video: MVideoId) { + const { body } = await doJSONRequest(shareUrl, { activityPub: true }) + if (!body || !body.actor) throw new Error('Body or body actor is invalid') + + const actorUrl = getAPId(body.actor) + if (checkUrlsSameHost(shareUrl, actorUrl) !== true) { + throw new Error(`Actor url ${actorUrl} has not the same host than the share url ${shareUrl}`) + } + + const actor = await getOrCreateAPActor(actorUrl) + + const entry = { + actorId: actor.id, + videoId: video.id, + url: shareUrl + } + + await VideoShareModel.upsert(entry) +} + +async function shareByServer (video: MVideo, t: Transaction) { const serverActor = await getServerActor() - const serverShareUrl = getVideoAnnounceActivityPubUrl(serverActor, video) - return VideoShareModel.findOrCreate({ + const serverShareUrl = getLocalVideoAnnounceActivityPubUrl(serverActor, video) + const [ serverShare ] = await VideoShareModel.findOrCreate({ defaults: { actorId: serverActor.id, videoId: video.id, @@ -88,16 +89,14 @@ async function shareByServer (video: VideoModel, t: Transaction) { url: serverShareUrl }, transaction: t - }).then(([ serverShare, created ]) => { - if (created) return sendVideoAnnounce(serverActor, serverShare, video, t) - - return undefined }) + + return sendVideoAnnounce(serverActor, serverShare, video, t) } -async function shareByVideoChannel (video: VideoModel, t: Transaction) { - const videoChannelShareUrl = getVideoAnnounceActivityPubUrl(video.VideoChannel.Actor, video) - return VideoShareModel.findOrCreate({ +async function shareByVideoChannel (video: MVideoAccountLight, t: Transaction) { + const videoChannelShareUrl = getLocalVideoAnnounceActivityPubUrl(video.VideoChannel.Actor, video) + const [ videoChannelShare ] = await VideoShareModel.findOrCreate({ defaults: { actorId: video.VideoChannel.actorId, videoId: video.id, @@ -107,14 +106,12 @@ async function shareByVideoChannel (video: VideoModel, t: Transaction) { url: videoChannelShareUrl }, transaction: t - }).then(([ videoChannelShare, created ]) => { - if (created) return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t) - - return undefined }) + + return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t) } -async function undoShareByVideoChannel (video: VideoModel, oldVideoChannel: VideoChannelModel, t: Transaction) { +async function undoShareByVideoChannel (video: MVideo, oldVideoChannel: MChannelActorLight, t: Transaction) { // Load old share const oldShare = await VideoShareModel.load(oldVideoChannel.actorId, video.id, t) if (!oldShare) return new Error('Cannot find old video channel share ' + oldVideoChannel.actorId + ' for video ' + video.id)