1
0
Fork 0
peertube/server/lib/activitypub/process-create.ts

65 lines
2.6 KiB
TypeScript
Raw Normal View History

2017-11-10 13:34:45 +00:00
import { ActivityCreate, VideoChannelObject, VideoTorrentObject } from '../../../shared'
import { ActivityAdd } from '../../../shared/models/activitypub/activity'
import { generateThumbnailFromUrl, logger, retryTransactionWrapper } from '../../helpers'
2017-11-09 16:51:58 +00:00
import { database as db } from '../../initializers'
2017-11-10 13:34:45 +00:00
import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc'
import Bluebird = require('bluebird')
import { AccountInstance } from '../../models/account/account-interface'
import { getActivityPubUrl, getOrCreateAccount } from '../../helpers/activitypub'
2017-11-09 16:51:58 +00:00
2017-11-10 13:34:45 +00:00
async function processCreateActivity (activity: ActivityCreate) {
2017-11-09 16:51:58 +00:00
const activityObject = activity.object
const activityType = activityObject.type
2017-11-10 13:34:45 +00:00
const account = await getOrCreateAccount(activity.actor)
2017-11-09 16:51:58 +00:00
2017-11-10 13:34:45 +00:00
if (activityType === 'VideoChannel') {
return processCreateVideoChannel(account, activityObject as VideoChannelObject)
2017-11-09 16:51:58 +00:00
}
logger.warn('Unknown activity object type %s when creating activity.', activityType, { activity: activity.id })
2017-11-10 13:34:45 +00:00
return Promise.resolve(undefined)
2017-11-09 16:51:58 +00:00
}
// ---------------------------------------------------------------------------
export {
processCreateActivity
}
// ---------------------------------------------------------------------------
2017-11-10 13:34:45 +00:00
function processCreateVideoChannel (account: AccountInstance, videoChannelToCreateData: VideoChannelObject) {
2017-11-09 16:51:58 +00:00
const options = {
2017-11-10 13:34:45 +00:00
arguments: [ account, videoChannelToCreateData ],
errorMessage: 'Cannot insert the remote video channel with many retries.'
2017-11-09 16:51:58 +00:00
}
2017-11-10 13:34:45 +00:00
return retryTransactionWrapper(addRemoteVideoChannel, options)
2017-11-09 16:51:58 +00:00
}
2017-11-10 13:34:45 +00:00
async function addRemoteVideoChannel (account: AccountInstance, videoChannelToCreateData: VideoChannelObject) {
logger.debug('Adding remote video channel "%s".', videoChannelToCreateData.uuid)
2017-11-09 16:51:58 +00:00
await db.sequelize.transaction(async t => {
2017-11-10 13:34:45 +00:00
let videoChannel = await db.VideoChannel.loadByUUIDOrUrl(videoChannelToCreateData.uuid, videoChannelToCreateData.id, t)
if (videoChannel) throw new Error('Video channel with this URL/UUID already exists.')
const videoChannelData = {
name: videoChannelToCreateData.name,
description: videoChannelToCreateData.content,
uuid: videoChannelToCreateData.uuid,
createdAt: videoChannelToCreateData.published,
updatedAt: videoChannelToCreateData.updated,
2017-11-09 16:51:58 +00:00
remote: true,
2017-11-10 13:34:45 +00:00
accountId: account.id
2017-11-09 16:51:58 +00:00
}
2017-11-10 13:34:45 +00:00
videoChannel = db.VideoChannel.build(videoChannelData)
videoChannel.url = getActivityPubUrl('videoChannel', videoChannel.uuid)
2017-11-09 16:51:58 +00:00
2017-11-10 13:34:45 +00:00
await videoChannel.save({ transaction: t })
2017-11-09 16:51:58 +00:00
})
2017-11-10 13:34:45 +00:00
logger.info('Remote video channel with uuid %s inserted.', videoChannelToCreateData.uuid)
2017-11-09 16:51:58 +00:00
}