60 lines
2.1 KiB
TypeScript
60 lines
2.1 KiB
TypeScript
import { VideoChannelObject } from '../../../shared/models/activitypub/objects/video-channel-object'
|
|
import { isVideoChannelObjectValid } from '../../helpers/custom-validators/activitypub/video-channels'
|
|
import { logger } from '../../helpers/logger'
|
|
import { doRequest } from '../../helpers/requests'
|
|
import { database as db } from '../../initializers'
|
|
import { ACTIVITY_PUB } from '../../initializers/constants'
|
|
import { AccountInstance } from '../../models/account/account-interface'
|
|
import { videoChannelActivityObjectToDBAttributes } from './process/misc'
|
|
|
|
async function getOrCreateVideoChannel (ownerAccount: AccountInstance, videoChannelUrl: string) {
|
|
let videoChannel = await db.VideoChannel.loadByUrl(videoChannelUrl)
|
|
|
|
// We don't have this account in our database, fetch it on remote
|
|
if (!videoChannel) {
|
|
videoChannel = await fetchRemoteVideoChannel(ownerAccount, videoChannelUrl)
|
|
if (videoChannel === undefined) throw new Error('Cannot fetch remote video channel.')
|
|
|
|
// Save our new video channel in database
|
|
await videoChannel.save()
|
|
}
|
|
|
|
return videoChannel
|
|
}
|
|
|
|
async function fetchRemoteVideoChannel (ownerAccount: AccountInstance, videoChannelUrl: string) {
|
|
const options = {
|
|
uri: videoChannelUrl,
|
|
method: 'GET',
|
|
headers: {
|
|
'Accept': ACTIVITY_PUB.ACCEPT_HEADER
|
|
}
|
|
}
|
|
|
|
logger.info('Fetching remote video channel %s.', videoChannelUrl)
|
|
|
|
let requestResult
|
|
try {
|
|
requestResult = await doRequest(options)
|
|
} catch (err) {
|
|
logger.warn('Cannot fetch remote video channel %s.', videoChannelUrl, err)
|
|
return undefined
|
|
}
|
|
|
|
const videoChannelJSON: VideoChannelObject = JSON.parse(requestResult.body)
|
|
if (isVideoChannelObjectValid(videoChannelJSON) === false) {
|
|
logger.debug('Remote video channel JSON is not valid.', { videoChannelJSON })
|
|
return undefined
|
|
}
|
|
|
|
const videoChannelAttributes = videoChannelActivityObjectToDBAttributes(videoChannelJSON, ownerAccount)
|
|
const videoChannel = db.VideoChannel.build(videoChannelAttributes)
|
|
videoChannel.Account = ownerAccount
|
|
|
|
return videoChannel
|
|
}
|
|
|
|
export {
|
|
getOrCreateVideoChannel,
|
|
fetchRemoteVideoChannel
|
|
}
|