]>
Commit | Line | Data |
---|---|---|
4d4e5cd4 | 1 | import * as express from 'express' |
3fd3ab2d | 2 | import { UserRight } from '../../../../shared/models/users' |
da854ddd C |
3 | import { logger } from '../../../helpers/logger' |
4 | import { getFormattedObjects, getServerActor } from '../../../helpers/utils' | |
74dc3bca | 5 | import { SERVER_ACTOR_NAME } from '../../../initializers/constants' |
14893eb7 | 6 | import { sendAccept, sendReject, sendUndoFollow } from '../../../lib/activitypub/send' |
3fd3ab2d | 7 | import { |
5350fd8e C |
8 | asyncMiddleware, |
9 | authenticate, | |
10 | ensureUserHasRight, | |
11 | paginationValidator, | |
5350fd8e C |
12 | setBodyHostsPort, |
13 | setDefaultPagination, | |
14 | setDefaultSort | |
3fd3ab2d | 15 | } from '../../../middlewares' |
0e9c48c2 | 16 | import { |
14893eb7 | 17 | acceptOrRejectFollowerValidator, |
0e9c48c2 C |
18 | followersSortValidator, |
19 | followingSortValidator, | |
20 | followValidator, | |
14893eb7 | 21 | getFollowerValidator, |
0e9c48c2 C |
22 | removeFollowingValidator |
23 | } from '../../../middlewares/validators' | |
50d6de9c | 24 | import { ActorFollowModel } from '../../../models/activitypub/actor-follow' |
5350fd8e | 25 | import { JobQueue } from '../../../lib/job-queue' |
161b061d | 26 | import { removeRedundancyOf } from '../../../lib/redundancy' |
74dc3bca | 27 | import { sequelizeTypescript } from '../../../initializers/database' |
8424c402 | 28 | import { autoFollowBackIfNeeded } from '../../../lib/activitypub/follow' |
51548b31 | 29 | |
4610bc5b | 30 | const serverFollowsRouter = express.Router() |
4610bc5b | 31 | serverFollowsRouter.get('/following', |
8a02bd04 | 32 | paginationValidator, |
7a7724e6 | 33 | followingSortValidator, |
1174a847 | 34 | setDefaultSort, |
f05a1c30 | 35 | setDefaultPagination, |
7a7724e6 C |
36 | asyncMiddleware(listFollowing) |
37 | ) | |
38 | ||
9a27cdc2 | 39 | serverFollowsRouter.post('/following', |
8e696487 | 40 | authenticate, |
4610bc5b | 41 | ensureUserHasRight(UserRight.MANAGE_SERVER_FOLLOW), |
ce548a10 C |
42 | followValidator, |
43 | setBodyHostsPort, | |
5350fd8e | 44 | asyncMiddleware(followInstance) |
ce548a10 C |
45 | ) |
46 | ||
50d6de9c | 47 | serverFollowsRouter.delete('/following/:host', |
54141398 C |
48 | authenticate, |
49 | ensureUserHasRight(UserRight.MANAGE_SERVER_FOLLOW), | |
a2431b7d | 50 | asyncMiddleware(removeFollowingValidator), |
0e9c48c2 | 51 | asyncMiddleware(removeFollowing) |
54141398 C |
52 | ) |
53 | ||
4610bc5b | 54 | serverFollowsRouter.get('/followers', |
7a7724e6 C |
55 | paginationValidator, |
56 | followersSortValidator, | |
1174a847 | 57 | setDefaultSort, |
f05a1c30 | 58 | setDefaultPagination, |
7a7724e6 | 59 | asyncMiddleware(listFollowers) |
65fcc311 | 60 | ) |
65fcc311 | 61 | |
0e9c48c2 C |
62 | serverFollowsRouter.delete('/followers/:nameWithHost', |
63 | authenticate, | |
64 | ensureUserHasRight(UserRight.MANAGE_SERVER_FOLLOW), | |
14893eb7 C |
65 | asyncMiddleware(getFollowerValidator), |
66 | asyncMiddleware(removeOrRejectFollower) | |
67 | ) | |
68 | ||
69 | serverFollowsRouter.post('/followers/:nameWithHost/reject', | |
70 | authenticate, | |
71 | ensureUserHasRight(UserRight.MANAGE_SERVER_FOLLOW), | |
72 | asyncMiddleware(getFollowerValidator), | |
73 | acceptOrRejectFollowerValidator, | |
74 | asyncMiddleware(removeOrRejectFollower) | |
75 | ) | |
76 | ||
77 | serverFollowsRouter.post('/followers/:nameWithHost/accept', | |
78 | authenticate, | |
79 | ensureUserHasRight(UserRight.MANAGE_SERVER_FOLLOW), | |
80 | asyncMiddleware(getFollowerValidator), | |
81 | acceptOrRejectFollowerValidator, | |
82 | asyncMiddleware(acceptFollower) | |
0e9c48c2 C |
83 | ) |
84 | ||
65fcc311 C |
85 | // --------------------------------------------------------------------------- |
86 | ||
87 | export { | |
4610bc5b | 88 | serverFollowsRouter |
65fcc311 C |
89 | } |
90 | ||
91 | // --------------------------------------------------------------------------- | |
92 | ||
dae86118 | 93 | async function listFollowing (req: express.Request, res: express.Response) { |
50d6de9c | 94 | const serverActor = await getServerActor() |
b014b6b9 C |
95 | const resultList = await ActorFollowModel.listFollowingForApi( |
96 | serverActor.id, | |
97 | req.query.start, | |
98 | req.query.count, | |
99 | req.query.sort, | |
100 | req.query.search | |
101 | ) | |
7a7724e6 C |
102 | |
103 | return res.json(getFormattedObjects(resultList.data, resultList.total)) | |
104 | } | |
105 | ||
dae86118 | 106 | async function listFollowers (req: express.Request, res: express.Response) { |
50d6de9c | 107 | const serverActor = await getServerActor() |
b014b6b9 C |
108 | const resultList = await ActorFollowModel.listFollowersForApi( |
109 | serverActor.id, | |
110 | req.query.start, | |
111 | req.query.count, | |
112 | req.query.sort, | |
113 | req.query.search | |
114 | ) | |
eb080476 C |
115 | |
116 | return res.json(getFormattedObjects(resultList.data, resultList.total)) | |
65fcc311 | 117 | } |
ce548a10 | 118 | |
dae86118 | 119 | async function followInstance (req: express.Request, res: express.Response) { |
ce548a10 | 120 | const hosts = req.body.hosts as string[] |
06a05d5f | 121 | const follower = await getServerActor() |
350e31d6 | 122 | |
ce548a10 | 123 | for (const host of hosts) { |
06a05d5f C |
124 | const payload = { |
125 | host, | |
126 | name: SERVER_ACTOR_NAME, | |
127 | followerActorId: follower.id | |
128 | } | |
129 | ||
130 | JobQueue.Instance.createJob({ type: 'activitypub-follow', payload }) | |
5350fd8e | 131 | .catch(err => logger.error('Cannot create follow job for %s.', host, err)) |
ce548a10 C |
132 | } |
133 | ||
ce548a10 C |
134 | return res.status(204).end() |
135 | } | |
350e31d6 | 136 | |
0e9c48c2 | 137 | async function removeFollowing (req: express.Request, res: express.Response) { |
dae86118 | 138 | const follow = res.locals.follow |
54141398 | 139 | |
3fd3ab2d | 140 | await sequelizeTypescript.transaction(async t => { |
40ff5707 C |
141 | if (follow.state === 'accepted') await sendUndoFollow(follow, t) |
142 | ||
c48e82b5 C |
143 | // Disable redundancy on unfollowed instances |
144 | const server = follow.ActorFollowing.Server | |
145 | server.redundancyAllowed = false | |
146 | await server.save({ transaction: t }) | |
147 | ||
161b061d C |
148 | // Async, could be long |
149 | removeRedundancyOf(server.id) | |
150 | .catch(err => logger.error('Cannot remove redundancy of %s.', server.host, err)) | |
151 | ||
0f91ae62 | 152 | await follow.destroy({ transaction: t }) |
54141398 C |
153 | }) |
154 | ||
155 | return res.status(204).end() | |
156 | } | |
0e9c48c2 | 157 | |
14893eb7 | 158 | async function removeOrRejectFollower (req: express.Request, res: express.Response) { |
0e9c48c2 C |
159 | const follow = res.locals.follow |
160 | ||
5b9c965d | 161 | await sendReject(follow.ActorFollower, follow.ActorFollowing) |
0e9c48c2 C |
162 | |
163 | await follow.destroy() | |
164 | ||
165 | return res.status(204).end() | |
166 | } | |
14893eb7 C |
167 | |
168 | async function acceptFollower (req: express.Request, res: express.Response) { | |
169 | const follow = res.locals.follow | |
170 | ||
171 | await sendAccept(follow) | |
172 | ||
173 | follow.state = 'accepted' | |
174 | await follow.save() | |
175 | ||
8424c402 C |
176 | await autoFollowBackIfNeeded(follow) |
177 | ||
14893eb7 C |
178 | return res.status(204).end() |
179 | } |