]>
Commit | Line | Data |
---|---|---|
136d7efd C |
1 | import { isActivityPubUrlValid } from '@server/helpers/custom-validators/activitypub/misc' |
2 | import { MIMETYPES } from '@server/initializers/constants' | |
3 | import { ActorModel } from '@server/models/actor/actor' | |
4 | import { FilteredModelAttributes } from '@server/types' | |
0628157f C |
5 | import { getLowercaseExtension } from '@shared/core-utils' |
6 | import { buildUUID } from '@shared/extra-utils' | |
d0800f76 | 7 | import { ActivityIconObject, ActivityPubActor, ActorImageType } from '@shared/models' |
136d7efd C |
8 | |
9 | function getActorAttributesFromObject ( | |
10 | actorObject: ActivityPubActor, | |
11 | followersCount: number, | |
12 | followingCount: number | |
13 | ): FilteredModelAttributes<ActorModel> { | |
14 | return { | |
15 | type: actorObject.type, | |
16 | preferredUsername: actorObject.preferredUsername, | |
17 | url: actorObject.id, | |
18 | publicKey: actorObject.publicKey.publicKeyPem, | |
19 | privateKey: null, | |
20 | followersCount, | |
21 | followingCount, | |
22 | inboxUrl: actorObject.inbox, | |
23 | outboxUrl: actorObject.outbox, | |
24 | followersUrl: actorObject.followers, | |
25 | followingUrl: actorObject.following, | |
26 | ||
27 | sharedInboxUrl: actorObject.endpoints?.sharedInbox | |
28 | ? actorObject.endpoints.sharedInbox | |
29 | : null | |
30 | } | |
31 | } | |
32 | ||
d0800f76 | 33 | function getImagesInfoFromObject (actorObject: ActivityPubActor, type: ActorImageType) { |
34 | const iconsOrImages = type === ActorImageType.AVATAR | |
35 | ? actorObject.icons || actorObject.icon | |
136d7efd C |
36 | : actorObject.image |
37 | ||
d0800f76 | 38 | return normalizeIconOrImage(iconsOrImages).map(iconOrImage => { |
39 | const mimetypes = MIMETYPES.IMAGE | |
136d7efd | 40 | |
d0800f76 | 41 | if (iconOrImage.type !== 'Image' || !isActivityPubUrlValid(iconOrImage.url)) return undefined |
136d7efd | 42 | |
d0800f76 | 43 | let extension: string |
136d7efd | 44 | |
d0800f76 | 45 | if (iconOrImage.mediaType) { |
46 | extension = mimetypes.MIMETYPE_EXT[iconOrImage.mediaType] | |
47 | } else { | |
48 | const tmp = getLowercaseExtension(iconOrImage.url) | |
136d7efd | 49 | |
d0800f76 | 50 | if (mimetypes.EXT_MIMETYPE[tmp] !== undefined) extension = tmp |
51 | } | |
136d7efd | 52 | |
d0800f76 | 53 | if (!extension) return undefined |
54 | ||
55 | return { | |
56 | name: buildUUID() + extension, | |
57 | fileUrl: iconOrImage.url, | |
58 | height: iconOrImage.height, | |
59 | width: iconOrImage.width, | |
60 | type | |
61 | } | |
62 | }) | |
136d7efd C |
63 | } |
64 | ||
65 | function getActorDisplayNameFromObject (actorObject: ActivityPubActor) { | |
66 | return actorObject.name || actorObject.preferredUsername | |
67 | } | |
68 | ||
69 | export { | |
70 | getActorAttributesFromObject, | |
d0800f76 | 71 | getImagesInfoFromObject, |
136d7efd C |
72 | getActorDisplayNameFromObject |
73 | } | |
d0800f76 | 74 | |
75 | // --------------------------------------------------------------------------- | |
76 | ||
77 | function normalizeIconOrImage (icon: ActivityIconObject | ActivityIconObject[]): ActivityIconObject[] { | |
78 | if (Array.isArray(icon)) return icon | |
79 | if (icon) return [ icon ] | |
80 | ||
81 | return [] | |
82 | } |