import { ActivityAnnounce } from '../../../../shared/models/activitypub' ; import { retryTransactionWrapper } from '../../../helpers/database-utils' ; import { sequelizeTypescript } from '../../../initializers/database' ; import { VideoShareModel } from '../../../models/video/video-share' ; import { forwardVideoRelatedActivity } from '../send/utils' ; import { getOrCreateAPVideo } from '../videos' ; import { Notifier } from '../../notifier' ; import { logger } from '../../../helpers/logger' ; import { APProcessorOptions } from '../../../types/activitypub-processor.model' ; import { MActorSignature , MVideoAccountLightBlacklistAllFiles } from '../../../types/models' ; import { getAPId } from '@server/helpers/activitypub' ; async function processAnnounceActivity ( options ) { const { activity , byActor : actorAnnouncer } = options ; const notify = options . fromFetch !== true ; if ( actorAnnouncer . type !== 'Application' && actorAnnouncer . type !== 'Group' ) return ; return retryTransactionWrapper ( processVideoShare , actorAnnouncer , activity , notify ) ; } export { processAnnounceActivity } ; async function processVideoShare ( actorAnnouncer , activity , notify ) { const objectUri = getAPId ( activity . object ) ; let video ; let videoCreated ; try { const result = await getOrCreateAPVideo ( { videoObject : objectUri } ) ; video = result . video ; videoCreated = result . created ; } catch ( err ) { logger . debug ( 'Cannot process share of %s. Maybe this is not a video object, so just skipping.' , objectUri , { err } ) ; return ; } await sequelizeTypescript . transaction ( async ( t ) => { const share = { actorId : actorAnnouncer . id , videoId : video . id , url : activity . id } ; const [ , created ] = await VideoShareModel . findOrCreate ( { where : { url : activity . id } , defaults : share , transaction : t } ) ; if ( video . isOwned ( ) && created === true ) { const exceptions = [ actorAnnouncer ] ; await forwardVideoRelatedActivity ( activity , t , exceptions , video ) ; } return undefined ; } ) ; if ( videoCreated && notify ) Notifier . Instance . notifyOnNewVideoIfNeeded ( video ) ; }