Skip to content

Commit

Permalink
Added default handler for consumer navigation
Browse files Browse the repository at this point in the history
  • Loading branch information
gmmorris committed Mar 12, 2020
1 parent fb1cee9 commit 0da9e64
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,27 @@ describe('AlertNavigationRegistry', () => {
registry.register('siem', alertType, handler);
expect(registry.has('siem', alertType)).toEqual(true);
});

test('returns true for registered consumer with default handler', () => {
const registry = new AlertNavigationRegistry();
const alertType = mockAlertType('index_threshold');
registry.registerDefault('siem', handler);
expect(registry.has('siem', alertType)).toEqual(true);
});
});

describe('hasDefaultHandler()', () => {
test('returns false for unregistered consumer handlers', () => {
const registry = new AlertNavigationRegistry();
expect(registry.hasDefaultHandler('siem')).toEqual(false);
});

test('returns true for registered consumer handlers', () => {
const registry = new AlertNavigationRegistry();

registry.registerDefault('siem', handler);
expect(registry.hasDefaultHandler('siem')).toEqual(true);
});
});

describe('register()', () => {
Expand Down Expand Up @@ -85,6 +106,35 @@ describe('AlertNavigationRegistry', () => {
});
});

describe('registerDefault()', () => {
test('registers a handler by consumer', () => {
const registry = new AlertNavigationRegistry();
registry.registerDefault('siem', handler);
expect(registry.hasDefaultHandler('siem')).toEqual(true);
});

test('allows registeration of default and typed handlers for the same consumer', () => {
const registry = new AlertNavigationRegistry();

registry.registerDefault('siem', handler);
expect(registry.hasDefaultHandler('siem')).toEqual(true);

const geoAlertType = mockAlertType('geogrid');
registry.register('siem', geoAlertType, handler);
expect(registry.has('siem', geoAlertType)).toEqual(true);
});

test('throws if an existing handler is registered', () => {
const registry = new AlertNavigationRegistry();
registry.registerDefault('siem', handler);
expect(() => {
registry.registerDefault('siem', handler);
}).toThrowErrorMatchingInlineSnapshot(
`"Default Navigation within \\"siem\\" is already registered."`
);
});
});

