diff options
Diffstat (limited to 'server/lib/activitypub/actors/shared/object-to-model-attributes.ts')
-rw-r--r-- | server/lib/activitypub/actors/shared/object-to-model-attributes.ts | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/server/lib/activitypub/actors/shared/object-to-model-attributes.ts b/server/lib/activitypub/actors/shared/object-to-model-attributes.ts new file mode 100644 index 000000000..66b22c952 --- /dev/null +++ b/server/lib/activitypub/actors/shared/object-to-model-attributes.ts | |||
@@ -0,0 +1,70 @@ | |||
1 | import { extname } from 'path' | ||
2 | import { v4 as uuidv4 } from 'uuid' | ||
3 | import { isActivityPubUrlValid } from '@server/helpers/custom-validators/activitypub/misc' | ||
4 | import { MIMETYPES } from '@server/initializers/constants' | ||
5 | import { ActorModel } from '@server/models/actor/actor' | ||
6 | import { FilteredModelAttributes } from '@server/types' | ||
7 | import { ActivityPubActor, ActorImageType } from '@shared/models' | ||
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 | |||
33 | function getImageInfoFromObject (actorObject: ActivityPubActor, type: ActorImageType) { | ||
34 | const mimetypes = MIMETYPES.IMAGE | ||
35 | const icon = type === ActorImageType.AVATAR | ||
36 | ? actorObject.icon | ||
37 | : actorObject.image | ||
38 | |||
39 | if (!icon || icon.type !== 'Image' || !isActivityPubUrlValid(icon.url)) return undefined | ||
40 | |||
41 | let extension: string | ||
42 | |||
43 | if (icon.mediaType) { | ||
44 | extension = mimetypes.MIMETYPE_EXT[icon.mediaType] | ||
45 | } else { | ||
46 | const tmp = extname(icon.url) | ||
47 | |||
48 | if (mimetypes.EXT_MIMETYPE[tmp] !== undefined) extension = tmp | ||
49 | } | ||
50 | |||
51 | if (!extension) return undefined | ||
52 | |||
53 | return { | ||
54 | name: uuidv4() + extension, | ||
55 | fileUrl: icon.url, | ||
56 | height: icon.height, | ||
57 | width: icon.width, | ||
58 | type | ||
59 | } | ||
60 | } | ||
61 | |||
62 | function getActorDisplayNameFromObject (actorObject: ActivityPubActor) { | ||
63 | return actorObject.name || actorObject.preferredUsername | ||
64 | } | ||
65 | |||
66 | export { | ||
67 | getActorAttributesFromObject, | ||
68 | getImageInfoFromObject, | ||
69 | getActorDisplayNameFromObject | ||
70 | } | ||