1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-23 00:22:19 +01:00

fix: add flag to annomise event log

This commit is contained in:
Ivar Conradi Østhus 2022-05-30 16:44:37 +02:00
parent bde6294e44
commit 34b2058faa
No known key found for this signature in database
GPG Key ID: 31AC596886B0BD09
5 changed files with 77 additions and 8 deletions

View File

@ -2,6 +2,7 @@ export interface IExperimentalOptions {
metricsV2?: IExperimentalToggle;
clientFeatureMemoize?: IExperimentalToggle;
segments?: IExperimentalSegments;
anonymiseEventLog?: boolean;
}
export interface IExperimentalToggle {

View File

@ -5,22 +5,35 @@ import EventService from '../../services/event-service';
import { ADMIN } from '../../types/permissions';
import { IEvent } from '../../types/events';
import Controller from '../controller';
import { anonymise } from '../../util/anonymise';
const version = 1;
export default class EventController extends Controller {
private eventService: EventService;
private anonymise: boolean = false;
constructor(
config: IUnleashConfig,
{ eventService }: Pick<IUnleashServices, 'eventService'>,
) {
super(config);
this.eventService = eventService;
this.anonymise = config.experimental?.anonymiseEventLog;
this.get('/', this.getEvents, ADMIN);
this.get('/:name', this.getEventsForToggle);
}
fixEvents(events: IEvent[]): IEvent[] {
if (this.anonymise) {
return events.map((e: IEvent) => ({
...e,
createdBy: anonymise(e.createdBy),
}));
}
return events;
}
async getEvents(
req: Request<any, any, any, { project?: string }>,
res: Response,
@ -32,7 +45,10 @@ export default class EventController extends Controller {
} else {
events = await this.eventService.getEvents();
}
res.json({ version, events });
res.json({
version,
events: this.fixEvents(events),
});
}
async getEventsForToggle(
@ -42,10 +58,10 @@ export default class EventController extends Controller {
const toggleName = req.params.name;
const events = await this.eventService.getEventsForToggle(toggleName);
if (events) {
res.json({ toggleName, events });
} else {
res.status(404).json({ error: 'Could not find events' });
}
res.json({
version,
toggleName,
events: this.fixEvents(events),
});
}
}

View File

@ -5,12 +5,14 @@ import { createTestConfig } from '../../../test/config/test-config';
import createStores from '../../../test/fixtures/store';
import getApp from '../../app';
import { FeatureCreatedEvent } from '../../types/events';
async function getSetup() {
async function getSetup(anonymise: boolean = false) {
const base = `/random${Math.round(Math.random() * 1000)}`;
const stores = createStores();
const config = createTestConfig({
server: { baseUriPath: base },
experimental: { anonymiseEventLog: anonymise },
});
const services = createServices(stores, config);
const app = await getApp(config, stores, services);
@ -29,3 +31,43 @@ test('should get empty events list via admin', async () => {
expect(res.body.events.length === 0).toBe(true);
});
});
test('should get events list via admin', async () => {
const { request, base, eventStore } = await getSetup();
eventStore.store(
new FeatureCreatedEvent({
createdBy: 'some@email.com',
data: { name: 'test', project: 'default' },
featureName: 'test',
project: 'default',
tags: [],
}),
);
const { body } = await request
.get(`${base}/api/admin/events`)
.expect('Content-Type', /json/)
.expect(200);
expect(body.events.length).toBe(1);
expect(body.events[0].createdBy).toBe('some@email.com');
});
test('should anonymise events list via admin', async () => {
const { request, base, eventStore } = await getSetup(true);
eventStore.store(
new FeatureCreatedEvent({
createdBy: 'some@email.com',
data: { name: 'test', project: 'default' },
featureName: 'test',
project: 'default',
tags: [],
}),
);
const { body } = await request
.get(`${base}/api/admin/events`)
.expect('Content-Type', /json/)
.expect(200);
expect(body.events.length).toBe(1);
expect(body.events[0].createdBy).toBe('676212ff7@unleash.run');
});

View File

@ -0,0 +1,9 @@
import { createHash } from 'crypto';
export function anonymise(s: string): string {
const hash = createHash('sha256')
.update(s, 'utf-8')
.digest('hex')
.slice(0, 9);
return `${hash}@unleash.run`;
}

View File

@ -34,6 +34,7 @@ process.nextTick(async () => {
experimental: {
metricsV2: { enabled: true },
segments: experimentalSegmentsConfig(),
anonymiseEventLog: false,
},
authentication: {
initApiTokens: [