import type { Event } from 'nostr-tools' import type { Review } from '@/types/nostr' import { extractTagsFromEvent } from '../nostrTagSystem' import { buildObjectId } from '../urlGenerator' import { generateHashId } from '../hashIdGenerator' import { readRewardInfo, readReviewInput, readTextTag, resolveObjectIdParts } from './shared' export async function parseReviewFromEvent(event: Event): Promise { try { const tags = extractTagsFromEvent(event) const input = readReviewInput(tags) if (!input) { return null } const { hash, version, index } = await resolveObjectIdParts({ ...(input.idTag ? { idTag: input.idTag } : {}), defaultVersion: input.defaultVersion, defaultIndex: 0, generateHash: async (): Promise => generateHashId({ type: 'quote', pubkey: event.pubkey, articleId: input.articleId, reviewerPubkey: input.reviewerPubkey, content: event.content, title: input.title ?? '', }), }) const rewardInfo = readRewardInfo(event.tags) const text = readTextTag(event.tags) return buildReviewFromParsed({ event, input, hash, version, index, rewardInfo, text }) } catch (e) { console.error('Error parsing review:', e) return null } } function buildReviewFromParsed(params: { event: Event input: { articleId: string; reviewerPubkey: string; title: string | undefined; description: string } hash: string version: number index: number rewardInfo: { rewarded: boolean; rewardAmount: number | undefined } text: string | undefined }): Review { const id = buildObjectId(params.hash, params.index, params.version) const review: Review = { id, hash: params.hash, version: params.version, index: params.index, articleId: params.input.articleId, authorPubkey: params.event.pubkey, reviewerPubkey: params.input.reviewerPubkey, content: params.event.content, description: params.input.description, createdAt: params.event.created_at, ...(params.input.title ? { title: params.input.title } : {}), ...(params.text ? { text: params.text } : {}), ...(params.rewardInfo.rewarded ? { rewarded: true } : {}), ...(params.rewardInfo.rewardAmount !== undefined ? { rewardAmount: params.rewardInfo.rewardAmount } : {}), } review.kindType = 'review' return review }