2026-01-13 14:49:19 +01:00

98 lines
3.2 KiB
TypeScript

import type { Event } from 'nostr-tools'
import { generateAuthorHashId } from '../hashIdGenerator'
import { parseObjectId } from '../urlGenerator'
import { extractTagsFromEvent } from '../nostrTagSystem'
import type { PresentationProfileData } from './profileJson'
type ExtractedTags = ReturnType<typeof extractTagsFromEvent>
export function mapTagCategoryToOriginalCategory(category: unknown): 'science-fiction' | 'scientific-research' | undefined {
if (category === 'sciencefiction') {
return 'science-fiction'
}
if (category === 'research') {
return 'scientific-research'
}
return undefined
}
export async function resolvePresentationIdParts(params: {
tags: ExtractedTags
event: Event
profileData: PresentationProfileData | null
}): Promise<{ hash: string; version: number; index: number }> {
const version = typeof params.tags.version === 'number' ? params.tags.version : 0
const index = 0
const fromIdTag = resolvePresentationIdPartsFromIdTag(params.tags.id, version, index)
if (fromIdTag) {
return fromIdTag
}
const mainnetAddress = resolvePresentationMainnetAddressCandidate(params.profileData, params.tags)
const pictureUrl = resolvePresentationPictureUrlCandidate(params.profileData, params.tags)
const hash = await generateAuthorHashId({
pubkey: params.event.pubkey,
authorName: resolveOptionalString(params.profileData?.authorName),
presentation: resolveOptionalString(params.profileData?.presentation),
contentDescription: resolveOptionalString(params.profileData?.contentDescription),
mainnetAddress,
pictureUrl,
category: resolvePresentationHashCategory(params.profileData, params.tags),
})
return { hash, version, index }
}
function resolvePresentationIdPartsFromIdTag(
idTag: string | undefined,
defaultVersion: number,
defaultIndex: number
): { hash: string; version: number; index: number } | undefined {
if (!idTag) {
return undefined
}
const parsed = parseObjectId(idTag)
if (parsed.hash) {
return { hash: parsed.hash, version: parsed.version ?? defaultVersion, index: parsed.index ?? defaultIndex }
}
return { hash: idTag, version: defaultVersion, index: defaultIndex }
}
function resolveOptionalString(value: unknown): string {
return typeof value === 'string' ? value : ''
}
function resolvePresentationMainnetAddressCandidate(
profileData: PresentationProfileData | null,
tags: ExtractedTags
): string | undefined {
if (typeof profileData?.mainnetAddress === 'string') {
return profileData.mainnetAddress
}
return typeof tags.mainnetAddress === 'string' ? tags.mainnetAddress : undefined
}
function resolvePresentationPictureUrlCandidate(
profileData: PresentationProfileData | null,
tags: ExtractedTags
): string | undefined {
if (typeof profileData?.pictureUrl === 'string') {
return profileData.pictureUrl
}
return typeof tags.pictureUrl === 'string' ? tags.pictureUrl : undefined
}
function resolvePresentationHashCategory(
profileData: PresentationProfileData | null,
tags: ExtractedTags
): string {
if (typeof profileData?.category === 'string') {
return profileData.category
}
return typeof tags.category === 'string' ? tags.category : 'sciencefiction'
}