109 lines
3.3 KiB
TypeScript
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 }
|
|
}
|