X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Fshare.ts;h=69841486765b16df1404bab64360713282de1e0d;hb=28be89161aab245526d64f6fb7dd29391a97fe0a;hp=e14b0f50c0f5d290ac04befca30ac8a9ac28e94f;hpb=4e50b6a1c9a3eb261e04ede73241648e6edf21d6;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/activitypub/share.ts b/server/lib/activitypub/share.ts index e14b0f50c..698414867 100644 --- a/server/lib/activitypub/share.ts +++ b/server/lib/activitypub/share.ts @@ -1,33 +1,79 @@ import { Transaction } from 'sequelize' -import { getServerAccount } from '../../helpers/utils' -import { database as db } from '../../initializers' -import { VideoChannelInstance } from '../../models/index' -import { VideoInstance } from '../../models/video/video-interface' -import { sendVideoAnnounceToFollowers, sendVideoChannelAnnounceToFollowers } from './send/send-announce' +import { VideoPrivacy } from '../../../shared/models/videos' +import { getServerActor } from '../../helpers/utils' +import { VideoModel } from '../../models/video/video' +import { VideoShareModel } from '../../models/video/video-share' +import { sendUndoAnnounce, sendVideoAnnounce } from './send' +import { getAnnounceActivityPubUrl } from './url' +import { VideoChannelModel } from '../../models/video/video-channel' -async function shareVideoChannelByServer (videoChannel: VideoChannelInstance, t: Transaction) { - const serverAccount = await getServerAccount() +async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) { + if (video.privacy === VideoPrivacy.PRIVATE) return undefined - await db.VideoChannelShare.create({ - accountId: serverAccount.id, - videoChannelId: videoChannel.id - }, { transaction: t }) + return Promise.all([ + shareByServer(video, t), + shareByVideoChannel(video, t) + ]) +} + +async function changeVideoChannelShare (video: VideoModel, oldVideoChannel: VideoChannelModel, t: Transaction) { + await undoShareByVideoChannel(video, oldVideoChannel, t) + + await shareByVideoChannel(video, t) +} - return sendVideoChannelAnnounceToFollowers(serverAccount, videoChannel, t) +export { + changeVideoChannelShare, + shareVideoByServerAndChannel } -async function shareVideoByServer (video: VideoInstance, t: Transaction) { - const serverAccount = await getServerAccount() +// --------------------------------------------------------------------------- + +async function shareByServer (video: VideoModel, t: Transaction) { + const serverActor = await getServerActor() - await db.VideoShare.create({ - accountId: serverAccount.id, - videoId: video.id - }, { transaction: t }) + const serverShareUrl = getAnnounceActivityPubUrl(video.url, serverActor) + return VideoShareModel.findOrCreate({ + defaults: { + actorId: serverActor.id, + videoId: video.id, + url: serverShareUrl + }, + where: { + url: serverShareUrl + }, + transaction: t + }).then(([ serverShare, created ]) => { + if (created) return sendVideoAnnounce(serverActor, serverShare, video, t) - return sendVideoAnnounceToFollowers(serverAccount, video, t) + return undefined + }) } -export { - shareVideoChannelByServer, - shareVideoByServer +async function shareByVideoChannel (video: VideoModel, t: Transaction) { + const videoChannelShareUrl = getAnnounceActivityPubUrl(video.url, video.VideoChannel.Actor) + return VideoShareModel.findOrCreate({ + defaults: { + actorId: video.VideoChannel.actorId, + videoId: video.id, + url: videoChannelShareUrl + }, + where: { + url: videoChannelShareUrl + }, + transaction: t + }).then(([ videoChannelShare, created ]) => { + if (created) return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t) + + return undefined + }) +} + +async function undoShareByVideoChannel (video: VideoModel, oldVideoChannel: VideoChannelModel, 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) + + await sendUndoAnnounce(oldVideoChannel.Actor, oldShare, video, t) + await oldShare.destroy({ transaction: t }) }