From 350e31d6b64e4973dfa5e9f7b46841cb09aeb1ad Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 14 Nov 2017 17:31:26 +0100 Subject: Follow works --- server/lib/activitypub/process-add.ts | 2 +- server/lib/activitypub/process-follow.ts | 18 ++++++---- server/lib/activitypub/send-request.ts | 38 +++++++++++----------- .../http-request-broadcast-handler.ts | 1 + .../http-request-unicast-handler.ts | 1 + server/lib/jobs/job-scheduler.ts | 13 +++++--- 6 files changed, 42 insertions(+), 31 deletions(-) (limited to 'server/lib') diff --git a/server/lib/activitypub/process-add.ts b/server/lib/activitypub/process-add.ts index 024dee559..06d23a2ea 100644 --- a/server/lib/activitypub/process-add.ts +++ b/server/lib/activitypub/process-add.ts @@ -54,7 +54,7 @@ async function addRemoteVideo (account: AccountInstance, videoChannelUrl: string // Don't block on request generateThumbnailFromUrl(video, videoToCreateData.icon) - .catch(err => logger.warning('Cannot generate thumbnail of %s.', videoToCreateData.id, err)) + .catch(err => logger.warn('Cannot generate thumbnail of %s.', videoToCreateData.id, err)) const videoCreated = await video.save(sequelizeOptions) diff --git a/server/lib/activitypub/process-follow.ts b/server/lib/activitypub/process-follow.ts index ee5d97a0b..a805c0757 100644 --- a/server/lib/activitypub/process-follow.ts +++ b/server/lib/activitypub/process-follow.ts @@ -36,14 +36,18 @@ async function follow (account: AccountInstance, targetAccountURL: string) { if (targetAccount === undefined) throw new Error('Unknown account') if (targetAccount.isOwned() === false) throw new Error('This is not a local account.') - const sequelizeOptions = { + await db.AccountFollow.findOrCreate({ + where: { + accountId: account.id, + targetAccountId: targetAccount.id + }, + defaults: { + accountId: account.id, + targetAccountId: targetAccount.id, + state: 'accepted' + }, transaction: t - } - await db.AccountFollow.create({ - accountId: account.id, - targetAccountId: targetAccount.id, - state: 'accepted' - }, sequelizeOptions) + }) // Target sends to account he accepted the follow request return sendAccept(targetAccount, account, t) diff --git a/server/lib/activitypub/send-request.ts b/server/lib/activitypub/send-request.ts index c18a69784..d47040d6d 100644 --- a/server/lib/activitypub/send-request.ts +++ b/server/lib/activitypub/send-request.ts @@ -10,60 +10,60 @@ import { httpRequestJobScheduler } from '../jobs' import { signObject, activityPubContextify } from '../../helpers' import { Activity } from '../../../shared' -function sendCreateVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { +async function sendCreateVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { const videoChannelObject = videoChannel.toActivityPubObject() - const data = createActivityData(videoChannel.url, videoChannel.Account, videoChannelObject) + const data = await createActivityData(videoChannel.url, videoChannel.Account, videoChannelObject) return broadcastToFollowers(data, videoChannel.Account, t) } -function sendUpdateVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { +async function sendUpdateVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { const videoChannelObject = videoChannel.toActivityPubObject() - const data = updateActivityData(videoChannel.url, videoChannel.Account, videoChannelObject) + const data = await updateActivityData(videoChannel.url, videoChannel.Account, videoChannelObject) return broadcastToFollowers(data, videoChannel.Account, t) } -function sendDeleteVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { - const data = deleteActivityData(videoChannel.url, videoChannel.Account) +async function sendDeleteVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { + const data = await deleteActivityData(videoChannel.url, videoChannel.Account) return broadcastToFollowers(data, videoChannel.Account, t) } -function sendAddVideo (video: VideoInstance, t: Sequelize.Transaction) { +async function sendAddVideo (video: VideoInstance, t: Sequelize.Transaction) { const videoObject = video.toActivityPubObject() - const data = addActivityData(video.url, video.VideoChannel.Account, video.VideoChannel.url, videoObject) + const data = await addActivityData(video.url, video.VideoChannel.Account, video.VideoChannel.url, videoObject) return broadcastToFollowers(data, video.VideoChannel.Account, t) } -function sendUpdateVideo (video: VideoInstance, t: Sequelize.Transaction) { +async function sendUpdateVideo (video: VideoInstance, t: Sequelize.Transaction) { const videoObject = video.toActivityPubObject() - const data = updateActivityData(video.url, video.VideoChannel.Account, videoObject) + const data = await updateActivityData(video.url, video.VideoChannel.Account, videoObject) return broadcastToFollowers(data, video.VideoChannel.Account, t) } -function sendDeleteVideo (video: VideoInstance, t: Sequelize.Transaction) { - const data = deleteActivityData(video.url, video.VideoChannel.Account) +async function sendDeleteVideo (video: VideoInstance, t: Sequelize.Transaction) { + const data = await deleteActivityData(video.url, video.VideoChannel.Account) return broadcastToFollowers(data, video.VideoChannel.Account, t) } -function sendDeleteAccount (account: AccountInstance, t: Sequelize.Transaction) { - const data = deleteActivityData(account.url, account) +async function sendDeleteAccount (account: AccountInstance, t: Sequelize.Transaction) { + const data = await deleteActivityData(account.url, account) return broadcastToFollowers(data, account, t) } -function sendAccept (fromAccount: AccountInstance, toAccount: AccountInstance, t: Sequelize.Transaction) { - const data = acceptActivityData(fromAccount) +async function sendAccept (fromAccount: AccountInstance, toAccount: AccountInstance, t: Sequelize.Transaction) { + const data = await acceptActivityData(fromAccount) return unicastTo(data, toAccount, t) } -function sendFollow (fromAccount: AccountInstance, toAccount: AccountInstance, t: Sequelize.Transaction) { - const data = followActivityData(toAccount.url, fromAccount) +async function sendFollow (fromAccount: AccountInstance, toAccount: AccountInstance, t: Sequelize.Transaction) { + const data = await followActivityData(toAccount.url, fromAccount) return unicastTo(data, toAccount, t) } @@ -97,7 +97,7 @@ async function broadcastToFollowers (data: any, fromAccount: AccountInstance, t: async function unicastTo (data: any, toAccount: AccountInstance, t: Sequelize.Transaction) { const jobPayload = { - uris: [ toAccount.url ], + uris: [ toAccount.inboxUrl ], body: data } diff --git a/server/lib/jobs/http-request-job-scheduler/http-request-broadcast-handler.ts b/server/lib/jobs/http-request-job-scheduler/http-request-broadcast-handler.ts index 799b86e1c..2f1d9ee92 100644 --- a/server/lib/jobs/http-request-job-scheduler/http-request-broadcast-handler.ts +++ b/server/lib/jobs/http-request-job-scheduler/http-request-broadcast-handler.ts @@ -6,6 +6,7 @@ async function process (payload: HTTPRequestPayload, jobId: number) { logger.info('Processing broadcast in job %d.', jobId) const options = { + method: 'POST', uri: '', json: payload.body } diff --git a/server/lib/jobs/http-request-job-scheduler/http-request-unicast-handler.ts b/server/lib/jobs/http-request-job-scheduler/http-request-unicast-handler.ts index 13451f042..3a1a7fabf 100644 --- a/server/lib/jobs/http-request-job-scheduler/http-request-unicast-handler.ts +++ b/server/lib/jobs/http-request-job-scheduler/http-request-unicast-handler.ts @@ -7,6 +7,7 @@ async function process (payload: HTTPRequestPayload, jobId: number) { const uri = payload.uris[0] const options = { + method: 'POST', uri, json: payload.body } diff --git a/server/lib/jobs/job-scheduler.ts b/server/lib/jobs/job-scheduler.ts index f10f745b3..b25bb7ab3 100644 --- a/server/lib/jobs/job-scheduler.ts +++ b/server/lib/jobs/job-scheduler.ts @@ -4,6 +4,7 @@ import { JobCategory } from '../../../shared' import { logger } from '../../helpers' import { database as db, JOB_STATES, JOBS_FETCH_LIMIT_PER_CYCLE, JOBS_FETCHING_INTERVAL } from '../../initializers' import { JobInstance } from '../../models' +import { error } from 'util' export interface JobHandler { process (data: object, jobId: number): Promise @@ -80,8 +81,12 @@ class JobScheduler { private async processJob (job: JobInstance, callback: (err: Error) => void) { const jobHandler = this.jobHandlers[job.handlerName] if (jobHandler === undefined) { - logger.error('Unknown job handler for job %s.', job.handlerName) - return callback(null) + const errorString = 'Unknown job handler ' + job.handlerName + ' for job ' + job.id + logger.error(errorString) + + const error = new Error(errorString) + await this.onJobError(jobHandler, job, error) + return callback(error) } logger.info('Processing job %d with handler %s.', job.id, job.handlerName) @@ -103,7 +108,7 @@ class JobScheduler { } } - callback(null) + return callback(null) } private async onJobError (jobHandler: JobHandler, job: JobInstance, err: Error) { @@ -111,7 +116,7 @@ class JobScheduler { try { await job.save() - await jobHandler.onError(err, job.id) + if (jobHandler) await jobHandler.onError(err, job.id) } catch (err) { this.cannotSaveJobError(err) } -- cgit v1.2.3