-import { ActivityFollow } from '../../../../shared/models/activitypub/activity'
-import { getOrCreateAccount, retryTransactionWrapper } from '../../../helpers'
-import { database as db } from '../../../initializers'
-import { AccountInstance } from '../../../models/account/account-interface'
+import { ActivityFollow } from '../../../../shared/models/activitypub'
+import { retryTransactionWrapper } from '../../../helpers/database-utils'
import { logger } from '../../../helpers/logger'
-import { sendAccept } from '../send/send-accept'
+import { sequelizeTypescript } from '../../../initializers'
+import { ActorModel } from '../../../models/activitypub/actor'
+import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
+import { getOrCreateActorAndServerAndModel } from '../actor'
+import { sendAccept } from '../send'
async function processFollowActivity (activity: ActivityFollow) {
const activityObject = activity.object
- const account = await getOrCreateAccount(activity.actor)
+ const actor = await getOrCreateActorAndServerAndModel(activity.actor)
- return processFollow(account, activityObject)
+ return processFollow(actor, activityObject)
}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
-function processFollow (account: AccountInstance, targetAccountURL: string) {
+function processFollow (actor: ActorModel, targetActorURL: string) {
const options = {
- arguments: [ account, targetAccountURL ],
+ arguments: [ actor, targetActorURL ],
errorMessage: 'Cannot follow with many retries.'
}
return retryTransactionWrapper(follow, options)
}
-async function follow (account: AccountInstance, targetAccountURL: string) {
- await db.sequelize.transaction(async t => {
- const targetAccount = await db.Account.loadByUrl(targetAccountURL, t)
+async function follow (actor: ActorModel, targetActorURL: string) {
+ await sequelizeTypescript.transaction(async t => {
+ const targetActor = await ActorModel.loadByUrl(targetActorURL, t)
- if (!targetAccount) throw new Error('Unknown account')
- if (targetAccount.isOwned() === false) throw new Error('This is not a local account.')
+ if (!targetActor) throw new Error('Unknown actor')
+ if (targetActor.isOwned() === false) throw new Error('This is not a local actor.')
- const [ accountFollow ] = await db.AccountFollow.findOrCreate({
+ const [ actorFollow ] = await ActorFollowModel.findOrCreate({
where: {
- accountId: account.id,
- targetAccountId: targetAccount.id
+ actorId: actor.id,
+ targetActorId: targetActor.id
},
defaults: {
- accountId: account.id,
- targetAccountId: targetAccount.id,
+ actorId: actor.id,
+ targetActorId: targetActor.id,
state: 'accepted'
},
transaction: t
})
- accountFollow.AccountFollower = account
- accountFollow.AccountFollowing = targetAccount
- // Target sends to account he accepted the follow request
- return sendAccept(accountFollow, t)
+ actorFollow.ActorFollower = actor
+ actorFollow.ActorFollowing = targetActor
+
+ if (actorFollow.state !== 'accepted') {
+ actorFollow.state = 'accepted'
+ await actorFollow.save({ transaction: t })
+ }
+
+ actorFollow.ActorFollower = actor
+ actorFollow.ActorFollowing = targetActor
+
+ // Target sends to actor he accepted the follow request
+ return sendAccept(actorFollow)
})
- logger.info('Account uuid %s is followed by account %s.', account.url, targetAccountURL)
+ logger.info('Actor %s is followed by actor %s.', targetActorURL, actor.url)
}