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

109 lines
3.3 KiB
TypeScript

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<Purchase | null> {
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<Sponsoring | null> {
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<ReviewTip | null> {
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 }
}