X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Fprocess%2Fprocess-create.ts;h=4740dc4328d5fd7e6ef521e52b34220128b9ca47;hb=f00984c0077e9b666fe8005452768e53d1c3f421;hp=ddf7c74f6ce7f07b2c1f6b32a6327e480d262039;hpb=0f91ae62df8a37194fea84ce1efa9e733d9c1fd8;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/activitypub/process/process-create.ts b/server/lib/activitypub/process/process-create.ts index ddf7c74f6..4740dc432 100644 --- a/server/lib/activitypub/process/process-create.ts +++ b/server/lib/activitypub/process/process-create.ts @@ -1,18 +1,25 @@ import { ActivityCreate, VideoChannelObject } from '../../../../shared' +import { DislikeObject } from '../../../../shared/models/activitypub/objects/dislike-object' import { VideoAbuseObject } from '../../../../shared/models/activitypub/objects/video-abuse-object' +import { ViewObject } from '../../../../shared/models/activitypub/objects/view-object' import { logger, retryTransactionWrapper } from '../../../helpers' import { database as db } from '../../../initializers' import { AccountInstance } from '../../../models/account/account-interface' import { getOrCreateAccountAndServer } from '../account' +import { forwardActivity } from '../send/misc' import { getVideoChannelActivityPubUrl } from '../url' -import { videoChannelActivityObjectToDBAttributes } from './misc' +import { addVideoChannelShares, videoChannelActivityObjectToDBAttributes } from './misc' async function processCreateActivity (activity: ActivityCreate) { const activityObject = activity.object const activityType = activityObject.type const account = await getOrCreateAccountAndServer(activity.actor) - if (activityType === 'VideoChannel') { + if (activityType === 'View') { + return processCreateView(account, activity) + } else if (activityType === 'Dislike') { + return processCreateDislike(account, activity) + } else if (activityType === 'VideoChannel') { return processCreateVideoChannel(account, activityObject as VideoChannelObject) } else if (activityType === 'Flag') { return processCreateVideoAbuse(account, activityObject as VideoAbuseObject) @@ -30,13 +37,74 @@ export { // --------------------------------------------------------------------------- -function processCreateVideoChannel (account: AccountInstance, videoChannelToCreateData: VideoChannelObject) { +async function processCreateDislike (byAccount: AccountInstance, activity: ActivityCreate) { + const options = { + arguments: [ byAccount, activity ], + errorMessage: 'Cannot dislike the video with many retries.' + } + + return retryTransactionWrapper(createVideoDislike, options) +} + +function createVideoDislike (byAccount: AccountInstance, activity: ActivityCreate) { + const dislike = activity.object as DislikeObject + + return db.sequelize.transaction(async t => { + const video = await db.Video.loadByUrlAndPopulateAccount(dislike.object, t) + if (!video) throw new Error('Unknown video ' + dislike.object) + + const rate = { + type: 'dislike' as 'dislike', + videoId: video.id, + accountId: byAccount.id + } + const [ , created ] = await db.AccountVideoRate.findOrCreate({ + where: rate, + defaults: rate, + transaction: t + }) + if (created === true) await video.increment('dislikes', { transaction: t }) + + if (video.isOwned() && created === true) { + // Don't resend the activity to the sender + const exceptions = [ byAccount ] + await forwardActivity(activity, t, exceptions) + } + }) +} + +async function processCreateView (byAccount: AccountInstance, activity: ActivityCreate) { + const view = activity.object as ViewObject + + const video = await db.Video.loadByUrlAndPopulateAccount(view.object) + + if (!video) throw new Error('Unknown video ' + view.object) + + const account = await db.Account.loadByUrl(view.actor) + if (!account) throw new Error('Unknown account ' + view.actor) + + await video.increment('views') + + if (video.isOwned()) { + // Don't resend the activity to the sender + const exceptions = [ byAccount ] + await forwardActivity(activity, undefined, exceptions) + } +} + +async function processCreateVideoChannel (account: AccountInstance, videoChannelToCreateData: VideoChannelObject) { const options = { arguments: [ account, videoChannelToCreateData ], errorMessage: 'Cannot insert the remote video channel with many retries.' } - return retryTransactionWrapper(addRemoteVideoChannel, options) + const videoChannel = await retryTransactionWrapper(addRemoteVideoChannel, options) + + if (videoChannelToCreateData.shares && Array.isArray(videoChannelToCreateData.shares.orderedItems)) { + await addVideoChannelShares(videoChannel, videoChannelToCreateData.shares.orderedItems) + } + + return videoChannel } function addRemoteVideoChannel (account: AccountInstance, videoChannelToCreateData: VideoChannelObject) { @@ -44,7 +112,7 @@ function addRemoteVideoChannel (account: AccountInstance, videoChannelToCreateDa return db.sequelize.transaction(async t => { let videoChannel = await db.VideoChannel.loadByUUIDOrUrl(videoChannelToCreateData.uuid, videoChannelToCreateData.id, t) - if (videoChannel) throw new Error('Video channel with this URL/UUID already exists.') + if (videoChannel) return videoChannel const videoChannelData = videoChannelActivityObjectToDBAttributes(videoChannelToCreateData, account) videoChannel = db.VideoChannel.build(videoChannelData)