Files
crawler-plugin/admin-frontend-vue/src/pages/records/version-model.ts
T

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
}