From 5fdbe7d2ce95b8eba0b23318af55a3f454d53eed Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 16:03:36 +0100 Subject: [PATCH 1/9] fix: add prefix to the all paths and fix 200 response od /generate --- openapi.yaml | 5 +++-- src/app.ts | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openapi.yaml b/openapi.yaml index 11e01d1d..3bc77bce 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -38,9 +38,10 @@ paths: '200': description: Template succesfully generated. content: - application/json: + application/octet-stream: schema: - $ref: '#/components/schemas/Template' + type: string + format: binary '400': description: Failed to generate the given template due to invalid AsyncAPI document. content: diff --git a/src/app.ts b/src/app.ts index 1fba70ec..6d5de48f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -60,7 +60,8 @@ export class App { private initializeControllers(controller: Controller[]) { controller.forEach(controller => { - this.app.use('/', controller.boot()); + // in the `openapi.yaml` we have prefix `v1` for all paths + this.app.use('/v1/', controller.boot()); }); } From 62192683a2a6c0cd04a26df6a5f6a348459d1b5f Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 16:16:19 +0100 Subject: [PATCH 2/9] fix tests --- src/controllers/tests/generator.controller.test.ts | 6 +++--- src/middlewares/request-body-validation.middleware.ts | 4 +++- .../tests/document-validation.middleware.test.ts | 6 +++--- src/middlewares/tests/problem.middleware.test.ts | 4 ++-- .../tests/request-body-validation.middleware.test.ts | 6 +++--- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/controllers/tests/generator.controller.test.ts b/src/controllers/tests/generator.controller.test.ts index 938bb81e..2214fc4a 100644 --- a/src/controllers/tests/generator.controller.test.ts +++ b/src/controllers/tests/generator.controller.test.ts @@ -11,7 +11,7 @@ describe('GeneratorController', () => { const app = new App([new GenerateController()]); return await request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', @@ -33,7 +33,7 @@ describe('GeneratorController', () => { const app = new App([new GenerateController()]); return await request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', @@ -52,7 +52,7 @@ describe('GeneratorController', () => { const app = new App([new GenerateController()]); return await request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', diff --git a/src/middlewares/request-body-validation.middleware.ts b/src/middlewares/request-body-validation.middleware.ts index 71fd4f30..30719c36 100644 --- a/src/middlewares/request-body-validation.middleware.ts +++ b/src/middlewares/request-body-validation.middleware.ts @@ -15,7 +15,9 @@ const ajv = new Ajv({ * Retrieve proper AJV's validator function, create or reuse it. */ async function getValidator(req: Request) { - const { path: reqPath, method } = req; + const method = req.method; + let reqPath = req.path; + reqPath = reqPath.startsWith('/v1') ? reqPath.replace('/v1', '') : reqPath; const schemaName = `${reqPath}->${method}`; const validate = ajv.getSchema(schemaName); diff --git a/src/middlewares/tests/document-validation.middleware.test.ts b/src/middlewares/tests/document-validation.middleware.test.ts index 46b7ee0e..d3e7d89e 100644 --- a/src/middlewares/tests/document-validation.middleware.test.ts +++ b/src/middlewares/tests/document-validation.middleware.test.ts @@ -21,7 +21,7 @@ describe('documentValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({}) .expect(200, { success: true, @@ -40,7 +40,7 @@ describe('documentValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({ asyncapi: { asyncapi: '2.2.0', @@ -97,7 +97,7 @@ describe('documentValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({ // without title, version and channels asyncapi: { diff --git a/src/middlewares/tests/problem.middleware.test.ts b/src/middlewares/tests/problem.middleware.test.ts index 89f3d990..ac943ce9 100644 --- a/src/middlewares/tests/problem.middleware.test.ts +++ b/src/middlewares/tests/problem.middleware.test.ts @@ -23,7 +23,7 @@ describe('problemMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({}) .expect(422, { type: ProblemException.createType('custom-problem'), @@ -43,7 +43,7 @@ describe('problemMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({}) .expect(200, { success: true, diff --git a/src/middlewares/tests/request-body-validation.middleware.test.ts b/src/middlewares/tests/request-body-validation.middleware.test.ts index 2df81d31..b479ebc9 100644 --- a/src/middlewares/tests/request-body-validation.middleware.test.ts +++ b/src/middlewares/tests/request-body-validation.middleware.test.ts @@ -20,7 +20,7 @@ describe('requestBodyValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', @@ -39,7 +39,7 @@ describe('requestBodyValidationMiddleware', () => { it('should throw error when request body is invalid', async () => { const TestController = createTestController({ - path: '/test', + path: '/generate', method: 'post', callback: (_, res) => { res.status(200).send({ success: true }); @@ -48,7 +48,7 @@ describe('requestBodyValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', From 5182d790222209c8fb16f3fcd8f2866b52cce101 Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 16:03:36 +0100 Subject: [PATCH 3/9] fix: add prefix to the all paths and fix 200 response od /generate --- openapi.yaml | 5 +++-- src/app.ts | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openapi.yaml b/openapi.yaml index 886337a1..0eb5b39f 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -38,9 +38,10 @@ paths: '200': description: Template successfully generated. content: - application/json: + application/octet-stream: schema: - $ref: '#/components/schemas/Template' + type: string + format: binary '400': description: Failed to generate the given template due to invalid AsyncAPI document. content: diff --git a/src/app.ts b/src/app.ts index 1fba70ec..6d5de48f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -60,7 +60,8 @@ export class App { private initializeControllers(controller: Controller[]) { controller.forEach(controller => { - this.app.use('/', controller.boot()); + // in the `openapi.yaml` we have prefix `v1` for all paths + this.app.use('/v1/', controller.boot()); }); } From cf6797f1f34f382df54f12c7bb6e37de4e8f7106 Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 16:16:19 +0100 Subject: [PATCH 4/9] fix tests --- src/controllers/tests/generator.controller.test.ts | 6 +++--- src/middlewares/request-body-validation.middleware.ts | 4 +++- .../tests/document-validation.middleware.test.ts | 6 +++--- src/middlewares/tests/problem.middleware.test.ts | 4 ++-- .../tests/request-body-validation.middleware.test.ts | 6 +++--- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/controllers/tests/generator.controller.test.ts b/src/controllers/tests/generator.controller.test.ts index 165b58f1..586e6c89 100644 --- a/src/controllers/tests/generator.controller.test.ts +++ b/src/controllers/tests/generator.controller.test.ts @@ -11,7 +11,7 @@ describe('GeneratorController', () => { const app = new App([new GenerateController()]); return request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', @@ -33,7 +33,7 @@ describe('GeneratorController', () => { const app = new App([new GenerateController()]); return request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', @@ -52,7 +52,7 @@ describe('GeneratorController', () => { const app = new App([new GenerateController()]); return request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', diff --git a/src/middlewares/request-body-validation.middleware.ts b/src/middlewares/request-body-validation.middleware.ts index 3d78438b..6a5834ee 100644 --- a/src/middlewares/request-body-validation.middleware.ts +++ b/src/middlewares/request-body-validation.middleware.ts @@ -15,7 +15,9 @@ const ajv = new Ajv({ * Retrieve proper AJV's validator function, create or reuse it. */ async function getValidator(req: Request) { - const { path: reqPath, method } = req; + const method = req.method; + let reqPath = req.path; + reqPath = reqPath.startsWith('/v1') ? reqPath.replace('/v1', '') : reqPath; const schemaName = `${reqPath}->${method}`; const validate = ajv.getSchema(schemaName); diff --git a/src/middlewares/tests/document-validation.middleware.test.ts b/src/middlewares/tests/document-validation.middleware.test.ts index 46b7ee0e..d3e7d89e 100644 --- a/src/middlewares/tests/document-validation.middleware.test.ts +++ b/src/middlewares/tests/document-validation.middleware.test.ts @@ -21,7 +21,7 @@ describe('documentValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({}) .expect(200, { success: true, @@ -40,7 +40,7 @@ describe('documentValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({ asyncapi: { asyncapi: '2.2.0', @@ -97,7 +97,7 @@ describe('documentValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({ // without title, version and channels asyncapi: { diff --git a/src/middlewares/tests/problem.middleware.test.ts b/src/middlewares/tests/problem.middleware.test.ts index 89f3d990..ac943ce9 100644 --- a/src/middlewares/tests/problem.middleware.test.ts +++ b/src/middlewares/tests/problem.middleware.test.ts @@ -23,7 +23,7 @@ describe('problemMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({}) .expect(422, { type: ProblemException.createType('custom-problem'), @@ -43,7 +43,7 @@ describe('problemMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/test') + .post('/v1/test') .send({}) .expect(200, { success: true, diff --git a/src/middlewares/tests/request-body-validation.middleware.test.ts b/src/middlewares/tests/request-body-validation.middleware.test.ts index 2df81d31..b479ebc9 100644 --- a/src/middlewares/tests/request-body-validation.middleware.test.ts +++ b/src/middlewares/tests/request-body-validation.middleware.test.ts @@ -20,7 +20,7 @@ describe('requestBodyValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', @@ -39,7 +39,7 @@ describe('requestBodyValidationMiddleware', () => { it('should throw error when request body is invalid', async () => { const TestController = createTestController({ - path: '/test', + path: '/generate', method: 'post', callback: (_, res) => { res.status(200).send({ success: true }); @@ -48,7 +48,7 @@ describe('requestBodyValidationMiddleware', () => { const app = new App([new TestController()]); return await request(app.getServer()) - .post('/generate') + .post('/v1/generate') .send({ asyncapi: { asyncapi: '2.2.0', From 0013d05de784a5e16925cc594a1b43d46292b167 Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 16:39:41 +0100 Subject: [PATCH 5/9] after rebase --- src/controllers/tests/validate.controller.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/tests/validate.controller.test.ts b/src/controllers/tests/validate.controller.test.ts index 0327d96d..de13d494 100644 --- a/src/controllers/tests/validate.controller.test.ts +++ b/src/controllers/tests/validate.controller.test.ts @@ -82,7 +82,7 @@ describe('ValidateController', () => { const app = new App([new ValidateController()]); return request(app.getServer()) - .post('/validate') + .post('/v1/validate') .send({ asyncapi: validJSONAsyncAPI }) @@ -93,7 +93,7 @@ describe('ValidateController', () => { const app = new App([new ValidateController()]); return request(app.getServer()) - .post('/validate') + .post('/v1/validate') .send({ asyncapi: validYAMLAsyncAPI }) @@ -128,7 +128,7 @@ describe('ValidateController', () => { const app = new App([new ValidateController()]); return request(app.getServer()) - .post('/validate') + .post('/v1/validate') .send({ asyncapi: invalidJSONAsyncAPI }) From 61b72890586f74d1fad36ef868a682a241af6194 Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 16:58:59 +0100 Subject: [PATCH 6/9] fix DockerFile --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 938bf657..b612362c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,6 @@ WORKDIR /app COPY --from=build /app/dist ./dist # A wildcard is used to ensure both package.json AND package-lock.json are copied COPY --from=build /app/package* ./ -# COPY package* ./ # install only production dependencies (defined in "dependencies") RUN npm ci --only=production # copy OpenaAPI document From 185d32969743a1b8ad64fc9ba1233c36038f0c5b Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 17:07:59 +0100 Subject: [PATCH 7/9] after review --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index b612362c..c00faca0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,10 +13,8 @@ FROM base AS build WORKDIR /app COPY . . -# delete package-lock.json - more info https://github.com/asyncapi/.github/issues/123 -# delete that line and install by `npm ci` when mentioned issue will be resolved -RUN rm -rf package-lock.json # install dependencies +# switch to the `npm ci` when https://github.com/asyncapi/.github/issues/123 issue will be resolved RUN npm install # build to a production Javascript From 86149d87eb67faa8fe5e6bd7c3f73c40e07cfad6 Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 17:51:32 +0100 Subject: [PATCH 8/9] revert changes --- Dockerfile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index c00faca0..dd2034c3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,10 +12,8 @@ FROM base AS build WORKDIR /app COPY . . - # install dependencies -# switch to the `npm ci` when https://github.com/asyncapi/.github/issues/123 issue will be resolved -RUN npm install +RUN npm ci # build to a production Javascript RUN npm run build:prod @@ -26,11 +24,12 @@ FROM base AS release WORKDIR /app COPY --from=build /app/dist ./dist # A wildcard is used to ensure both package.json AND package-lock.json are copied -COPY --from=build /app/package* ./ +# where available (npm@5+) +COPY package* ./ # install only production dependencies (defined in "dependencies") RUN npm ci --only=production # copy OpenaAPI document COPY openapi.yaml ./ EXPOSE 80 -CMD ["npm", "run", "start:prod"] +CMD ["npm", "run", "start:prod"] \ No newline at end of file From f6d381822d75742ebf9cb70c0bec4441435946d6 Mon Sep 17 00:00:00 2001 From: Matatjahu Date: Mon, 17 Jan 2022 21:55:51 +0100 Subject: [PATCH 9/9] change octet-stream to zip --- openapi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openapi.yaml b/openapi.yaml index 0eb5b39f..f01e3e90 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -38,7 +38,7 @@ paths: '200': description: Template successfully generated. content: - application/octet-stream: + application/zip: schema: type: string format: binary