summary refs log tree commit diff
path: root/scripts/util
diff options
context:
space:
mode:
authorMadeline <46743919+MaddyUnderStars@users.noreply.github.com>2023-01-06 19:30:03 +1100
committerMadeline <46743919+MaddyUnderStars@users.noreply.github.com>2023-01-06 19:30:03 +1100
commit98d318fd88cc42d290add88a81b2d5d5915de019 (patch)
treebbf740cd8154144956f17a0c0251428efb569949 /scripts/util
parentDon't allow BaseClass props through schema (diff)
downloadserver-98d318fd88cc42d290add88a81b2d5d5915de019.tar.xz
add back openapi generation. todo: find way to keep route text descriptions in code, and find way to get usages of right/permission .hasThrow
Diffstat (limited to 'scripts/util')
-rw-r--r--scripts/util/getRouteDescriptions.js63
1 files changed, 63 insertions, 0 deletions
diff --git a/scripts/util/getRouteDescriptions.js b/scripts/util/getRouteDescriptions.js
new file mode 100644
index 00000000..21c36ca7
--- /dev/null
+++ b/scripts/util/getRouteDescriptions.js
@@ -0,0 +1,63 @@
+const { traverseDirectory } = require("lambert-server");
+const path = require("path");
+const express = require("express");
+const RouteUtility = require("../../dist/api/util/handlers/route.js");
+const Router = express.Router;
+
+const routes = new Map();
+let currentPath = "";
+let currentFile = "";
+const methods = ["get", "post", "put", "delete", "patch"];
+
+function registerPath(file, method, prefix, path, ...args) {
+	const urlPath = prefix + path;
+	const sourceFile = file.replace("/dist/", "/src/").replace(".js", ".ts");
+	const opts = args.find((x) => typeof x === "object");
+	if (opts) {
+		routes.set(urlPath + "|" + method, opts); // @ts-ignore
+		opts.file = sourceFile;
+		// console.log(method, urlPath, opts);
+	} else {
+		console.log(
+			`${sourceFile}\nrouter.${method}("${path}") is missing the "route()" description middleware\n`,
+		);
+	}
+}
+
+function routeOptions(opts) {
+	return opts;
+}
+
+// @ts-ignore
+RouteUtility.route = routeOptions;
+
+express.Router = (opts) => {
+	const path = currentPath;
+	const file = currentFile;
+	const router = Router(opts);
+
+	for (const method of methods) {
+		router[method] = registerPath.bind(null, file, method, path);
+	}
+
+	return router;
+};
+
+module.exports = function getRouteDescriptions() {
+	const root = path.join(__dirname, "..", "..", "dist", "api", "routes", "/");
+	traverseDirectory({ dirname: root, recursive: true }, (file) => {
+		currentFile = file;
+		let path = file.replace(root.slice(0, -1), "");
+		path = path.split(".").slice(0, -1).join("."); // trancate .js/.ts file extension of path
+		path = path.replaceAll("#", ":").replaceAll("\\", "/"); // replace # with : for path parameters and windows paths with slashes
+		if (path.endsWith("/index")) path = path.slice(0, "/index".length * -1); // delete index from path
+		currentPath = path;
+
+		try {
+			require(file);
+		} catch (error) {
+			console.error("error loading file " + file, error);
+		}
+	});
+	return routes;
+};