From aa42d14e1b1bb9704ea9af13790975b16d45e68d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Wed, 29 Apr 2020 20:38:53 +0200 Subject: [PATCH 1/3] feat: new '/gitlab' endpoint --- src/routes/gitlab/index.ts | 12 ++++++++++++ src/routes/index.ts | 8 ++++++++ src/server.ts | 2 +- test/routes/gitlab/index.spec.ts | 12 ++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/routes/gitlab/index.ts create mode 100644 src/routes/index.ts create mode 100644 test/routes/gitlab/index.spec.ts diff --git a/src/routes/gitlab/index.ts b/src/routes/gitlab/index.ts new file mode 100644 index 0000000..04fbc3c --- /dev/null +++ b/src/routes/gitlab/index.ts @@ -0,0 +1,12 @@ +import { ServerRoute, ResponseObject, Request, ResponseToolkit } from '@hapi/hapi'; + +export const routes = (): ServerRoute[] => { + return [ + { + method: 'POST', + handler: async (request: Request, h: ResponseToolkit): Promise => + h.response().code(200), + path: '/gitlab', + }, + ]; +}; diff --git a/src/routes/index.ts b/src/routes/index.ts new file mode 100644 index 0000000..164e799 --- /dev/null +++ b/src/routes/index.ts @@ -0,0 +1,8 @@ +import { ServerRoute } from '@hapi/hapi'; +import { routes as gitlab } from './gitlab'; +import { routes as github } from './github'; +import { Config } from '../config'; + +export const routes = (config: Config): ServerRoute[] => { + return [...github(config), ...gitlab()]; +}; diff --git a/src/server.ts b/src/server.ts index fa0fe8f..ef3c4ef 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,5 +1,5 @@ import { Server } from '@hapi/hapi'; -import { routes } from './routes/github'; +import { routes } from './routes'; import laabr from 'laabr'; import { Config } from './config'; diff --git a/test/routes/gitlab/index.spec.ts b/test/routes/gitlab/index.spec.ts new file mode 100644 index 0000000..5448747 --- /dev/null +++ b/test/routes/gitlab/index.spec.ts @@ -0,0 +1,12 @@ +import { initServer } from '../../../src/server'; +import { getConfig } from '../../../src/config'; + +describe('POST /gitlab', () => { + it('returns a 200 status ok', async () => { + const subject = await initServer(getConfig()); + + const { statusCode } = await subject.inject({ method: 'POST', url: '/gitlab' }); + + expect(statusCode).toEqual(200); + }); +}); From fc5b20e87a259563ba383fe56c210e0d1fe0fdfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Wed, 29 Apr 2020 20:48:58 +0200 Subject: [PATCH 2/3] feat: validate headers in GitLab request --- src/routes/gitlab/index.ts | 10 ++++++++-- src/schemas/gitlab/joi/gitlab-headers-schema.ts | 7 +++++++ test/routes/gitlab/index.spec.ts | 17 ++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/schemas/gitlab/joi/gitlab-headers-schema.ts diff --git a/src/routes/gitlab/index.ts b/src/routes/gitlab/index.ts index 04fbc3c..9fcda41 100644 --- a/src/routes/gitlab/index.ts +++ b/src/routes/gitlab/index.ts @@ -1,11 +1,17 @@ import { ServerRoute, ResponseObject, Request, ResponseToolkit } from '@hapi/hapi'; +import { gitlabHeader } from '../../schemas/gitlab/joi/gitlab-headers-schema'; export const routes = (): ServerRoute[] => { return [ { method: 'POST', - handler: async (request: Request, h: ResponseToolkit): Promise => - h.response().code(200), + options: { + handler: async (request: Request, h: ResponseToolkit): Promise => + h.response().code(200), + validate: { + headers: gitlabHeader(), + }, + }, path: '/gitlab', }, ]; diff --git a/src/schemas/gitlab/joi/gitlab-headers-schema.ts b/src/schemas/gitlab/joi/gitlab-headers-schema.ts new file mode 100644 index 0000000..09c73e8 --- /dev/null +++ b/src/schemas/gitlab/joi/gitlab-headers-schema.ts @@ -0,0 +1,7 @@ +import { object, string, Schema } from '@hapi/joi'; + +export function gitlabHeader(): Schema { + return object({ + 'x-gitlab-event': string().required(), + }).unknown(); +} diff --git a/test/routes/gitlab/index.spec.ts b/test/routes/gitlab/index.spec.ts index 5448747..6564dcf 100644 --- a/test/routes/gitlab/index.spec.ts +++ b/test/routes/gitlab/index.spec.ts @@ -5,8 +5,23 @@ describe('POST /gitlab', () => { it('returns a 200 status ok', async () => { const subject = await initServer(getConfig()); - const { statusCode } = await subject.inject({ method: 'POST', url: '/gitlab' }); + const { statusCode } = await subject.inject({ + method: 'POST', + url: '/gitlab', + headers: { 'X-Gitlab-Event': 'test' }, + }); expect(statusCode).toEqual(200); }); + + it("returns 400 bad request is the request is missing the 'X-Gitlab-Event' header", async () => { + const subject = await initServer(getConfig()); + + const { statusCode } = await subject.inject({ + method: 'POST', + url: '/gitlab', + }); + + expect(statusCode).toEqual(400); + }); }); From 4734d168bc7b028e613c85369a1f3f6e08de4766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Wed, 29 Apr 2020 20:49:25 +0200 Subject: [PATCH 3/3] feat: ignore unknown events from 'GitLab' --- src/routes/gitlab/index.ts | 8 ++++++-- test/routes/gitlab/index.spec.ts | 12 ++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/routes/gitlab/index.ts b/src/routes/gitlab/index.ts index 9fcda41..7775891 100644 --- a/src/routes/gitlab/index.ts +++ b/src/routes/gitlab/index.ts @@ -6,12 +6,16 @@ export const routes = (): ServerRoute[] => { { method: 'POST', options: { - handler: async (request: Request, h: ResponseToolkit): Promise => - h.response().code(200), validate: { headers: gitlabHeader(), }, }, + handler: async (request: Request, h: ResponseToolkit): Promise => { + const { headers } = request; + const event = headers['x-gitlab-event']; + + return h.response({ message: `Ignoring event: '${event}'` }).code(200); + }, path: '/gitlab', }, ]; diff --git a/test/routes/gitlab/index.spec.ts b/test/routes/gitlab/index.spec.ts index 6564dcf..200304a 100644 --- a/test/routes/gitlab/index.spec.ts +++ b/test/routes/gitlab/index.spec.ts @@ -24,4 +24,16 @@ describe('POST /gitlab', () => { expect(statusCode).toEqual(400); }); + + it('ignores unknown events gracefully', async () => { + const subject = await initServer(getConfig()); + + const { result } = await subject.inject({ + method: 'POST', + url: '/gitlab', + headers: { 'X-Gitlab-Event': 'test' }, + }); + + expect(result).toEqual({ message: `Ignoring event: 'test'` }); + }); });