express-controller-sets
Version:
Unified package for Express.js controller sets, dynamic routing, and S3 file uploads.
64 lines (50 loc) • 2.02 kB
JavaScript
import express from "express";
import { ControllerSets } from "./ControllerSets.js";
import { fileUploadMiddleware } from "./s3upload.js";
/**
* Options consumed by the router itself rather than forwarded to the controller.
* Everything else is passed through, so new controller options do not require a
* corresponding change here.
*/
const ROUTER_ONLY_OPTIONS = ["middlewares", "path", "fields", "imgOptimizations", "upload"];
const controllerOptionsFrom = (options) =>
Object.fromEntries(
Object.entries(options).filter(([key]) => !ROUTER_ONLY_OPTIONS.includes(key)),
);
export const createRouter = (options = {}) => {
const { middlewares = [] } = options;
const router = express.Router();
if (middlewares.length > 0) {
router.use(middlewares);
}
const controller = new ControllerSets(controllerOptionsFrom(options));
router.get("/", controller.getAll);
router.post("/", controller.create);
router.get("/:id", controller.getById);
router.patch("/:id", controller.update);
router.delete("/:id", controller.delete);
return router;
};
export const createRouterS3upload = (options = {}) => {
const {
middlewares = [],
path = "files/",
fields = [{ name: "file", maxCount: 1 }],
imgOptimizations = undefined,
upload = {},
} = options;
const router = express.Router();
if (middlewares.length > 0) {
router.use(middlewares);
}
const controller = new ControllerSets(controllerOptionsFrom(options));
const uploadOptions = { ...upload, uploadPath: path, fields, imgOptimizations };
const uploadMiddleware = (req, res, next) =>
fileUploadMiddleware(req, res, next, uploadOptions);
router.get("/", controller.getAll);
router.post("/", uploadMiddleware, controller.create);
router.get("/:id", controller.getById);
router.patch("/:id", uploadMiddleware, controller.update);
router.delete("/:id", controller.delete);
return router;
};