import type { Event } from 'nostr-tools' import type { Purchase, ReviewTip, Sponsoring } from '@/types/nostr' import { buildObjectId, parseObjectId } from '../urlGenerator' import { extractPurchaseFromEvent, extractReviewTipFromEvent, extractSponsoringFromEvent } from '../metadataExtractor' import { readTextTag } from './shared' /** * Parse purchase from zap receipt event (kind 9735) */ export async function parsePurchaseFromEvent(event: Event): Promise { try { const extracted = await extractPurchaseFromEvent(event) if (!extracted) { return null } const { id, hash, version, index } = parseObjectIdentity(extracted.id) return { id, hash, version, index, payerPubkey: extracted.payerPubkey, articleId: extracted.articleId, authorPubkey: extracted.authorPubkey, amount: extracted.amount, paymentHash: extracted.paymentHash, createdAt: event.created_at, kindType: 'purchase', } } catch (e) { console.error('Error parsing purchase:', e) return null } } /** * Parse sponsoring from zap receipt event (kind 9735) */ export async function parseSponsoringFromEvent(event: Event): Promise { try { const extracted = await extractSponsoringFromEvent(event) if (!extracted) { return null } const { id, hash, version, index } = parseObjectIdentity(extracted.id) const textTag = readTextTag(event.tags) return { id, hash, version, index, payerPubkey: extracted.payerPubkey, authorPubkey: extracted.authorPubkey, amount: extracted.amount, paymentHash: extracted.paymentHash, createdAt: event.created_at, ...(extracted.seriesId ? { seriesId: extracted.seriesId } : {}), ...(extracted.articleId ? { articleId: extracted.articleId } : {}), ...(textTag ? { text: textTag } : {}), kindType: 'sponsoring', } } catch (e) { console.error('Error parsing sponsoring:', e) return null } } /** * Parse review tip from zap receipt event (kind 9735) */ export async function parseReviewTipFromEvent(event: Event): Promise { try { const extracted = await extractReviewTipFromEvent(event) if (!extracted) { return null } const { id, hash, version, index } = parseObjectIdentity(extracted.id) const textTag = readTextTag(event.tags) return { id, hash, version, index, payerPubkey: extracted.payerPubkey, articleId: extracted.articleId, reviewId: extracted.reviewId, reviewerPubkey: extracted.reviewerPubkey, authorPubkey: extracted.authorPubkey, amount: extracted.amount, paymentHash: extracted.paymentHash, createdAt: event.created_at, ...(textTag ? { text: textTag } : {}), kindType: 'review_tip', } } catch (e) { console.error('Error parsing review tip:', e) return null } } function parseObjectIdentity(idValue: string): { id: string; hash: string; version: number; index: number } { const parsed = parseObjectId(idValue) const hash = parsed.hash ?? idValue const version = parsed.version ?? 0 const index = parsed.index ?? 0 const id = buildObjectId(hash, index, version) return { id, hash, version, index } }