2025-03-03 12:06:50 +01:00

66 lines
1.9 KiB
TypeScript

import { Metadata, Script } from "@/lib/types";
import { promises as fs } from "fs";
import { NextResponse } from "next/server";
import path from "path";
export const dynamic = "force-static";
const publicJsonPath = path.join(process.cwd(), 'public/json');
const getJsonDirectory = async () => {
if (!(await fs.stat(publicJsonPath).catch(() => null))) {
throw new Error(`JSON path file not found: ${publicJsonPath}`);
}
const jsonPath = (await fs.readFile(publicJsonPath, "utf-8")).trim();
return path.resolve(process.cwd(), jsonPath);
};
const jsonDir = await getJsonDirectory();
const metadataFileName = "metadata.json";
const encoding = "utf-8";
const getMetadata = async () => {
const filePath = path.resolve(jsonDir, metadataFileName);
const fileContent = await fs.readFile(filePath, encoding);
const metadata: Metadata = JSON.parse(fileContent);
return metadata;
};
const getScripts = async () => {
const filePaths = (await fs.readdir(jsonDir))
.filter((fileName) => fileName !== metadataFileName)
.map((fileName) => path.resolve(jsonDir, fileName));
const scripts = await Promise.all(
filePaths.map(async (filePath) => {
const fileContent = await fs.readFile(filePath, encoding);
const script: Script = JSON.parse(fileContent);
return script;
}),
);
return scripts;
};
export async function GET() {
try {
const metadata = await getMetadata();
const scripts = await getScripts();
const categories = metadata.categories
.map((category) => {
category.scripts = scripts.filter((script) =>
script.categories.includes(category.id),
);
return category;
})
.sort((a, b) => a.sort_order - b.sort_order);
return NextResponse.json(categories);
} catch (error) {
console.error(error as Error);
return NextResponse.json(
{ error: "Failed to fetch categories" },
{ status: 500 },
);
}
}