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

217 lines
5.5 KiB
TypeScript

import type { Event } from 'nostr-tools'
import { extractTagsFromEvent } from '../nostrTagSystem'
import { parsePresentationEvent } from '../articlePublisherHelpersPresentation'
import {
parseArticleFromEvent,
parsePurchaseFromEvent,
parseReviewFromEvent,
parseReviewTipFromEvent,
parseSeriesFromEvent,
parseSponsoringFromEvent,
} from '../nostrEventParsing'
import {
logTargetEventAttempt,
logTargetEventCached,
logTargetEventDebug,
logTargetEventNotCached,
logTargetEventParsed,
logTargetEventSkipped,
} from './debug'
type ExtractedTags = ReturnType<typeof extractTagsFromEvent>
type WriteObjectToCache = typeof import('../helpers/writeObjectHelper').writeObjectToCache
export async function cachePlatformEvent(event: Event): Promise<void> {
const tags = extractTagsFromEvent(event)
const { writeObjectToCache } = await import('../helpers/writeObjectHelper')
logTargetEventDebug({ event, tags })
if (tags.hidden) {
logTargetEventSkipped({ event, tags })
return
}
if (await tryCacheAuthorEvent({ event, tags, writeObjectToCache })) {
return
}
if (await tryCacheSeriesEvent({ event, tags, writeObjectToCache })) {
return
}
if (await tryCachePublicationEvent({ event, tags, writeObjectToCache })) {
return
}
if (await tryCacheReviewEvent({ event, tags, writeObjectToCache })) {
return
}
await tryCacheZapReceiptEvent({ event, writeObjectToCache })
}
async function tryCacheAuthorEvent(params: {
event: Event
tags: ExtractedTags
writeObjectToCache: WriteObjectToCache
}): Promise<boolean> {
if (params.tags.type !== 'author') {
return false
}
logTargetEventAttempt({ event: params.event, message: 'Attempting to parse target event as author presentation' })
const parsed = await parsePresentationEvent(params.event)
logTargetEventParsed({ event: params.event, parsed })
if (!parsed?.hash) {
logTargetEventNotCached({ event: params.event, parsed })
return true
}
await params.writeObjectToCache({
objectType: 'author',
hash: parsed.hash,
event: params.event,
parsed,
version: params.tags.version,
hidden: params.tags.hidden,
index: parsed.index,
})
logTargetEventCached({ event: params.event, hash: parsed.hash })
return true
}
async function tryCacheSeriesEvent(params: {
event: Event
tags: ExtractedTags
writeObjectToCache: WriteObjectToCache
}): Promise<boolean> {
if (params.tags.type !== 'series') {
return false
}
const parsed = await parseSeriesFromEvent(params.event)
if (!parsed?.hash) {
return true
}
await params.writeObjectToCache({
objectType: 'series',
hash: parsed.hash,
event: params.event,
parsed,
version: params.tags.version,
hidden: params.tags.hidden,
index: parsed.index,
})
return true
}
async function tryCachePublicationEvent(params: {
event: Event
tags: ExtractedTags
writeObjectToCache: WriteObjectToCache
}): Promise<boolean> {
if (params.tags.type !== 'publication') {
return false
}
const parsed = await parseArticleFromEvent(params.event)
if (!parsed?.hash) {
return true
}
await params.writeObjectToCache({
objectType: 'publication',
hash: parsed.hash,
event: params.event,
parsed,
version: params.tags.version,
hidden: params.tags.hidden,
index: parsed.index,
})
return true
}
async function tryCacheReviewEvent(params: {
event: Event
tags: ExtractedTags
writeObjectToCache: WriteObjectToCache
}): Promise<boolean> {
if (params.tags.type !== 'quote') {
return false
}
const parsed = await parseReviewFromEvent(params.event)
if (!parsed?.hash) {
return true
}
await params.writeObjectToCache({
objectType: 'review',
hash: parsed.hash,
event: params.event,
parsed,
version: params.tags.version,
hidden: params.tags.hidden,
index: parsed.index,
})
return true
}
async function tryCacheZapReceiptEvent(params: { event: Event; writeObjectToCache: WriteObjectToCache }): Promise<boolean> {
if (params.event.kind !== 9735) {
return false
}
if (await tryCacheSponsoringZapReceipt(params)) {
return true
}
if (await tryCachePurchaseZapReceipt(params)) {
return true
}
if (await tryCacheReviewTipZapReceipt(params)) {
return true
}
return true
}
async function tryCacheSponsoringZapReceipt(params: {
event: Event
writeObjectToCache: WriteObjectToCache
}): Promise<boolean> {
const sponsoring = await parseSponsoringFromEvent(params.event)
if (!sponsoring?.hash) {
return false
}
await params.writeObjectToCache({
objectType: 'sponsoring',
hash: sponsoring.hash,
event: params.event,
parsed: sponsoring,
index: sponsoring.index,
})
return true
}
async function tryCachePurchaseZapReceipt(params: { event: Event; writeObjectToCache: WriteObjectToCache }): Promise<boolean> {
const purchase = await parsePurchaseFromEvent(params.event)
if (!purchase?.hash) {
return false
}
await params.writeObjectToCache({
objectType: 'purchase',
hash: purchase.hash,
event: params.event,
parsed: purchase,
index: purchase.index,
})
return true
}
async function tryCacheReviewTipZapReceipt(params: { event: Event; writeObjectToCache: WriteObjectToCache }): Promise<boolean> {
const reviewTip = await parseReviewTipFromEvent(params.event)
if (!reviewTip?.hash) {
return false
}
await params.writeObjectToCache({
objectType: 'review_tip',
hash: reviewTip.hash,
event: params.event,
parsed: reviewTip,
index: reviewTip.index,
})
return true
}