102 lines
3.6 KiB
TypeScript
102 lines
3.6 KiB
TypeScript
import { extractTagsFromEvent } from '../nostrTagSystem'
|
|
import { parseObjectId } from '../urlGenerator'
|
|
|
|
export type ExtractedTags = ReturnType<typeof extractTagsFromEvent>
|
|
|
|
export function mapNostrCategoryToLegacy(category: string | undefined): 'science-fiction' | 'scientific-research' | undefined {
|
|
if (category === 'sciencefiction') {
|
|
return 'science-fiction'
|
|
}
|
|
if (category === 'research') {
|
|
return 'scientific-research'
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
export function getPreviewContent(content: string, previewTag?: string): { previewContent: string } {
|
|
const lines = content.split('\n')
|
|
const previewContent = previewTag ?? lines[0] ?? content.substring(0, 200)
|
|
return { previewContent }
|
|
}
|
|
|
|
export function readRewardInfo(eventTags: string[][]): { rewarded: boolean; rewardAmount: number | undefined } {
|
|
const rewarded = eventTags.some((tag) => tag[0] === 'rewarded' && tag[1] === 'true')
|
|
const rewardAmountTag = eventTags.find((tag) => tag[0] === 'reward_amount')?.[1]
|
|
const rewardAmountRaw = rewardAmountTag ? Number.parseInt(rewardAmountTag, 10) : Number.NaN
|
|
const rewardAmount = Number.isNaN(rewardAmountRaw) ? undefined : rewardAmountRaw
|
|
return { rewarded, rewardAmount }
|
|
}
|
|
|
|
export function readTextTag(eventTags: string[][]): string | undefined {
|
|
return eventTags.find((tag) => tag[0] === 'text')?.[1]
|
|
}
|
|
|
|
export function readSeriesInput(params: {
|
|
tags: ExtractedTags
|
|
eventContent: string
|
|
}): { idTag: string | undefined; defaultVersion: number; title: string; description: string; preview: string; coverUrl: string; categoryTag: string } | null {
|
|
if (params.tags.type !== 'series' || !params.tags.title || !params.tags.description) {
|
|
return null
|
|
}
|
|
return {
|
|
idTag: params.tags.id,
|
|
defaultVersion: params.tags.version ?? 0,
|
|
title: params.tags.title,
|
|
description: params.tags.description,
|
|
preview: params.tags.preview ?? params.eventContent.substring(0, 200),
|
|
coverUrl: params.tags.coverUrl ?? '',
|
|
categoryTag: params.tags.category ?? 'sciencefiction',
|
|
}
|
|
}
|
|
|
|
export function readReviewInput(tags: ExtractedTags): { idTag: string | undefined; defaultVersion: number; articleId: string; reviewerPubkey: string; title: string | undefined; description: string } | null {
|
|
if (tags.type !== 'quote' || !tags.articleId || !tags.reviewerPubkey) {
|
|
return null
|
|
}
|
|
return {
|
|
idTag: tags.id,
|
|
defaultVersion: tags.version ?? 0,
|
|
articleId: tags.articleId,
|
|
reviewerPubkey: tags.reviewerPubkey,
|
|
title: tags.title,
|
|
description: tags.description ?? '',
|
|
}
|
|
}
|
|
|
|
export interface ObjectIdParts {
|
|
hash: string
|
|
version: number
|
|
index: number
|
|
}
|
|
|
|
export function parseObjectIdPartsFromTag(params: { idTag: string; defaultVersion: number; defaultIndex: number }): ObjectIdParts {
|
|
const parsed = parseObjectId(params.idTag)
|
|
const hash = parsed.hash ?? params.idTag
|
|
const version = parsed.version ?? params.defaultVersion
|
|
const index = parsed.index ?? params.defaultIndex
|
|
return { hash, version, index }
|
|
}
|
|
|
|
export async function resolveObjectIdParts(params: {
|
|
idTag?: string
|
|
defaultVersion: number
|
|
defaultIndex: number
|
|
generateHash: () => Promise<string>
|
|
}): Promise<ObjectIdParts> {
|
|
if (params.idTag) {
|
|
return parseObjectIdPartsFromTag({ idTag: params.idTag, defaultVersion: params.defaultVersion, defaultIndex: params.defaultIndex })
|
|
}
|
|
const hash = await params.generateHash()
|
|
return { hash, version: params.defaultVersion, index: params.defaultIndex }
|
|
}
|
|
|
|
export function resolveThumbnailUrl(tags: ExtractedTags): string {
|
|
if (typeof tags.bannerUrl === 'string') {
|
|
return tags.bannerUrl
|
|
}
|
|
if (typeof tags.pictureUrl === 'string') {
|
|
return tags.pictureUrl
|
|
}
|
|
return ''
|
|
}
|