Spaces:
Running
Running
File size: 2,152 Bytes
1628025 433085e 1628025 433085e 1628025 3787f0d 1628025 fe4d244 3787f0d fe4d244 8b3449a 96594d4 1628025 fe4d244 1628025 8b3449a 1628025 ac9dbd5 8b3449a ac9dbd5 1628025 ac9dbd5 1628025 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
import { Router, Express } from "express";
import * as glob from "glob";
import path from "path";
import { BaseController } from "./lib/controllers/controller.base";
import { validationErrorHandler } from "./helpers/validation.helper";
export const setAppRoutes = async (app: Express) => {
const mainRouter = Router();
await importControllers(mainRouter);
setCustomRoutes(mainRouter);
app.use("/api/v1", mainRouter);
};
/* custom routes */
const setCustomRoutes = (router: Router) => {
router.get("/health", (_req: any, res: any) => {
res
.status(200)
.json({ success: true, message: "Server is up!", code: 200 });
});
router.use(validationErrorHandler);
router.all("*", (_req: any, res: any) => {
res
.status(404)
.json({ success: false, message: "Invalid URL!", code: 404 });
});
router.use((err, req, res, next) => {
try {
err.message = JSON.parse(err.message);
} catch (error) { }
res.status(err.status || 500).json({
status: err.status || 500,
message: err.message || "Internal Server Error",
});
console.error(err.message, err.stack);
});
};
/* importing all controllers */
const findControllerFiles = (): string[] => {
const controllersPath = path.relative(process.cwd(), path.join(__dirname, "**/*.controller.{ts,js}")).replace(/\\/g, "/")
return glob.sync(controllersPath, {}).map((file) => {
return path.resolve(file);
});
};
const importControllers = async (router: Router) => {
const files = findControllerFiles();
await Promise.all(
files.map(async (file) => {
const controllerClass = await importController(file);
if (!controllerClass) return;
const controller: BaseController = new (controllerClass as any)();
controller.setRoutes();
router.use(controller.prefix, controller.router);
})
);
};
const importController = async (file: string) => {
const controllers = Object.values(await import(file));
return controllers.find(
(controller: { prototype: typeof BaseController }) =>
controller.prototype instanceof BaseController
) as typeof BaseController;
};
|