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'
5 import { getLowercaseExtension } from '@shared/core-utils'
6 import { buildUUID } from '@shared/extra-utils'
7 import { ActivityPubActor, ActorImageType } from '@shared/models'
9 function getActorAttributesFromObject (
10 actorObject: ActivityPubActor,
11 followersCount: number,
12 followingCount: number
13 ): FilteredModelAttributes<ActorModel> {
15 type: actorObject.type,
16 preferredUsername: actorObject.preferredUsername,
18 publicKey: actorObject.publicKey.publicKeyPem,
22 inboxUrl: actorObject.inbox,
23 outboxUrl: actorObject.outbox,
24 followersUrl: actorObject.followers,
25 followingUrl: actorObject.following,
27 sharedInboxUrl: actorObject.endpoints?.sharedInbox
28 ? actorObject.endpoints.sharedInbox
33 function getImageInfoFromObject (actorObject: ActivityPubActor, type: ActorImageType) {
34 const mimetypes = MIMETYPES.IMAGE
35 const icon = type === ActorImageType.AVATAR
39 if (!icon || icon.type !== 'Image' || !isActivityPubUrlValid(icon.url)) return undefined
44 extension = mimetypes.MIMETYPE_EXT[icon.mediaType]
46 const tmp = getLowercaseExtension(icon.url)
48 if (mimetypes.EXT_MIMETYPE[tmp] !== undefined) extension = tmp
51 if (!extension) return undefined
54 name: buildUUID() + extension,
62 function getActorDisplayNameFromObject (actorObject: ActivityPubActor) {
63 return actorObject.name || actorObject.preferredUsername
67 getActorAttributesFromObject,
68 getImageInfoFromObject,
69 getActorDisplayNameFromObject