diff --git a/src/lib/db/event-store.ts b/src/lib/db/event-store.ts index 524d016e32..15c15f6689 100644 --- a/src/lib/db/event-store.ts +++ b/src/lib/db/event-store.ts @@ -85,12 +85,12 @@ export interface IEventTable { const TABLE = 'events'; class EventStore implements IEventStore { - private db: Db; + protected db: Db; // only one shared event emitter should exist across all event store instances private eventEmitter: EventEmitter = sharedEventEmitter; - private logger: Logger; + protected logger: Logger; // a new DB has to be injected per transaction constructor(db: Db, getLogger: LogProvider) { diff --git a/src/lib/openapi/spec/event-schema.ts b/src/lib/openapi/spec/event-schema.ts index fa11b61602..818510ea20 100644 --- a/src/lib/openapi/spec/event-schema.ts +++ b/src/lib/openapi/spec/event-schema.ts @@ -1,6 +1,5 @@ import { FromSchema } from 'json-schema-to-ts'; import { tagSchema } from './tag-schema'; -import { IEventTypes } from '../../types'; import { variantSchema } from './variant-schema'; const eventDataSchema = { @@ -44,7 +43,6 @@ export const eventSchema = { type: 'string', description: 'What [type](https://docs.getunleash.io/reference/api/legacy/unleash/admin/events#event-type-description) of event this is', - enum: IEventTypes, example: 'feature-created', }, createdBy: { diff --git a/src/lib/services/event-service.ts b/src/lib/services/event-service.ts index 35df38206c..110a0de2b5 100644 --- a/src/lib/services/event-service.ts +++ b/src/lib/services/event-service.ts @@ -10,7 +10,7 @@ import { ITag } from '../types'; export default class EventService { private logger: Logger; - private eventStore: IEventStore; + protected eventStore: IEventStore; private featureTagStore: IFeatureTagStore; @@ -51,7 +51,7 @@ export default class EventService { return this.eventStore.on(eventName, listener); } - private async enhanceEventsWithTags( + protected async enhanceEventsWithTags( events: IBaseEvent[], ): Promise { const featureNamesSet = new Set(); diff --git a/src/lib/types/events.ts b/src/lib/types/events.ts index 2cc34a588f..dac8086bf6 100644 --- a/src/lib/types/events.ts +++ b/src/lib/types/events.ts @@ -173,6 +173,14 @@ export const BANNER_CREATED = 'banner-created' as const; export const BANNER_UPDATED = 'banner-updated' as const; export const BANNER_DELETED = 'banner-deleted' as const; +export const EVENT_WEBHOOK_CREATED = 'event-webhook-created' as const; +export const EVENT_WEBHOOK_UPDATED = 'event-webhook-updated' as const; +export const EVENT_WEBHOOK_DELETED = 'event-webhook-deleted' as const; + +export const EVENT_ACTION_CREATED = 'event-action-created' as const; +export const EVENT_ACTION_UPDATED = 'event-action-updated' as const; +export const EVENT_ACTION_DELETED = 'event-action-deleted' as const; + export const IEventTypes = [ APPLICATION_CREATED, FEATURE_CREATED, @@ -306,6 +314,12 @@ export const IEventTypes = [ PROJECT_ENVIRONMENT_ADDED, PROJECT_ENVIRONMENT_REMOVED, DEFAULT_STRATEGY_UPDATED, + EVENT_WEBHOOK_CREATED, + EVENT_WEBHOOK_UPDATED, + EVENT_WEBHOOK_DELETED, + EVENT_ACTION_CREATED, + EVENT_ACTION_UPDATED, + EVENT_ACTION_DELETED, ] as const; export type IEventType = (typeof IEventTypes)[number]; diff --git a/src/migrations/20231205122703-external-events.js b/src/migrations/20231205122703-external-events.js new file mode 100644 index 0000000000..48d8500ad7 --- /dev/null +++ b/src/migrations/20231205122703-external-events.js @@ -0,0 +1,19 @@ +exports.up = function (db, cb) { + db.runSql( + ` + ALTER table events + ADD COLUMN IF NOT EXISTS is_external boolean DEFAULT false + `, + cb, + ); +}; + +exports.down = function (db, cb) { + db.runSql( + ` + ALTER table events + DROP COLUMN is_external + `, + cb, + ); +}; diff --git a/src/migrations/20231205155322-event-webhooks.js b/src/migrations/20231205155322-event-webhooks.js new file mode 100644 index 0000000000..dde01db4da --- /dev/null +++ b/src/migrations/20231205155322-event-webhooks.js @@ -0,0 +1,27 @@ +'use strict'; + +exports.up = function (db, cb) { + db.runSql( + ` + CREATE TABLE IF NOT EXISTS event_webhooks + ( + id SERIAL PRIMARY KEY NOT NULL, + enabled BOOLEAN DEFAULT true NOT NULL, + name TEXT NOT NULL, + event TEXT NOT NULL, + url TEXT NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now() + ); + `, + cb, + ); +}; + +exports.down = function (db, cb) { + db.runSql( + ` + DROP TABLE IF EXISTS event_webhooks; + `, + cb, + ); +}; diff --git a/src/migrations/20231205155331-event-actions.js b/src/migrations/20231205155331-event-actions.js new file mode 100644 index 0000000000..372ab2bb9c --- /dev/null +++ b/src/migrations/20231205155331-event-actions.js @@ -0,0 +1,25 @@ +'use strict'; + +exports.up = function (db, cb) { + db.runSql( + ` + CREATE TABLE IF NOT EXISTS event_actions + ( + id SERIAL PRIMARY KEY NOT NULL, + event TEXT NOT NULL, + action TEXT NOT NULL, + parameters JSONB NOT NULL DEFAULT '{}'::jsonb + ); + `, + cb, + ); +}; + +exports.down = function (db, cb) { + db.runSql( + ` + DROP TABLE IF EXISTS event_actions; + `, + cb, + ); +}; diff --git a/src/test/fixtures/fake-event-store.ts b/src/test/fixtures/fake-event-store.ts index 7dcfc558af..d816bf5b42 100644 --- a/src/test/fixtures/fake-event-store.ts +++ b/src/test/fixtures/fake-event-store.ts @@ -8,7 +8,7 @@ import EventEmitter from 'events'; class FakeEventStore implements IEventStore { events: IEvent[]; - private eventEmitter: EventEmitter = sharedEventEmitter; + protected eventEmitter: EventEmitter = sharedEventEmitter; constructor() { this.eventEmitter.setMaxListeners(0);