25 lines
1.1 KiB
TypeScript
25 lines
1.1 KiB
TypeScript
import type { NextApiRequest, NextApiResponse } from "next";
|
|
import { documentApiError } from "@/lib/documents-api";
|
|
import { readDocumentImage } from "@/lib/document-images";
|
|
|
|
// The site proxy accepts a logged-in reader or a document API key on this route.
|
|
export default function handler(request: NextApiRequest, response: NextApiResponse) {
|
|
try {
|
|
response.setHeader("Cache-Control", "private, no-store");
|
|
response.setHeader("X-Content-Type-Options", "nosniff");
|
|
if (request.method !== "GET" && request.method !== "HEAD") {
|
|
response.setHeader("Allow", "GET, HEAD");
|
|
return response.status(405).end();
|
|
}
|
|
const id = request.query.id;
|
|
if (typeof id !== "string" || !/^[a-f0-9]{64}$/.test(id)) return response.status(404).end();
|
|
const bytes = readDocumentImage(id);
|
|
if (!bytes) return response.status(404).end();
|
|
response.setHeader("Content-Type", "image/webp");
|
|
response.setHeader("Content-Length", bytes.length);
|
|
return request.method === "HEAD" ? response.status(200).end() : response.status(200).send(bytes);
|
|
} catch (error) {
|
|
return documentApiError(response, error);
|
|
}
|
|
}
|