diff --git a/src/lib/addons/webhook-definition.ts b/src/lib/addons/webhook-definition.ts index 413454b224..a4216ebc9d 100644 --- a/src/lib/addons/webhook-definition.ts +++ b/src/lib/addons/webhook-definition.ts @@ -44,6 +44,16 @@ const webhookDefinition: IAddonDefinition = { required: false, sensitive: false, }, + { + name: 'authorization', + displayName: 'Authorization', + placeholder: '', + description: + '(Optional) The Authorization header to use. Not used if left blank.', + type: 'text', + required: false, + sensitive: true, + }, { name: 'bodyTemplate', displayName: 'Body template', diff --git a/src/lib/addons/webhook.test.ts b/src/lib/addons/webhook.test.ts index 3e21b40140..197e52381e 100644 --- a/src/lib/addons/webhook.test.ts +++ b/src/lib/addons/webhook.test.ts @@ -84,3 +84,33 @@ test('Should format event with "bodyTemplate"', () => { expect(call.options.headers['Content-Type']).toBe('text/plain'); expect(call.options.body).toBe('feature-created on toggle some-toggle'); }); + +test('Should format event with "authorization"', () => { + const addon = new WebhookAddon({ getLogger: noLogger }); + const event: IEvent = { + id: 1, + createdAt: new Date(), + type: FEATURE_CREATED, + createdBy: 'some@user.com', + featureName: 'some-toggle', + data: { + name: 'some-toggle', + enabled: false, + strategies: [{ name: 'default' }], + }, + }; + + const parameters = { + url: 'http://test.webhook.com/plain', + bodyTemplate: '{{event.type}} on toggle {{event.data.name}}', + contentType: 'text/plain', + authorization: 'API KEY 123abc', + }; + + addon.handleEvent(event, parameters); + const call = fetchRetryCalls[0]; + expect(fetchRetryCalls.length).toBe(1); + expect(call.url).toBe(parameters.url); + expect(call.options.headers.Authorization).toBe(parameters.authorization); + expect(call.options.body).toBe('feature-created on toggle some-toggle'); +}); diff --git a/src/lib/addons/webhook.ts b/src/lib/addons/webhook.ts index dda4d8e8dc..5241610c98 100644 --- a/src/lib/addons/webhook.ts +++ b/src/lib/addons/webhook.ts @@ -8,6 +8,7 @@ interface IParameters { url: string; bodyTemplate?: string; contentType?: string; + authorization?: string; } export default class Webhook extends Addon { @@ -16,7 +17,7 @@ export default class Webhook extends Addon { } async handleEvent(event: IEvent, parameters: IParameters): Promise { - const { url, bodyTemplate, contentType } = parameters; + const { url, bodyTemplate, contentType, authorization } = parameters; const context = { event, }; @@ -31,7 +32,10 @@ export default class Webhook extends Addon { const requestOpts = { method: 'POST', - headers: { 'Content-Type': contentType || 'application/json' }, + headers: { + 'Content-Type': contentType || 'application/json', + Authorization: authorization || undefined, + }, body, }; const res = await this.fetchRetry(url, requestOpts);