Send follow/accept
[oweals/peertube.git] / server / lib / activitypub / process-follow.ts
1 import { ActivityFollow } from '../../../shared/models/activitypub/activity'
2 import { getOrCreateAccount, retryTransactionWrapper } from '../../helpers'
3 import { database as db } from '../../initializers'
4 import { AccountInstance } from '../../models/account/account-interface'
5 import { sendAccept } from './send-request'
6 import { logger } from '../../helpers/logger'
7
8 async function processFollowActivity (activity: ActivityFollow) {
9   const activityObject = activity.object
10   const account = await getOrCreateAccount(activity.actor)
11
12   return processFollow(account, activityObject)
13 }
14
15 // ---------------------------------------------------------------------------
16
17 export {
18   processFollowActivity
19 }
20
21 // ---------------------------------------------------------------------------
22
23 function processFollow (account: AccountInstance, targetAccountURL: string) {
24   const options = {
25     arguments: [ account, targetAccountURL ],
26     errorMessage: 'Cannot follow with many retries.'
27   }
28
29   return retryTransactionWrapper(follow, options)
30 }
31
32 async function follow (account: AccountInstance, targetAccountURL: string) {
33   await db.sequelize.transaction(async t => {
34     const targetAccount = await db.Account.loadByUrl(targetAccountURL, t)
35
36     if (targetAccount === undefined) throw new Error('Unknown account')
37     if (targetAccount.isOwned() === false) throw new Error('This is not a local account.')
38
39     const sequelizeOptions = {
40       transaction: t
41     }
42     await db.AccountFollow.create({
43       accountId: account.id,
44       targetAccountId: targetAccount.id,
45       state: 'accepted'
46     }, sequelizeOptions)
47
48     // Target sends to account he accepted the follow request
49     return sendAccept(targetAccount, account, t)
50   })
51
52   logger.info('Account uuid %s is followed by account %s.', account.url, targetAccountURL)
53 }