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) }
}