]>
Commit | Line | Data |
---|---|---|
136d7efd C |
1 | |
2 | import { checkUrlsSameHost } from '@server/helpers/activitypub' | |
3 | import { sanitizeAndCheckActorObject } from '@server/helpers/custom-validators/activitypub/actor' | |
4 | import { logger } from '@server/helpers/logger' | |
5 | import { doJSONRequest } from '@server/helpers/requests' | |
6 | import { ActivityPubActor, ActivityPubOrderedCollection } from '@shared/models' | |
7 | ||
8 | async function fetchRemoteActor (actorUrl: string): Promise<{ statusCode: number, actorObject: ActivityPubActor }> { | |
9 | logger.info('Fetching remote actor %s.', actorUrl) | |
10 | ||
11 | const { body, statusCode } = await doJSONRequest<ActivityPubActor>(actorUrl, { activityPub: true }) | |
12 | ||
13 | if (sanitizeAndCheckActorObject(body) === false) { | |
14 | logger.debug('Remote actor JSON is not valid.', { actorJSON: body }) | |
15 | return { actorObject: undefined, statusCode: statusCode } | |
16 | } | |
17 | ||
18 | if (checkUrlsSameHost(body.id, actorUrl) !== true) { | |
19 | logger.warn('Actor url %s has not the same host than its AP id %s', actorUrl, body.id) | |
20 | return { actorObject: undefined, statusCode: statusCode } | |
21 | } | |
22 | ||
23 | return { | |
24 | statusCode, | |
25 | ||
26 | actorObject: body | |
27 | } | |
28 | } | |
29 | ||
30 | async function fetchActorFollowsCount (actorObject: ActivityPubActor) { | |
31 | const followersCount = await fetchActorTotalItems(actorObject.followers) | |
32 | const followingCount = await fetchActorTotalItems(actorObject.following) | |
33 | ||
34 | return { followersCount, followingCount } | |
35 | } | |
36 | ||
37 | // --------------------------------------------------------------------------- | |
38 | export { | |
39 | fetchActorFollowsCount, | |
40 | fetchRemoteActor | |
41 | } | |
42 | ||
43 | // --------------------------------------------------------------------------- | |
44 | ||
45 | async function fetchActorTotalItems (url: string) { | |
46 | try { | |
47 | const { body } = await doJSONRequest<ActivityPubOrderedCollection<unknown>>(url, { activityPub: true }) | |
48 | ||
49 | return body.totalItems || 0 | |
50 | } catch (err) { | |
51 | logger.warn('Cannot fetch remote actor count %s.', url, { err }) | |
52 | return 0 | |
53 | } | |
54 | } |