diff --git a/api/scripts/generate_body_schema.ts b/api/scripts/generate_body_schema.ts
new file mode 100644
index 00000000..69e62085
--- /dev/null
+++ b/api/scripts/generate_body_schema.ts
@@ -0,0 +1,59 @@
+// https://mermade.github.io/openapi-gui/#
+// https://editor.swagger.io/
+import path from "path";
+import fs from "fs";
+import * as TJS from "typescript-json-schema";
+import "missing-native-js-functions";
+const schemaPath = path.join(__dirname, "..", "assets", "schemas.json");
+
+const settings: TJS.PartialArgs = {
+ required: true,
+ ignoreErrors: true,
+ excludePrivate: true,
+ defaultNumberType: "integer",
+ noExtraProps: true,
+ defaultProps: false
+};
+const compilerOptions: TJS.CompilerOptions = {
+ strictNullChecks: false
+};
+const ExcludedSchemas = ["DefaultSchema", "Schema", "EntitySchema"];
+
+function main() {
+ const program = TJS.getProgramFromFiles(walk(path.join(__dirname, "..", "src", "routes")), compilerOptions);
+ const generator = TJS.buildGenerator(program, settings);
+ if (!generator || !program) return;
+
+ const schemas = generator.getUserSymbols().filter((x) => x.endsWith("Schema") && !ExcludedSchemas.includes(x));
+ console.log(schemas);
+
+ var definitions: any = {};
+
+ for (const name of schemas) {
+ const part = TJS.generateSchema(program, name, settings, [], generator as TJS.JsonSchemaGenerator);
+ if (!part) continue;
+
+ definitions = { ...definitions, ...part.definitions, [name]: { ...part, definitions: undefined } };
+ }
+
+ fs.writeFileSync(schemaPath, JSON.stringify(definitions, null, 4));
+}
+
+main();
+
+function walk(dir: string) {
+ var results = [] as string[];
+ var list = fs.readdirSync(dir);
+ list.forEach(function (file) {
+ file = dir + "/" + file;
+ var stat = fs.statSync(file);
+ if (stat && stat.isDirectory()) {
+ /* Recurse into a subdirectory */
+ results = results.concat(walk(file));
+ } else {
+ if (!file.endsWith(".ts")) return;
+ results.push(file);
+ }
+ });
+ return results;
+}
|