67 lines
2.3 KiB
TypeScript
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
|
|
}
|