]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/lib/activitypub/actors/shared/object-to-model-attributes.ts
Translated using Weblate (Persian)
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / actors / shared / object-to-model-attributes.ts
CommitLineData
136d7efd
C
1import { isActivityPubUrlValid } from '@server/helpers/custom-validators/activitypub/misc'
2import { MIMETYPES } from '@server/initializers/constants'
3import { ActorModel } from '@server/models/actor/actor'
4import { FilteredModelAttributes } from '@server/types'
0628157f
C
5import { getLowercaseExtension } from '@shared/core-utils'
6import { buildUUID } from '@shared/extra-utils'
d0800f76 7import { ActivityIconObject, ActivityPubActor, ActorImageType } from '@shared/models'
136d7efd
C
8
9function 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 33function getImagesInfoFromObject (actorObject: ActivityPubActor, type: ActorImageType) {
34 const iconsOrImages = type === ActorImageType.AVATAR
35 ? actorObject.icons || actorObject.icon
136d7efd
C
36 : actorObject.image
37
5800f354
C
38 return normalizeIconOrImage(iconsOrImages)
39 .map(iconOrImage => {
40 const mimetypes = MIMETYPES.IMAGE
136d7efd 41
5800f354 42 if (iconOrImage.type !== 'Image' || !isActivityPubUrlValid(iconOrImage.url)) return undefined
136d7efd 43
5800f354 44 let extension: string
136d7efd 45
5800f354
C
46 if (iconOrImage.mediaType) {
47 extension = mimetypes.MIMETYPE_EXT[iconOrImage.mediaType]
48 } else {
49 const tmp = getLowercaseExtension(iconOrImage.url)
136d7efd 50
5800f354
C
51 if (mimetypes.EXT_MIMETYPE[tmp] !== undefined) extension = tmp
52 }
136d7efd 53
5800f354 54 if (!extension) return undefined
d0800f76 55
5800f354
C
56 return {
57 name: buildUUID() + extension,
58 fileUrl: iconOrImage.url,
59 height: iconOrImage.height,
60 width: iconOrImage.width,
61 type
62 }
63 })
64 .filter(i => !!i)
136d7efd
C
65}
66
67function getActorDisplayNameFromObject (actorObject: ActivityPubActor) {
68 return actorObject.name || actorObject.preferredUsername
69}
70
71export {
72 getActorAttributesFromObject,
d0800f76 73 getImagesInfoFromObject,
136d7efd
C
74 getActorDisplayNameFromObject
75}
d0800f76 76
77// ---------------------------------------------------------------------------
78
79function normalizeIconOrImage (icon: ActivityIconObject | ActivityIconObject[]): ActivityIconObject[] {
80 if (Array.isArray(icon)) return icon
81 if (icon) return [ icon ]
82
83 return []
84}