27 lines
1.0 KiB
TypeScript
27 lines
1.0 KiB
TypeScript
import { getQuery, sendStream, setResponseHeader } from 'h3'
|
|
import { requireSiteSyncAuth } from '../../utils/access'
|
|
import { createApiError } from '../../utils/api-error'
|
|
import { validateStorageKey } from '../../utils/image-key'
|
|
import { getBackendForKey } from '../../utils/storage/resolver'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
await requireSiteSyncAuth(event)
|
|
|
|
const query = getQuery(event)
|
|
const key = typeof query.key === 'string' ? query.key.trim() : ''
|
|
if (!validateStorageKey(key)) {
|
|
createApiError(event, 'INVALID_REQUEST', '同步对象 key 无效', 400)
|
|
}
|
|
|
|
const backend = await getBackendForKey(key)
|
|
const stored = await backend.head(key)
|
|
if (!stored) {
|
|
createApiError(event, 'IMAGE_NOT_FOUND', `目标对象不存在:${key}`, 404)
|
|
}
|
|
|
|
setResponseHeader(event, 'Content-Type', stored.contentType)
|
|
setResponseHeader(event, 'Content-Length', stored.size)
|
|
setResponseHeader(event, 'Cache-Control', 'no-store')
|
|
return sendStream(event, await backend.createStream(key))
|
|
})
|