import { Description, FileWrite } from "./app"; import { dataAccessModuleName } from "./DataAccessGenerator"; import { modelModuleName } from "./ModelGenerator"; import { Collection } from "./MySchema"; import { collectionRoute } from "./OpenApiGenerator"; export function middlewareModuleName(collection: Collection): string { return `${collection.name}Middleware`; } export function generateMiddlewares(description: Description): FileWrite[] { return description.collections.map(generateMiddleware); } function generateMiddleware(collection: Collection): FileWrite { const definitions = [ defineImports(collection), defineCreateMiddlewareFunction(collection), ]; return { location: middlewareModuleName(collection) + ".ts", content: definitions.join("\n\n") + "\n", }; } function defineImports(collection: Collection): string { return `import express from "express"; import * as DataAccess from "./${dataAccessModuleName(collection)}"; import { findSingle, toPayload } from "./${modelModuleName(collection)}";`; } function defineCreateMiddlewareFunction(collection: Collection): string { const col = collection.name.toLowerCase(); const route = collectionRoute(collection); return `export function ${col}Middleware({ fileName }: { fileName: string }) { const ${col} = DataAccess.load(fileName); const route = express.Router(); // TODO get/post collection, get/post/delete single entity route.get("${route}/:id(\\d+)", (req, res) => { const id = Number.parseInt(req.params.id, undefined); const item = findSingle(${col}, id); if (item == null) { res.status(404).send("not found"); return; } res.send(toPayload(item)); }); route.get("${route}", (req, res) => { const items = ${col}.items; res.send(items.map(toPayload)); }); return route; }`; }