]>
Commit | Line | Data |
---|---|---|
3fd3ab2d C |
1 | import { ActivityFollow } from '../../../../shared/models/activitypub' |
2 | import { logger, retryTransactionWrapper } from '../../../helpers' | |
3 | import { sequelizeTypescript } from '../../../initializers' | |
50d6de9c C |
4 | import { ActorModel } from '../../../models/activitypub/actor' |
5 | import { ActorFollowModel } from '../../../models/activitypub/actor-follow' | |
6 | import { getOrCreateActorAndServerAndModel } from '../actor' | |
3fd3ab2d | 7 | import { sendAccept } from '../send' |
7a7724e6 C |
8 | |
9 | async function processFollowActivity (activity: ActivityFollow) { | |
10 | const activityObject = activity.object | |
50d6de9c | 11 | const actor = await getOrCreateActorAndServerAndModel(activity.actor) |
7a7724e6 | 12 | |
50d6de9c | 13 | return processFollow(actor, activityObject) |
7a7724e6 C |
14 | } |
15 | ||
16 | // --------------------------------------------------------------------------- | |
17 | ||
18 | export { | |
19 | processFollowActivity | |
20 | } | |
21 | ||
22 | // --------------------------------------------------------------------------- | |
23 | ||
50d6de9c | 24 | function processFollow (actor: ActorModel, targetActorURL: string) { |
ce548a10 | 25 | const options = { |
50d6de9c | 26 | arguments: [ actor, targetActorURL ], |
ce548a10 C |
27 | errorMessage: 'Cannot follow with many retries.' |
28 | } | |
7a7724e6 | 29 | |
ce548a10 C |
30 | return retryTransactionWrapper(follow, options) |
31 | } | |
32 | ||
50d6de9c | 33 | async function follow (actor: ActorModel, targetActorURL: string) { |
3fd3ab2d | 34 | await sequelizeTypescript.transaction(async t => { |
50d6de9c | 35 | const targetActor = await ActorModel.loadByUrl(targetActorURL, t) |
ce548a10 | 36 | |
50d6de9c C |
37 | if (!targetActor) throw new Error('Unknown actor') |
38 | if (targetActor.isOwned() === false) throw new Error('This is not a local actor.') | |
7a7724e6 | 39 | |
50d6de9c | 40 | const [ actorFollow ] = await ActorFollowModel.findOrCreate({ |
350e31d6 | 41 | where: { |
50d6de9c C |
42 | actorId: actor.id, |
43 | targetActorId: targetActor.id | |
350e31d6 C |
44 | }, |
45 | defaults: { | |
50d6de9c C |
46 | actorId: actor.id, |
47 | targetActorId: targetActor.id, | |
350e31d6 C |
48 | state: 'accepted' |
49 | }, | |
ce548a10 | 50 | transaction: t |
350e31d6 | 51 | }) |
40ff5707 | 52 | |
50d6de9c C |
53 | if (actorFollow.state !== 'accepted') { |
54 | actorFollow.state = 'accepted' | |
55 | await actorFollow.save({ transaction: t }) | |
40ff5707 C |
56 | } |
57 | ||
50d6de9c C |
58 | actorFollow.ActorFollower = actor |
59 | actorFollow.ActorFollowing = targetActor | |
ce548a10 | 60 | |
50d6de9c C |
61 | // Target sends to actor he accepted the follow request |
62 | return sendAccept(actorFollow, t) | |
7a7724e6 | 63 | }) |
ce548a10 | 64 | |
85414add | 65 | logger.info('Actor %s is followed by actor %s.', targetActorURL, actor.url) |
7a7724e6 | 66 | } |