diff --git a/.gitignore b/.gitignore index 60569e8..adf9387 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store .env dist/ node_modules/ diff --git a/package-lock.json b/package-lock.json index a61c65c..38b954b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,13 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "and": "^0.0.3", "dotenv": "^16.0.3", "express": "^4.18.2", "mongodb": "^5.2.0", "stream-json": "^1.8.0", + "swagger-autogen": "^2.23.4", + "swagger-ui-express": "^5.0.0", "winston": "^3.9.0" }, "devDependencies": { @@ -2909,6 +2912,11 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/and": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/and/-/and-0.0.3.tgz", + "integrity": "sha512-ns0tgq+jQFbDhAu5wrE+M7V87E4L3N8ZTJfRKVxafi7g0BSEM6JnwhL57HyR1XMHBeRfGPWZxq+SH1bZeUTiTw==" + }, "node_modules/ansi-escapes": { "version": "4.3.2", "dev": true, @@ -3093,7 +3101,6 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -3162,7 +3169,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3495,7 +3501,6 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, "license": "MIT" }, "node_modules/content-disposition": { @@ -3573,7 +3578,6 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4354,7 +4358,6 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -4433,7 +4436,6 @@ }, "node_modules/glob": { "version": "7.2.3", - "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -4687,7 +4689,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -5498,7 +5499,6 @@ }, "node_modules/json5": { "version": "2.2.3", - "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -5715,7 +5715,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -6069,7 +6068,6 @@ }, "node_modules/once": { "version": "1.4.0", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -6205,7 +6203,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7012,6 +7009,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swagger-autogen": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.4.tgz", + "integrity": "sha512-ULBL813nFS87VU9DAgdzaKfjcQEpJvO/N4sSoMXOaA9B5SGSSSA1WY04ao2LHaPGhZTPVCH6lD90suiODtSGeA==", + "dependencies": { + "acorn": "^7.4.1", + "deepmerge": "^4.2.2", + "glob": "^7.1.7", + "json5": "^2.2.3" + } + }, + "node_modules/swagger-autogen/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz", + "integrity": "sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==" + }, + "node_modules/swagger-ui-express": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", + "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, "node_modules/tar-stream": { "version": "2.2.0", "dev": true, @@ -7492,7 +7530,6 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { @@ -9584,6 +9621,11 @@ "uri-js": "^4.2.2" } }, + "and": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/and/-/and-0.0.3.tgz", + "integrity": "sha512-ns0tgq+jQFbDhAu5wrE+M7V87E4L3N8ZTJfRKVxafi7g0BSEM6JnwhL57HyR1XMHBeRfGPWZxq+SH1bZeUTiTw==" + }, "ansi-escapes": { "version": "4.3.2", "dev": true, @@ -9709,8 +9751,7 @@ } }, "balanced-match": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "base64-js": { "version": "1.5.1", @@ -9752,7 +9793,6 @@ }, "brace-expansion": { "version": "1.1.11", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9949,8 +9989,7 @@ "dev": true }, "concat-map": { - "version": "0.0.1", - "dev": true + "version": "0.0.1" }, "content-disposition": { "version": "0.5.4", @@ -10003,8 +10042,7 @@ "dev": true }, "deepmerge": { - "version": "4.3.1", - "dev": true + "version": "4.3.1" }, "delayed-stream": { "version": "1.0.0", @@ -10497,8 +10535,7 @@ "dev": true }, "fs.realpath": { - "version": "1.0.0", - "dev": true + "version": "1.0.0" }, "fsevents": { "version": "2.3.2", @@ -10538,7 +10575,6 @@ }, "glob": { "version": "7.2.3", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10681,7 +10717,6 @@ }, "inflight": { "version": "1.0.6", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -11228,8 +11263,7 @@ "dev": true }, "json5": { - "version": "2.2.3", - "dev": true + "version": "2.2.3" }, "kleur": { "version": "3.0.3", @@ -11367,7 +11401,6 @@ }, "minimatch": { "version": "3.1.2", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -11584,7 +11617,6 @@ }, "once": { "version": "1.4.0", - "dev": true, "requires": { "wrappy": "1" } @@ -11668,8 +11700,7 @@ "dev": true }, "path-is-absolute": { - "version": "1.0.1", - "dev": true + "version": "1.0.1" }, "path-key": { "version": "3.1.1", @@ -12145,6 +12176,37 @@ "version": "1.0.0", "dev": true }, + "swagger-autogen": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.4.tgz", + "integrity": "sha512-ULBL813nFS87VU9DAgdzaKfjcQEpJvO/N4sSoMXOaA9B5SGSSSA1WY04ao2LHaPGhZTPVCH6lD90suiODtSGeA==", + "requires": { + "acorn": "^7.4.1", + "deepmerge": "^4.2.2", + "glob": "^7.1.7", + "json5": "^2.2.3" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "swagger-ui-dist": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz", + "integrity": "sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==" + }, + "swagger-ui-express": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", + "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", + "requires": { + "swagger-ui-dist": ">=5.0.0" + } + }, "tar-stream": { "version": "2.2.0", "dev": true, @@ -12426,8 +12488,7 @@ } }, "wrappy": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "write-file-atomic": { "version": "4.0.2", diff --git a/package.json b/package.json index 7b5730d..0b05d2f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "prettier": "prettier '**/*.{js,jsx,ts,tsx,json,md}'", "start": "node ./dist/index.js", - "test": "jest" + "test": "jest", + "swagger-autogen": "node swagger.mjs" }, "engines": { "node": "^18", @@ -21,10 +22,13 @@ "author": "", "license": "ISC", "dependencies": { + "and": "^0.0.3", "dotenv": "^16.0.3", "express": "^4.18.2", "mongodb": "^5.2.0", "stream-json": "^1.8.0", + "swagger-autogen": "^2.23.4", + "swagger-ui-express": "^5.0.0", "winston": "^3.9.0" }, "devDependencies": { diff --git a/swagger.mjs b/swagger.mjs new file mode 100644 index 0000000..ae78d36 --- /dev/null +++ b/swagger.mjs @@ -0,0 +1,6 @@ +import swaggerAutogen from 'swagger-autogen'; + +const outputFile = './swagger_output.json'; +const endpointsFiles = ['./src/routes/builds.ts', './src/routes/projects.ts']; + +swaggerAutogen(outputFile, endpointsFiles); \ No newline at end of file diff --git a/swagger_output.json b/swagger_output.json new file mode 100644 index 0000000..5cb51c0 --- /dev/null +++ b/swagger_output.json @@ -0,0 +1,147 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0.0", + "title": "REST API", + "description": "" + }, + "host": "localhost:3000", + "basePath": "/", + "schemes": [ + "http" + ], + "paths": { + "/{buildId}/documents": { + "get": { + "description": "", + "parameters": [ + { + "name": "buildId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "req-id", + "in": "header", + "type": "string" + } + ], + "responses": { + "default": { + "description": "" + } + } + } + }, + "/": { + "get": { + "description": "", + "parameters": [ + { + "name": "req-id", + "in": "header", + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/{snootyProject}/documents": { + "get": { + "description": "", + "parameters": [ + { + "name": "snootyProject", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "updated", + "in": "query", + "type": "string" + }, + { + "name": "req-id", + "in": "header", + "type": "string" + } + ], + "responses": { + "default": { + "description": "" + } + } + } + }, + "/{snootyProject}/{branch}/documents": { + "get": { + "description": "", + "parameters": [ + { + "name": "snootyProject", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "branch", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "req-id", + "in": "header", + "type": "string" + } + ], + "responses": { + "default": { + "description": "" + } + } + } + }, + "/{snootyProject}/{branch}/documents/updated/{timestamp}": { + "get": { + "description": "", + "parameters": [ + { + "name": "snootyProject", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "branch", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "timestamp", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "req-id", + "in": "header", + "type": "string" + } + ], + "responses": { + "default": { + "description": "" + } + } + } + } + } +} \ No newline at end of file