X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fjob-queue%2Fhandlers%2Factivitypub-http-fetcher.ts;h=0182c5169f17ac0c2be83afdee3337499f64fea0;hb=818c449b3c34e9f324ac744120c8774e724ab25e;hp=4683beb2f58f40e88425f5b06c4e30a37abc55fb;hpb=71e3dfda4e2bcc228415c0d66b09a84bb73dddd1;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/job-queue/handlers/activitypub-http-fetcher.ts b/server/lib/job-queue/handlers/activitypub-http-fetcher.ts index 4683beb2f..0182c5169 100644 --- a/server/lib/job-queue/handlers/activitypub-http-fetcher.ts +++ b/server/lib/job-queue/handlers/activitypub-http-fetcher.ts @@ -1,60 +1,55 @@ -import * as kue from 'kue' +import * as Bull from 'bull' +import * as Bluebird from 'bluebird' import { logger } from '../../../helpers/logger' -import { doRequest } from '../../../helpers/requests' -import { ACTIVITY_PUB, JOB_REQUEST_TIMEOUT } from '../../../initializers' import { processActivities } from '../../activitypub/process' -import { ActivitypubHttpBroadcastPayload } from './activitypub-http-broadcast' +import { addVideoComments } from '../../activitypub/video-comments' +import { crawlCollectionPage } from '../../activitypub/crawl' +import { VideoModel } from '../../../models/video/video' +import { addVideoShares, createRates } from '../../activitypub' +import { createAccountPlaylists } from '../../activitypub/playlist' +import { AccountModel } from '../../../models/account/account' +import { AccountVideoRateModel } from '../../../models/account/account-video-rate' +import { VideoShareModel } from '../../../models/video/video-share' +import { VideoCommentModel } from '../../../models/video/video-comment' +import { MAccountDefault, MVideoFullLight } from '../../../typings/models' + +type FetchType = 'activity' | 'video-likes' | 'video-dislikes' | 'video-shares' | 'video-comments' | 'account-playlists' export type ActivitypubHttpFetcherPayload = { - uris: string[] + uri: string + type: FetchType + videoId?: number + accountId?: number } -async function processActivityPubHttpFetcher (job: kue.Job) { +async function processActivityPubHttpFetcher (job: Bull.Job) { logger.info('Processing ActivityPub fetcher in job %d.', job.id) - const payload = job.data as ActivitypubHttpBroadcastPayload + const payload = job.data as ActivitypubHttpFetcherPayload - const options = { - method: 'GET', - uri: '', - json: true, - activityPub: true, - timeout: JOB_REQUEST_TIMEOUT - } - - for (const uri of payload.uris) { - options.uri = uri - logger.info('Fetching ActivityPub data on %s.', uri) - - const response = await doRequest(options) - const firstBody = response.body - - if (firstBody.first && Array.isArray(firstBody.first.orderedItems)) { - const activities = firstBody.first.orderedItems - - logger.info('Processing %i items ActivityPub fetcher for %s.', activities.length, options.uri) + let video: MVideoFullLight + if (payload.videoId) video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoId) - await processActivities(activities) - } + let account: MAccountDefault + if (payload.accountId) account = await AccountModel.load(payload.accountId) - let limit = ACTIVITY_PUB.FETCH_PAGE_LIMIT - let i = 0 - let nextLink = firstBody.first.next - while (nextLink && i < limit) { - options.uri = nextLink - - const { body } = await doRequest(options) - nextLink = body.next - i++ - - if (Array.isArray(body.orderedItems)) { - const activities = body.orderedItems - logger.info('Processing %i items ActivityPub fetcher for %s.', activities.length, options.uri) + const fetcherType: { [ id in FetchType ]: (items: any[]) => Promise } = { + 'activity': items => processActivities(items, { outboxUrl: payload.uri, fromFetch: true }), + 'video-likes': items => createRates(items, video, 'like'), + 'video-dislikes': items => createRates(items, video, 'dislike'), + 'video-shares': items => addVideoShares(items, video), + 'video-comments': items => addVideoComments(items), + 'account-playlists': items => createAccountPlaylists(items, account) + } - await processActivities(activities) - } - } + const cleanerType: { [ id in FetchType ]?: (crawlStartDate: Date) => Bluebird } = { + 'video-likes': crawlStartDate => AccountVideoRateModel.cleanOldRatesOf(video.id, 'like' as 'like', crawlStartDate), + 'video-dislikes': crawlStartDate => AccountVideoRateModel.cleanOldRatesOf(video.id, 'dislike' as 'dislike', crawlStartDate), + 'video-shares': crawlStartDate => VideoShareModel.cleanOldSharesOf(video.id, crawlStartDate), + 'video-comments': crawlStartDate => VideoCommentModel.cleanOldCommentsOf(video.id, crawlStartDate) } + + return crawlCollectionPage(payload.uri, fetcherType[payload.type], cleanerType[payload.type]) } // ---------------------------------------------------------------------------