58 lines
2.7 KiB
TypeScript
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
|
|
}
|