31 lines
1.7 KiB
TypeScript
31 lines
1.7 KiB
TypeScript
import type { NextApiRequest, NextApiResponse } from "next";
|
|
import { DocumentValidationError, documentHistoryPage, documentRevision, readDocument } from "@/lib/docs";
|
|
import { authorizeDocuments, documentApiError, pagination } from "@/lib/documents-api";
|
|
|
|
export default function handler(request: NextApiRequest, response: NextApiResponse) {
|
|
try {
|
|
if (!authorizeDocuments(request, response)) return;
|
|
if (request.method !== "GET") {
|
|
response.setHeader("Allow", "GET");
|
|
return response.status(405).end();
|
|
}
|
|
const slug = request.query.slug;
|
|
if (!Array.isArray(slug)) throw new DocumentValidationError("Invalid document slug");
|
|
const doc = readDocument(slug.join("/"));
|
|
if (!doc) return response.status(404).json({ error: "文档不存在", code: "not_found" });
|
|
if (request.query.revision !== undefined) {
|
|
if (request.query.history !== undefined || typeof request.query.revision !== "string" || !/^\d+$/.test(request.query.revision))
|
|
throw new DocumentValidationError("Invalid revision query");
|
|
const prior = documentRevision(doc.sourceSlug, Number(request.query.revision));
|
|
if (!prior) return response.status(404).json({ error: "修订不存在", code: "not_found" });
|
|
return response.status(200).json(prior);
|
|
}
|
|
if (request.query.history !== undefined) {
|
|
if (request.query.history !== "1") throw new DocumentValidationError("Use history=1");
|
|
const { limit, offset } = pagination(request);
|
|
return response.status(200).json(documentHistoryPage(doc.sourceSlug, limit, offset));
|
|
}
|
|
return response.status(200).json(doc);
|
|
} catch (error) { return documentApiError(response, error); }
|
|
}
|