44 lines
1.8 KiB
TypeScript
44 lines
1.8 KiB
TypeScript
/** 软件版本列表加载模型(任务 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<string, unknown>
|
|
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<unknown>(payload)
|
|
const record = data && typeof data === 'object' ? (data as Record<string, unknown>) : {}
|
|
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<unknown>(payload)
|
|
if (!data || typeof data !== 'object') return null
|
|
const item = (data as Record<string, unknown>).item
|
|
return item ? toSoftwareVersionItem(item) : null
|
|
}
|