describe('get()', () => {
test('returns registered handlers by consumer & Alert Type', () => {
const registry = new AlertNavigationRegistry();
Expand All @@ -93,11 +143,35 @@ describe('AlertNavigationRegistry', () => {
return {};
}

const indexThresholdAlertType = mockAlertType('geogrid');
const indexThresholdAlertType = mockAlertType('indexThreshold');
registry.register('siem', indexThresholdAlertType, indexThresholdHandler);
expect(registry.get('siem', indexThresholdAlertType)).toEqual(indexThresholdHandler);
});

test('returns default handlers by consumer when there is no handler for requested alert type', () => {
const registry = new AlertNavigationRegistry();

function defaultHandler(alert: SanitizedAlert, alertType: AlertType) {
return {};
}

registry.registerDefault('siem', defaultHandler);
expect(registry.get('siem', mockAlertType('geogrid'))).toEqual(defaultHandler);
});

test('returns default handlers by consumer when there are other alert type handler', () => {
const registry = new AlertNavigationRegistry();

registry.register('siem', mockAlertType('indexThreshold'), () => ({}));

function defaultHandler(alert: SanitizedAlert, alertType: AlertType) {
return {};
}

registry.registerDefault('siem', defaultHandler);
expect(registry.get('siem', mockAlertType('geogrid'))).toEqual(defaultHandler);
});

test('throws if a handler isnt registered', () => {
const registry = new AlertNavigationRegistry();
const alertType = mockAlertType('index_threshold');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,37 @@ import { i18n } from '@kbn/i18n';
import { AlertType } from '../../common';
import { AlertNavigationHandler } from './types';

const DEFAULT_HANDLER = Symbol('*');
export class AlertNavigationRegistry {
private readonly alertNavigations: Map<string, Map<string, AlertNavigationHandler>> = new Map();
private readonly alertNavigations: Map<
string,
Map<string | symbol, AlertNavigationHandler>
> = new Map();

public has(consumer: string, alertType: AlertType) {
return this.hasTypedHandler(consumer, alertType) || this.hasDefaultHandler(consumer);
}

public hasTypedHandler(consumer: string, alertType: AlertType) {
return this.alertNavigations.get(consumer)?.has(alertType.id) ?? false;
}

public hasDefaultHandler(consumer: string) {
return this.alertNavigations.get(consumer)?.has(DEFAULT_HANDLER) ?? false;
}

private createConsumerNavigation(consumer: string) {
const consumerNavigations = new Map<string, AlertNavigationHandler>();
this.alertNavigations.set(consumer, consumerNavigations);
return consumerNavigations;
}

public register(consumer: string, alertType: AlertType, handler: AlertNavigationHandler) {
if (this.has(consumer, alertType)) {
public registerDefault(consumer: string, handler: AlertNavigationHandler) {
if (this.hasDefaultHandler(consumer)) {
throw Boom.badRequest(
i18n.translate('xpack.alerting.alertNavigationRegistry.register.duplicateNavigationError', {
defaultMessage:
'Navigation for Alert type "{alertType}" within "{consumer}" is already registered.',
i18n.translate('xpack.alerting.alertNavigationRegistry.register.duplicateDefaultError', {
defaultMessage: 'Default Navigation within "{consumer}" is already registered.',
values: {
alertType: alertType.id,
consumer,
},
})
Expand All @@ -39,22 +49,44 @@ export class AlertNavigationRegistry {
const consumerNavigations =
this.alertNavigations.get(consumer) ?? this.createConsumerNavigation(consumer);

consumerNavigations.set(alertType.id, handler);
consumerNavigations.set(DEFAULT_HANDLER, handler);
}

public get(consumer: string, alertType: AlertType): AlertNavigationHandler {
if (!this.has(consumer, alertType)) {
public register(consumer: string, alertType: AlertType, handler: AlertNavigationHandler) {
if (this.hasTypedHandler(consumer, alertType)) {
throw Boom.badRequest(
i18n.translate('xpack.alerting.alertNavigationRegistry.get.missingNavigationError', {
i18n.translate('xpack.alerting.alertNavigationRegistry.register.duplicateNavigationError', {
defaultMessage:
'Navigation for Alert type "{alertType}" within "{consumer}" is not registered.',
'Navigation for Alert type "{alertType}" within "{consumer}" is already registered.',
values: {
alertType: alertType.id,
consumer,
},
})
);
}
return this.alertNavigations.get(consumer)!.get(alertType.id)!;

const consumerNavigations =
this.alertNavigations.get(consumer) ?? this.createConsumerNavigation(consumer);

consumerNavigations.set(alertType.id, handler);
}

public get(consumer: string, alertType: AlertType): AlertNavigationHandler {
if (this.has(consumer, alertType)) {
const consumerHandlers = this.alertNavigations.get(consumer)!;
return (consumerHandlers.get(alertType.id) ?? consumerHandlers.get(DEFAULT_HANDLER))!;
}

throw Boom.badRequest(
i18n.translate('xpack.alerting.alertNavigationRegistry.get.missingNavigationError', {
defaultMessage:
'Navigation for Alert type "{alertType}" within "{consumer}" is not registered.',
values: {
alertType: alertType.id,
consumer,
},
})
);
}
}
3 changes: 3 additions & 0 deletions x-pack/plugins/alerting/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export interface PluginSetupContract {
alertType: string,
handler: AlertNavigationHandler
) => void;
registerDefaultNavigation: (consumer: string, handler: AlertNavigationHandler) => void;
}
export interface PluginStartContract {
getNavigation: (alertId: Alert['id']) => Promise<AlertNavigation | undefined>;
Expand All @@ -37,6 +38,8 @@ export class AlertingPublicPlugin implements Plugin<PluginSetupContract, PluginS
await loadAlertType({ http: core.http, id: alertType }),
handler
),
registerDefaultNavigation: async (consumer: string, handler: AlertNavigationHandler) =>
alertNavigationRegistry.registerDefault(consumer, handler),
};
}

Expand Down

0 comments on commit 0da9e64

Please sign in to comment.