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

58 lines
2.7 KiB
TypeScript

import { createPreviewEvent } from '../articleInvoice'
import type { ArticleDraft } from '../articlePublisher'
import type { AlbyInvoice } from '@/types/alby'
import type { Article } from '@/types/nostr'
import { finalizeEvent } from 'nostr-tools'
import { hexToBytes } from 'nostr-tools/utils'
import { buildParsedArticleFromDraft as buildParsedArticleFromDraftCore } from '../articleDraftToParsedArticle'
import { getPublishRelays } from '../relaySelection'
import { writeOrchestrator } from '../writeOrchestrator'
import { getPrivateKeyForSigning } from './shared'
export async function buildParsedArticleFromDraft(
draft: ArticleDraft,
invoice: AlbyInvoice,
authorPubkey: string
): Promise<{ article: Article; hash: string; version: number; index: number }> {
return buildParsedArticleFromDraftCore({ draft, invoice, authorPubkey })
}
export interface PublishPreviewWithInvoiceParams {
draft: ArticleDraft
invoice: AlbyInvoice
authorPubkey: string
presentationId: string
extraTags?: string[][]
customArticle?: Article
}
export async function publishPreviewWithInvoice(params: PublishPreviewWithInvoiceParams): Promise<import('nostr-tools').Event | null> {
const payload = await resolvePublicationPayload(params)
const previewEventTemplate = await createPreviewEvent({
draft: params.draft,
invoice: params.invoice,
authorPubkey: params.authorPubkey,
authorPresentationId: params.presentationId,
...(params.extraTags ? { extraTags: params.extraTags } : {}),
})
const privateKey = getPrivateKeyForSigning(undefined)
const event = finalizeEvent(previewEventTemplate, hexToBytes(privateKey))
return publishPublicationToRelays({ event, payload })
}
async function resolvePublicationPayload(params: PublishPreviewWithInvoiceParams): Promise<{ article: Article; hash: string; version: number; index: number }> {
if (params.customArticle) {
return { article: params.customArticle, hash: params.customArticle.hash, version: params.customArticle.version, index: params.customArticle.index ?? 0 }
}
return buildParsedArticleFromDraft(params.draft, params.invoice, params.authorPubkey)
}
async function publishPublicationToRelays(params: { event: import('nostr-tools').Event; payload: { article: Article; hash: string; version: number; index: number } }): Promise<import('nostr-tools').Event | null> {
const relays = await getPublishRelays()
const result = await writeOrchestrator.writeAndPublish(
{ objectType: 'publication', hash: params.payload.hash, event: params.event, parsed: params.payload.article, version: params.payload.version, hidden: false, index: params.payload.index },
relays
)
return result.success ? params.event : null
}