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

67 lines
2.3 KiB
TypeScript

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<Review | null> {
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<string> =>
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
}