50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import { randomUUID } from 'node:crypto'
|
|
import { siteSettings } from '@/lib/services/site-settings'
|
|
|
|
export interface CloneSource {
|
|
id: string
|
|
name: string
|
|
furnidataUrl: string
|
|
nitroBaseUrl: string
|
|
iconBaseUrl: string
|
|
}
|
|
|
|
const KEY = 'clone_sources'
|
|
|
|
export async function listSources(): Promise<CloneSource[]> {
|
|
const raw = (await siteSettings.get(KEY, '[]')) ?? '[]'
|
|
try {
|
|
const arr = JSON.parse(raw)
|
|
return Array.isArray(arr) ? arr : []
|
|
} catch {
|
|
return []
|
|
}
|
|
}
|
|
|
|
export async function upsertSource(
|
|
src: Omit<CloneSource, 'id'> & { id?: string },
|
|
): Promise<CloneSource> {
|
|
const sources = await listSources()
|
|
const entry: CloneSource = {
|
|
id: src.id || randomUUID(),
|
|
name: src.name.trim(),
|
|
furnidataUrl: src.furnidataUrl.trim(),
|
|
nitroBaseUrl: src.nitroBaseUrl.trim().replace(/\/+$/, ''),
|
|
iconBaseUrl: src.iconBaseUrl.trim().replace(/\/+$/, ''),
|
|
}
|
|
const idx = sources.findIndex((s) => s.id === entry.id)
|
|
if (idx >= 0) sources[idx] = entry
|
|
else sources.push(entry)
|
|
await siteSettings.update(KEY, JSON.stringify(sources))
|
|
return entry
|
|
}
|
|
|
|
export async function deleteSource(id: string): Promise<void> {
|
|
const sources = (await listSources()).filter((s) => s.id !== id)
|
|
await siteSettings.update(KEY, JSON.stringify(sources))
|
|
}
|
|
|
|
export async function getSource(id: string): Promise<CloneSource | null> {
|
|
return (await listSources()).find((s) => s.id === id) ?? null
|
|
}
|