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'
+import { Notifier } from '../../notifier'
+import { getAPId } from '../../../helpers/activitypub'
-async function processFollowActivity (activity: ActivityFollow) {
- const activityObject = activity.object
- const actor = await getOrCreateActorAndServerAndModel(activity.actor)
+async function processFollowActivity (activity: ActivityFollow, byActor: ActorModel) {
+ const activityObject = getAPId(activity.object)
- return retryTransactionWrapper(processFollow, actor, activityObject)
+ return retryTransactionWrapper(processFollow, byActor, activityObject)
}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
async function processFollow (actor: ActorModel, targetActorURL: string) {
- await sequelizeTypescript.transaction(async t => {
- const targetActor = await ActorModel.loadByUrl(targetActorURL, t)
+ const { actorFollow, created } = await sequelizeTypescript.transaction(async t => {
+ const targetActor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(targetActorURL, t)
if (!targetActor) throw new Error('Unknown actor')
if (targetActor.isOwned() === false) throw new Error('This is not a local actor.')
- const [ actorFollow ] = await ActorFollowModel.findOrCreate({
+ const [ actorFollow, created ] = await ActorFollowModel.findOrCreate({
where: {
actorId: actor.id,
targetActorId: targetActor.id
actorFollow.ActorFollowing = targetActor
// Target sends to actor he accepted the follow request
- return sendAccept(actorFollow)
+ await sendAccept(actorFollow)
+
+ return { actorFollow, created }
})
+ if (created) Notifier.Instance.notifyOfNewFollow(actorFollow)
+
logger.info('Actor %s is followed by actor %s.', targetActorURL, actor.url)
}