/** 软件版本列表加载模型(任务 127):解析 /api/admin/versions data.items(snake);纯逻辑。 */ import { unwrap } from '../../api/envelope.ts' import { type SoftwareVersionItem, type SoftwareVersionList } from './version-dto.ts' function text(value: unknown): string { return typeof value === 'string' ? value.trim() : '' } function numberOrNull(value: unknown): number | null { return typeof value === 'number' && Number.isFinite(value) ? Math.floor(value) : null } /** 解析单条软件版本行;缺 id 视为无效。 */ export function toSoftwareVersionItem(raw: unknown): SoftwareVersionItem | null { if (!raw || typeof raw !== 'object') return null const r = raw as Record const id = numberOrNull(r.id) if (id === null) return null return { id, version: text(r.version), fileUrl: text(r.file_url ?? r.fileUrl), createdAt: text(r.created_at ?? r.createdAt), } } /** 归一化版本列表负载为前端结果;缺省回空列表。 */ export function parseSoftwareVersionList(payload: unknown): SoftwareVersionList { const data = unwrap(payload) const record = data && typeof data === 'object' ? (data as Record) : {} const items = Array.isArray(record.items) ? record.items.map((raw) => toSoftwareVersionItem(raw)).filter((item): item is SoftwareVersionItem => item !== null) : [] return { items } } /** 上传成功后返回的新版本行(data.item);无 item 回 null。 */ export function parseSoftwareVersionUpload(payload: unknown): SoftwareVersionItem | null { const data = unwrap(payload) if (!data || typeof data !== 'object') return null const item = (data as Record).item return item ? toSoftwareVersionItem(item) : null }