80 lines
2.6 KiB
TypeScript
80 lines
2.6 KiB
TypeScript
import type { Event } from 'nostr-tools'
|
|
import { extractTagsFromEvent } from '../nostrTagSystem'
|
|
import { generateAuthorHashId } from '../hashIdGenerator'
|
|
import type { ExtractedAuthor } from './types'
|
|
import { getMetadataFromEvent } from './metadataJson'
|
|
import { firstString } from './utils'
|
|
|
|
export async function extractAuthorFromEvent(event: Event): Promise<ExtractedAuthor | null> {
|
|
const tags = extractTagsFromEvent(event)
|
|
if (tags.type !== 'author') {
|
|
return null
|
|
}
|
|
|
|
const metadata = getMetadataFromEvent(event)
|
|
if (metadata?.type !== 'author') {
|
|
return null
|
|
}
|
|
|
|
const data = buildAuthorDataFromMetadata({ event, tags, metadata })
|
|
const id = await generateAuthorHashId(data)
|
|
return buildExtractedAuthor({ eventId: event.id, id, data, metadata })
|
|
}
|
|
|
|
function buildAuthorDataFromMetadata(params: {
|
|
event: Event
|
|
tags: ReturnType<typeof extractTagsFromEvent>
|
|
metadata: Record<string, unknown>
|
|
}): {
|
|
pubkey: string
|
|
authorName: string
|
|
presentation: string
|
|
contentDescription: string
|
|
mainnetAddress?: string
|
|
pictureUrl?: string
|
|
category: string
|
|
} {
|
|
const pubkey = firstString(params.metadata.pubkey, params.event.pubkey) ?? params.event.pubkey
|
|
const mainnetAddress = firstString(params.metadata.mainnetAddress)
|
|
const pictureUrl = firstString(params.metadata.pictureUrl)
|
|
return {
|
|
pubkey,
|
|
authorName: firstString(params.metadata.authorName) ?? '',
|
|
presentation: firstString(params.metadata.presentation) ?? '',
|
|
contentDescription: firstString(params.metadata.contentDescription) ?? '',
|
|
...(mainnetAddress ? { mainnetAddress } : {}),
|
|
...(pictureUrl ? { pictureUrl } : {}),
|
|
category: firstString(params.metadata.category, params.tags.category, 'sciencefiction') ?? 'sciencefiction',
|
|
}
|
|
}
|
|
|
|
function buildExtractedAuthor(params: {
|
|
eventId: string
|
|
id: string
|
|
data: {
|
|
pubkey: string
|
|
authorName: string
|
|
presentation: string
|
|
contentDescription: string
|
|
mainnetAddress?: string
|
|
pictureUrl?: string
|
|
category: string
|
|
}
|
|
metadata: Record<string, unknown>
|
|
}): ExtractedAuthor {
|
|
const url = firstString(params.metadata.url)
|
|
return {
|
|
type: 'author',
|
|
id: params.id,
|
|
pubkey: params.data.pubkey,
|
|
authorName: params.data.authorName,
|
|
presentation: params.data.presentation,
|
|
contentDescription: params.data.contentDescription,
|
|
category: params.data.category,
|
|
eventId: params.eventId,
|
|
...(params.data.mainnetAddress ? { mainnetAddress: params.data.mainnetAddress } : {}),
|
|
...(params.data.pictureUrl ? { pictureUrl: params.data.pictureUrl } : {}),
|
|
...(url ? { url } : {}),
|
|
}
|
|
}
|