Newer
Older
ServerGenerator / src / MiddlewareGenerator.ts
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;
}`;
}