98 lines
3.2 KiB
TypeScript
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'
|
|
}
|