Skip to content

Commit

Permalink
fix: add flag to annomise event log
Browse files Browse the repository at this point in the history
  • Loading branch information
ivarconr committed May 30, 2022
1 parent bde6294 commit 34b2058
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 8 deletions.
1 change: 1 addition & 0 deletions src/lib/experimental.ts
Expand Up @@ -2,6 +2,7 @@ export interface IExperimentalOptions {
metricsV2?: IExperimentalToggle;
clientFeatureMemoize?: IExperimentalToggle;
segments?: IExperimentalSegments;
anonymiseEventLog?: boolean;
}

export interface IExperimentalToggle {
Expand Down
30 changes: 23 additions & 7 deletions src/lib/routes/admin-api/event.ts
Expand Up @@ -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,
Expand All @@ -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(
Expand All @@ -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),
});
}
}
44 changes: 43 additions & 1 deletion src/lib/routes/admin-api/events.test.ts
Expand Up @@ -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);
Expand All @@ -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');
});
9 changes: 9 additions & 0 deletions src/lib/util/anonymise.ts
@@ -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`;
}
1 change: 1 addition & 0 deletions src/server-dev.ts
Expand Up @@ -34,6 +34,7 @@ process.nextTick(async () => {
experimental: {
metricsV2: { enabled: true },
segments: experimentalSegmentsConfig(),
anonymiseEventLog: false,
},
authentication: {
initApiTokens: [
Expand Down

0 comments on commit 34b2058

Please sign in to comment.