maggie-api
Version:
🧙♀️ A magical Express middleware to auto-generate CRUD APIs for Mongoose models with validation, unique keys, and middlewares.
54 lines (44 loc) • 1.66 kB
text/typescript
import { Router, RequestHandler } from "express";
import { createController } from "../controllers";
import { validateBody } from "../utils/validateBody";
import Joi from "joi";
import { ISetting, MaggiePayload } from "../utils/interface";
const createMaggie = ({ prefix, models }: MaggiePayload): Router => {
const router = Router();
models.forEach(
({
model,
path,
validationSchema,
primaryKey,
middleWares = [],
getKeys = [],
getByIdKeys = [],
settings,
}) => {
const settingsObj: ISetting = {
getByIdKeys: settings?.getById?.keys ?? getByIdKeys,
getKeys: settings?.get?.keys ?? getKeys,
primaryKey,
...settings,
};
const controller = createController(model, settingsObj);
const subRouter = Router();
const middlewareStack: RequestHandler[] = [...middleWares];
const bulkMiddlewareStack: RequestHandler[] = [...middleWares];
if (validationSchema) {
middlewareStack.push(validateBody(validationSchema));
const bulkValidationSchema = Joi.array().items(validationSchema);
bulkMiddlewareStack.push(validateBody(bulkValidationSchema));
}
subRouter.post("/", ...middlewareStack, controller.addOrUpdate);
subRouter.post("/bulk", ...bulkMiddlewareStack, controller.insertMany);
subRouter.delete("/:id", ...middleWares, controller.remove);
subRouter.get("/", ...middleWares, controller.getAll);
subRouter.get("/:id", ...middleWares, controller.getById);
router.use(`${prefix}/${path}`, subRouter);
}
);
return router;
};
export default createMaggie;