1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-09 13:47:13 +02:00

feat: info-log webhooks domain part of url

This commit is contained in:
David Leek 2024-08-22 08:57:14 +02:00
parent 341703978a
commit 1d0dfaacc1
No known key found for this signature in database
GPG Key ID: 515EE0F1BB6D0BE1
2 changed files with 180 additions and 1 deletions

View File

@ -1,5 +1,5 @@
import { ValidationError } from 'joi';
import type { Logger } from '../../lib/logger';
import getLogger from '../../test/fixtures/no-logger';
import TagTypeService from '../features/tag-type/tag-type-service';
import {
@ -55,6 +55,7 @@ function getSetup() {
getLogger,
// @ts-ignore
server: { unleashUrl: 'http://test' },
flagResolver: {} as IFlagResolver,
},
tagTypeService,
eventService,
@ -67,6 +68,38 @@ function getSetup() {
};
}
function getSetupWithLogger(logProvider: () => Logger) {
const stores = createStores();
const eventService = createFakeEventsService(config);
const tagTypeService = new TagTypeService(
stores,
{ getLogger: logProvider },
eventService,
);
const integrationEventsService = new IntegrationEventsService(stores, {
getLogger: logProvider,
flagResolver: {} as IFlagResolver,
});
return {
addonService: new AddonService(
stores,
{
getLogger: logProvider,
// @ts-ignore
server: { unleashUrl: 'http://test' },
flagResolver: {} as IFlagResolver,
},
tagTypeService,
eventService,
integrationEventsService,
),
eventService,
stores,
tagTypeService,
};
}
test('should load addon configurations', async () => {
const { addonService } = getSetup();
@ -814,3 +847,116 @@ test('Should reject addon config if a required parameter is just the empty strin
addonService.createAddon(config, TEST_AUDIT_USER),
).rejects.toThrow(ValidationError);
});
test('should log resolved domain', async () => {
const loggerMock = {
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn(),
};
const getLogger = jest.fn(() => loggerMock);
const { addonService } = getSetupWithLogger(getLogger);
const config: IAddonDto = {
provider: 'webhook',
description: '',
enabled: true,
parameters: {
url: 'http://localhost/wh',
var: 'some-value',
},
events: [FEATURE_CREATED],
};
await addonService.createAddon(config, TEST_AUDIT_USER);
expect(getLogger).toHaveBeenCalled();
expect(loggerMock.info).toHaveBeenCalledWith(`Webhook created`, {
domain: 'localhost',
});
});
test('should log resolved domain with last slash missing', async () => {
const loggerMock = {
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn(),
};
const getLogger = jest.fn(() => loggerMock);
const { addonService } = getSetupWithLogger(getLogger);
const config: IAddonDto = {
provider: 'webhook',
description: '',
enabled: true,
parameters: {
url: 'http://localhost',
var: 'some-value',
},
events: [FEATURE_CREATED],
};
await addonService.createAddon(config, TEST_AUDIT_USER);
expect(getLogger).toHaveBeenCalled();
expect(loggerMock.info).toHaveBeenCalledWith(`Webhook created`, {
domain: 'localhost',
});
});
test('will log with port if specified', async () => {
const loggerMock = {
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn(),
};
const getLogger = jest.fn(() => loggerMock);
const { addonService } = getSetupWithLogger(getLogger);
const config: IAddonDto = {
provider: 'webhook',
description: '',
enabled: true,
parameters: {
url: 'http://localhost:8080',
var: 'some-value',
},
events: [FEATURE_CREATED],
};
await addonService.createAddon(config, TEST_AUDIT_USER);
expect(getLogger).toHaveBeenCalled();
expect(loggerMock.info).toHaveBeenCalledWith(`Webhook created`, {
domain: 'localhost:8080',
});
});
test('should not log if protocol missing', async () => {
const loggerMock = {
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn(),
};
const getLogger = jest.fn(() => loggerMock);
const { addonService } = getSetupWithLogger(getLogger);
const config: IAddonDto = {
provider: 'webhook',
description: '',
enabled: true,
parameters: {
url: '://localhost/wh',
var: 'some-value',
},
events: [FEATURE_CREATED],
};
await addonService.createAddon(config, TEST_AUDIT_USER);
expect(getLogger).toHaveBeenCalled();
expect(loggerMock.info).toHaveBeenCalledTimes(1);
expect(loggerMock.info).not.toHaveBeenCalledWith(`Webhook created`, {
domain: 'localhost',
});
});

View File

@ -225,6 +225,22 @@ export default class AddonService {
`User ${auditUser.username} created addon ${addonConfig.provider}`,
);
if (
addonConfig.provider === 'webhook' &&
addonConfig.parameters.url &&
addonConfig.parameters.url.indexOf('://') > 0
) {
const start = addonConfig.parameters.url.indexOf('://') + 3;
let end = addonConfig.parameters.url.indexOf('/', start);
if (end === -1) {
end = addonConfig.parameters.url.length;
}
const domain = addonConfig.parameters.url.substring(start, end);
this.logger.info(`Webhook created`, {
domain,
});
}
await this.eventService.storeEvent(
new AddonConfigCreatedEvent({
data: omitKeys(createdAddon, 'parameters'),
@ -259,6 +275,23 @@ export default class AddonService {
);
}
const result = await this.addonStore.update(id, addonConfig);
if (
addonConfig.provider === 'webhook' &&
addonConfig.parameters.url &&
addonConfig.parameters.url.indexOf('://') > 0
) {
const start = addonConfig.parameters.url.indexOf('://') + 3;
let end = addonConfig.parameters.url.indexOf('/', start);
if (end === -1) {
end = addonConfig.parameters.url.length;
}
const domain = addonConfig.parameters.url.substring(start, end);
this.logger.info(`Webhook updated`, {
domain,
});
}
await this.eventService.storeEvent(
new AddonConfigUpdatedEvent({
preData: omitKeys(existingConfig, 'parameters'),