Files
FileHost/server/api/site-sync/inventory.get.ts
T
2026-10-17 14:41:32 +08:00

39 lines
1.3 KiB
TypeScript

import { requireSiteSyncAuth } from '../../utils/access'
import { listAllImageIndexRows } from '../../utils/image-index'
import { listUserIdUsernameMap } from '../../utils/db'
import { collectMediaAssetKeys } from '../../utils/media-assets'
import { getBackendForKey } from '../../utils/storage/resolver'
import type { SiteSyncInventory } from '../../utils/site-sync/protocol'
export default defineEventHandler(async (event): Promise<SiteSyncInventory> => {
await requireSiteSyncAuth(event)
const rows = listAllImageIndexRows()
const objects = new Map<string, number>()
for (const row of rows) {
const backend = await getBackendForKey(row.key)
let keys: string[]
try {
keys = await collectMediaAssetKeys(row, backend)
} catch {
keys = [
...(Number(row.source_deleted ?? 0) !== 1 ? [row.key] : []),
...(row.thumb_key ? [row.thumb_key] : []),
...(row.hls_key ? [row.hls_key] : [])
]
}
for (const key of new Set(keys)) {
const stored = await backend.head(key)
if (stored) objects.set(key, stored.size)
}
}
return {
users: [...listUserIdUsernameMap().values()].sort(),
mediaKeys: rows.map(row => row.key),
objects: [...objects].map(([key, size]) => ({ key, size }))
}
})