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