19 lines
1.2 KiB
TypeScript
19 lines
1.2 KiB
TypeScript
import { NextResponse } from 'next/server'
|
|
import { detailGeneratorErrorResponse, requireDetailGeneratorUser } from '@/lib/detail-generator/access'
|
|
import { findDetailAsset } from '@/lib/detail-generator/repository'
|
|
import { readDetailFile } from '@/lib/detail-generator/storage'
|
|
import { assertDetailId } from '@/lib/detail-generator/validation'
|
|
export const runtime = 'nodejs'
|
|
export const dynamic = 'force-dynamic'
|
|
export async function GET(_request: Request, { params }: { params: { assetId: string } }) {
|
|
try {
|
|
const ownerId = await requireDetailGeneratorUser()
|
|
const asset = await findDetailAsset(assertDetailId(params.assetId), ownerId)
|
|
const buffer = await readDetailFile(asset.storageKey)
|
|
return new NextResponse(new Uint8Array(buffer), { headers: {
|
|
'Content-Type': asset.mimeType, 'Content-Length': String(buffer.length), 'Cache-Control': 'private, no-store', 'X-Content-Type-Options': 'nosniff',
|
|
'Content-Disposition': `${asset.mimeType.startsWith('image/') && asset.kind !== 'export' ? 'inline' : 'attachment'}; filename*=UTF-8''${encodeURIComponent(asset.name)}`,
|
|
} })
|
|
} catch (error) { return detailGeneratorErrorResponse(error) }
|
|
}
|