@orgiltse/service v1.0.2
import {
Router
} from "express";
import fs from "fs";
import path from "path";
import controller from "../utils/controller";
export const requirePath = basedir => (dirpath, _routers = [], action = "", onlyRoute) => {
try {
let isDirectory = false;
let ROUTE;
const accepted = (route) => {
return !_routers.find(router => {
return router.path === route.path && router.method === route.method;
});
};
try {
isDirectory = fs.lstatSync(path.normalize(basedir + "/" + dirpath)).isDirectory();
} catch (err) {
isDirectory = false;
}
if (isDirectory) {
fs.readdirSync(basedir + "/" + dirpath).forEach(file => {
let subpath = basedir + "/" + dirpath + "/" + file;
let filename = path.normalize(file).replace(/.^/.+$/, "");
if (fs.lstatSync(path.normalize(subpath)).isDirectory()) {
if (file === "logics" || file === "interface") return; // eslint-disable-next-line no-param-reassign
_routers = requirePath(basedir)(path.normalize("/" + dirpath + "/" + file), _routers, action + "/" + filename);
} else if (file.indexOf(".js.map") == -1) {
let obj = require(subpath);
Object.keys(obj).forEach(key => {
let model = objkey;
if (Array.isArray(model)) {
let path = model0 || action + "/" + filename, // Path
method = model1, // Method
func = model2; // Function
ROUTE = {
path: path,
method: method,
func: func
};
if (accepted(ROUTE)) _routers.push(ROUTE);
} else if (model) { // ONLY HTTP POST
ROUTE = {
path: action + "/" + filename,
method: "POST",
func: model
};
if (accepted(ROUTE)) _routers.push(ROUTE);
}
});
}
});
} else {
let obj = require(path.normalize(basedir + "/" + dirpath));
Object.keys(obj).forEach(key => {
let model = objkey;
if (Array.isArray(model)) {
let path = model0 || onlyRoute, // Path
method = model1, // Method
func = model2; // Function
ROUTE = {
path: path,
method: method,
func: func
};
if (accepted(ROUTE)) _routers.push(ROUTE);
} else if (model) { // ONLY HTTP POST
ROUTE = {
path: onlyRoute,
method: "POST",
func: model
};
if (accepted(ROUTE)) _routers.push(ROUTE);
}
});
}
} catch (err) {
throw err;
}
return _routers;
};
export default (basedir, data) => {
const router = new Router();
const routes = (Array.isArray(data) ? data : data).reduce((accumulator, iterator) => {
return [...accumulator, ...requirePath("")(path.join(basedir, iterator), [], "", iterator)];
}, []);
routes.forEach(route => {
routerroute.method.toLowerCase()(route.path, controller(route.func));
});
return router;
};
5 years ago