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 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' }