]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/lib/activitypub/process/process-follow.ts
Unfollow with host
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / process / process-follow.ts
CommitLineData
3fd3ab2d
C
1import { ActivityFollow } from '../../../../shared/models/activitypub'
2import { logger, retryTransactionWrapper } from '../../../helpers'
3import { sequelizeTypescript } from '../../../initializers'
50d6de9c
C
4import { ActorModel } from '../../../models/activitypub/actor'
5import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
6import { getOrCreateActorAndServerAndModel } from '../actor'
3fd3ab2d 7import { sendAccept } from '../send'
7a7724e6
C
8
9async 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
18export {
19 processFollowActivity
20}
21
22// ---------------------------------------------------------------------------
23
50d6de9c 24function 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 33async 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
39fdb3c0 65 logger.info('Actor %s is followed by actor %s.', actor.url, targetActorURL)
7a7724e6 66}