1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-11 00:08:30 +01:00

docs: Events tag (#4152)

### What
This PR adds documentation for our endpoints that are covered by our
"Events" tag. It also adds a type for all valid events, and then uses
this as valid values for type argument.
This commit is contained in:
Christopher Kolstad 2023-07-06 10:57:09 +02:00 committed by GitHub
parent 51ffe02cfd
commit b04545c25f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 360 additions and 118 deletions

View File

@ -1,4 +1,9 @@
import { IEvent, IBaseEvent, SEGMENT_UPDATED } from '../types/events';
import {
IEvent,
IBaseEvent,
SEGMENT_UPDATED,
IEventType,
} from '../types/events';
import { LogProvider, Logger } from '../logger';
import { IEventStore } from '../types/stores/event-store';
import { ITag } from '../types/model';
@ -359,7 +364,7 @@ class EventStore implements IEventStore {
rowToEvent(row: IEventTable): IEvent {
return {
id: row.id,
type: row.type,
type: row.type as IEventType,
createdBy: row.created_by,
createdAt: row.created_at,
data: row.data,

View File

@ -97,10 +97,7 @@ const metaRules: Rule[] = [
'createInvitedUserSchema',
'environmentsSchema',
'environmentsProjectSchema',
'eventSchema',
'eventsSchema',
'featureEnvironmentSchema',
'featureEventsSchema',
'featureSchema',
'featuresSchema',
'featureStrategySegmentSchema',
@ -126,7 +123,6 @@ const metaRules: Rule[] = [
'resetPasswordSchema',
'requestsPerSecondSchema',
'sdkContextSchema',
'searchEventsSchema',
'setUiConfigSchema',
'splashSchema',
'stateSchema',
@ -169,9 +165,6 @@ const metaRules: Rule[] = [
'createInvitedUserSchema',
'dateSchema',
'environmentsSchema',
'eventSchema',
'eventsSchema',
'featureEventsSchema',
'featureSchema',
'featuresSchema',
'featureStrategySegmentSchema',

View File

@ -1,51 +1,152 @@
import { FromSchema } from 'json-schema-to-ts';
import { tagSchema } from './tag-schema';
import { IEventTypes } from '../../types';
import { variantSchema } from './variant-schema';
const eventDataSchema = {
type: 'object',
additionalProperties: true,
properties: {
name: {
type: 'string',
description:
'Name of the feature toggle/strategy/environment that this event relates to',
example: 'my.first.toggle',
},
description: {
type: 'string',
description: 'The description of the object this event relates to',
example: 'Toggle description',
},
type: {
type: 'string',
description:
'If this event relates to a feature toggle, the type of feature toggle.',
example: 'release',
},
project: {
type: 'string',
description: 'The project this event relates to',
example: 'default',
},
stale: {
description: 'Is the feature toggle this event relates to stale',
type: 'boolean',
example: true,
},
variants: {
description: 'Variants configured for this toggle',
type: 'array',
items: {
$ref: '#/components/schemas/variantSchema',
},
},
createdAt: {
type: 'string',
format: 'date-time',
description:
'The time the event happened as a RFC 3339-conformant timestamp.',
example: '2023-07-05T12:56:00.000Z',
},
lastSeenAt: {
type: 'string',
format: 'date-time',
description: 'The time the feature was last seen',
example: '2023-07-05T12:56:00.000Z',
nullable: true,
},
impressionData: {
description:
'Should [impression events](https://docs.getunleash.io/reference/impression-data) activate for this feature toggle',
type: 'boolean',
example: false,
},
},
description:
'Extra associated data related to the event, such as feature toggle state, segment configuration, etc., if applicable.',
example: {
name: 'new-feature',
description: 'Toggle description',
type: 'release',
project: 'my-project',
stale: false,
variants: [],
createdAt: '2022-05-31T13:32:20.547Z',
lastSeenAt: null,
impressionData: true,
},
} as const;
export const eventSchema = {
$id: '#/components/schemas/eventSchema',
type: 'object',
additionalProperties: false,
required: ['id', 'createdAt', 'type', 'createdBy'],
description: 'An event describing something happening in the system',
properties: {
id: {
type: 'integer',
minimum: 1,
description: 'The ID of the event. An increasing natural number.',
},
createdAt: {
type: 'string',
format: 'date-time',
description:
'The time the event happened as a RFC 3339-conformant timestamp.',
example: '2023-07-05T12:56:00.000Z',
},
type: {
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: {
type: 'string',
description: 'Which user created this event',
example: 'johndoe',
},
environment: {
type: 'string',
description:
'The feature toggle environment the event relates to, if applicable.',
nullable: true,
example: 'development',
},
project: {
type: 'string',
nullable: true,
description: 'The project the event relates to, if applicable.',
example: 'default',
},
featureName: {
type: 'string',
nullable: true,
description:
'The name of the feature toggle the event relates to, if applicable.',
example: 'my.first.feature',
},
data: eventDataSchema,
preData: {
...eventDataSchema,
description:
"Data relating to the previous state of the event's subject.",
nullable: true,
},
data: { type: 'object', nullable: true },
preData: { type: 'object', nullable: true },
tags: {
type: 'array',
items: {
$ref: tagSchema.$id,
},
nullable: true,
description: 'Any tags related to the event, if applicable.',
},
},
components: {
schemas: {
tagSchema,
variantSchema,
},
},
} as const;

View File

@ -7,18 +7,26 @@ export const eventsSchema = {
type: 'object',
additionalProperties: false,
required: ['version', 'events'],
description: 'A list of events that has happened in the system',
properties: {
version: {
type: 'integer',
minimum: 1,
enum: [1],
description:
'The api version of this response. A natural increasing number. Only increases if format changes',
example: 1,
},
events: {
description: 'The list of events',
type: 'array',
items: { $ref: eventSchema.$id },
},
totalEvents: {
type: 'integer',
description: 'The total count of events',
minimum: 0,
example: 842,
},
},
components: {

View File

@ -7,18 +7,31 @@ export const featureEventsSchema = {
type: 'object',
additionalProperties: false,
required: ['events'],
description: 'One or more events happening to a specific feature toggle',
properties: {
version: { type: 'number' },
version: {
type: 'integer',
description: 'An API versioning number',
minimum: 1,
enum: [1],
example: 1,
},
toggleName: {
description:
'The name of the feature toggle these events relate to',
type: 'string',
example: 'my.first.feature.toggle',
},
events: {
description: 'The list of events',
type: 'array',
items: { $ref: eventSchema.$id },
},
totalEvents: {
description: 'How many events are there for this feature toggle',
type: 'integer',
minimum: 0,
example: 13,
},
},
components: {

View File

@ -1,4 +1,5 @@
import { FromSchema } from 'json-schema-to-ts';
import { IEventTypes } from '../../types';
export const searchEventsSchema = {
$id: '#/components/schemas/searchEventsSchema',
@ -11,14 +12,18 @@ export const searchEventsSchema = {
type: {
type: 'string',
description: 'Find events by event type (case-sensitive).',
enum: IEventTypes,
example: 'feature-created',
},
project: {
type: 'string',
description: 'Find events by project ID (case-sensitive).',
example: 'default',
},
feature: {
type: 'string',
description: 'Find events by feature toggle name (case-sensitive).',
example: 'my.first.toggle',
},
query: {
type: 'string',
@ -28,17 +33,23 @@ export const searchEventsSchema = {
the username or email that created the event (if any),
and the event data payload (if any).
`,
example: 'admin@example.com',
},
limit: {
type: 'integer',
description:
'The maximum amount of events to return in the search result',
minimum: 1,
maximum: 100,
default: 100,
example: 50,
},
offset: {
description: 'Which event id to start listing from',
type: 'integer',
minimum: 0,
default: 0,
example: 100,
},
},
components: {},

View File

@ -23,7 +23,7 @@ import { SearchEventsSchema } from '../../openapi/spec/search-events-schema';
import { IFlagResolver } from '../../types/experimental';
const ANON_KEYS = ['email', 'username', 'createdBy'];
const version = 1;
const version = 1 as const;
export default class EventController extends Controller {
private eventService: EventService;
@ -104,6 +104,9 @@ export default class EventController extends Controller {
openApiService.validPath({
operationId: 'searchEvents',
tags: ['Events'],
summary: 'Search for events',
description:
'Allows searching for events matching the search criteria in the request body',
requestBody: createRequestSchema('searchEventsSchema'),
responses: { 200: createResponseSchema('eventsSchema') },
}),

View File

@ -3,115 +3,222 @@ import { FeatureToggle, IStrategyConfig, ITag, IVariant } from './model';
import { IApiToken } from './models/api-token';
import { IUser } from './user';
export const APPLICATION_CREATED = 'application-created';
export const APPLICATION_CREATED = 'application-created' as const;
// feature event types
export const FEATURE_CREATED = 'feature-created';
export const FEATURE_DELETED = 'feature-deleted';
export const FEATURE_UPDATED = 'feature-updated';
export const FEATURE_METADATA_UPDATED = 'feature-metadata-updated';
export const FEATURE_VARIANTS_UPDATED = 'feature-variants-updated';
export const FEATURE_CREATED = 'feature-created' as const;
export const FEATURE_DELETED = 'feature-deleted' as const;
export const FEATURE_UPDATED = 'feature-updated' as const;
export const FEATURE_METADATA_UPDATED = 'feature-metadata-updated' as const;
export const FEATURE_VARIANTS_UPDATED = 'feature-variants-updated' as const;
export const FEATURE_ENVIRONMENT_VARIANTS_UPDATED =
'feature-environment-variants-updated';
export const FEATURE_PROJECT_CHANGE = 'feature-project-change';
export const FEATURE_ARCHIVED = 'feature-archived';
export const FEATURE_REVIVED = 'feature-revived';
export const FEATURE_IMPORT = 'feature-import';
export const FEATURE_TAGGED = 'feature-tagged';
export const FEATURE_TAG_IMPORT = 'feature-tag-import';
export const FEATURE_STRATEGY_UPDATE = 'feature-strategy-update';
export const FEATURE_STRATEGY_ADD = 'feature-strategy-add';
export const FEATURE_STRATEGY_REMOVE = 'feature-strategy-remove';
export const DROP_FEATURE_TAGS = 'drop-feature-tags';
export const FEATURE_UNTAGGED = 'feature-untagged';
export const FEATURE_STALE_ON = 'feature-stale-on';
export const FEATURE_STALE_OFF = 'feature-stale-off';
export const DROP_FEATURES = 'drop-features';
export const FEATURE_ENVIRONMENT_ENABLED = 'feature-environment-enabled';
export const FEATURE_ENVIRONMENT_DISABLED = 'feature-environment-disabled';
'feature-environment-variants-updated' as const;
export const FEATURE_PROJECT_CHANGE = 'feature-project-change' as const;
export const FEATURE_ARCHIVED = 'feature-archived' as const;
export const FEATURE_REVIVED = 'feature-revived' as const;
export const FEATURE_IMPORT = 'feature-import' as const;
export const FEATURE_TAGGED = 'feature-tagged' as const;
export const FEATURE_TAG_IMPORT = 'feature-tag-import' as const;
export const FEATURE_STRATEGY_UPDATE = 'feature-strategy-update' as const;
export const FEATURE_STRATEGY_ADD = 'feature-strategy-add' as const;
export const FEATURE_STRATEGY_REMOVE = 'feature-strategy-remove' as const;
export const DROP_FEATURE_TAGS = 'drop-feature-tags' as const;
export const FEATURE_UNTAGGED = 'feature-untagged' as const;
export const FEATURE_STALE_ON = 'feature-stale-on' as const;
export const FEATURE_STALE_OFF = 'feature-stale-off' as const;
export const DROP_FEATURES = 'drop-features' as const;
export const FEATURE_ENVIRONMENT_ENABLED =
'feature-environment-enabled' as const;
export const FEATURE_ENVIRONMENT_DISABLED =
'feature-environment-disabled' as const;
export const STRATEGY_CREATED = 'strategy-created';
export const STRATEGY_DELETED = 'strategy-deleted';
export const STRATEGY_DEPRECATED = 'strategy-deprecated';
export const STRATEGY_REACTIVATED = 'strategy-reactivated';
export const STRATEGY_UPDATED = 'strategy-updated';
export const STRATEGY_IMPORT = 'strategy-import';
export const DROP_STRATEGIES = 'drop-strategies';
export const CONTEXT_FIELD_CREATED = 'context-field-created';
export const CONTEXT_FIELD_UPDATED = 'context-field-updated';
export const CONTEXT_FIELD_DELETED = 'context-field-deleted';
export const PROJECT_ACCESS_ADDED = 'project-access-added';
export const PROJECT_CREATED = 'project-created';
export const PROJECT_UPDATED = 'project-updated';
export const PROJECT_DELETED = 'project-deleted';
export const PROJECT_IMPORT = 'project-import';
export const PROJECT_USER_ADDED = 'project-user-added';
export const PROJECT_USER_REMOVED = 'project-user-removed';
export const PROJECT_USER_ROLE_CHANGED = 'project-user-role-changed';
export const PROJECT_GROUP_ADDED = 'project-group-added';
export const PROJECT_GROUP_REMOVED = 'project-group-removed';
export const PROJECT_GROUP_ROLE_CHANGED = 'project-group-role-changed';
export const DROP_PROJECTS = 'drop-projects';
export const TAG_CREATED = 'tag-created';
export const TAG_DELETED = 'tag-deleted';
export const TAG_IMPORT = 'tag-import';
export const DROP_TAGS = 'drop-tags';
export const TAG_TYPE_CREATED = 'tag-type-created';
export const TAG_TYPE_DELETED = 'tag-type-deleted';
export const TAG_TYPE_UPDATED = 'tag-type-updated';
export const TAG_TYPE_IMPORT = 'tag-type-import';
export const DROP_TAG_TYPES = 'drop-tag-types';
export const ADDON_CONFIG_CREATED = 'addon-config-created';
export const ADDON_CONFIG_UPDATED = 'addon-config-updated';
export const ADDON_CONFIG_DELETED = 'addon-config-deleted';
export const DB_POOL_UPDATE = 'db-pool-update';
export const USER_CREATED = 'user-created';
export const USER_UPDATED = 'user-updated';
export const USER_DELETED = 'user-deleted';
export const DROP_ENVIRONMENTS = 'drop-environments';
export const ENVIRONMENT_IMPORT = 'environment-import';
export const SEGMENT_CREATED = 'segment-created';
export const SEGMENT_UPDATED = 'segment-updated';
export const SEGMENT_DELETED = 'segment-deleted';
export const GROUP_CREATED = 'group-created';
export const GROUP_UPDATED = 'group-updated';
export const SETTING_CREATED = 'setting-created';
export const SETTING_UPDATED = 'setting-updated';
export const SETTING_DELETED = 'setting-deleted';
export const STRATEGY_CREATED = 'strategy-created' as const;
export const STRATEGY_DELETED = 'strategy-deleted' as const;
export const STRATEGY_DEPRECATED = 'strategy-deprecated' as const;
export const STRATEGY_REACTIVATED = 'strategy-reactivated' as const;
export const STRATEGY_UPDATED = 'strategy-updated' as const;
export const STRATEGY_IMPORT = 'strategy-import' as const;
export const DROP_STRATEGIES = 'drop-strategies' as const;
export const CONTEXT_FIELD_CREATED = 'context-field-created' as const;
export const CONTEXT_FIELD_UPDATED = 'context-field-updated' as const;
export const CONTEXT_FIELD_DELETED = 'context-field-deleted' as const;
export const PROJECT_ACCESS_ADDED = 'project-access-added' as const;
export const PROJECT_CREATED = 'project-created' as const;
export const PROJECT_UPDATED = 'project-updated' as const;
export const PROJECT_DELETED = 'project-deleted' as const;
export const PROJECT_IMPORT = 'project-import' as const;
export const PROJECT_USER_ADDED = 'project-user-added' as const;
export const PROJECT_USER_REMOVED = 'project-user-removed' as const;
export const PROJECT_USER_ROLE_CHANGED = 'project-user-role-changed' as const;
export const PROJECT_GROUP_ADDED = 'project-group-added' as const;
export const PROJECT_GROUP_REMOVED = 'project-group-removed' as const;
export const PROJECT_GROUP_ROLE_CHANGED = 'project-group-role-changed' as const;
export const DROP_PROJECTS = 'drop-projects' as const;
export const TAG_CREATED = 'tag-created' as const;
export const TAG_DELETED = 'tag-deleted' as const;
export const TAG_IMPORT = 'tag-import' as const;
export const DROP_TAGS = 'drop-tags' as const;
export const TAG_TYPE_CREATED = 'tag-type-created' as const;
export const TAG_TYPE_DELETED = 'tag-type-deleted' as const;
export const TAG_TYPE_UPDATED = 'tag-type-updated' as const;
export const TAG_TYPE_IMPORT = 'tag-type-import' as const;
export const DROP_TAG_TYPES = 'drop-tag-types' as const;
export const ADDON_CONFIG_CREATED = 'addon-config-created' as const;
export const ADDON_CONFIG_UPDATED = 'addon-config-updated' as const;
export const ADDON_CONFIG_DELETED = 'addon-config-deleted' as const;
export const DB_POOL_UPDATE = 'db-pool-update' as const;
export const USER_CREATED = 'user-created' as const;
export const USER_UPDATED = 'user-updated' as const;
export const USER_DELETED = 'user-deleted' as const;
export const DROP_ENVIRONMENTS = 'drop-environments' as const;
export const ENVIRONMENT_IMPORT = 'environment-import' as const;
export const SEGMENT_CREATED = 'segment-created' as const;
export const SEGMENT_UPDATED = 'segment-updated' as const;
export const SEGMENT_DELETED = 'segment-deleted' as const;
export const GROUP_CREATED = 'group-created' as const;
export const GROUP_UPDATED = 'group-updated' as const;
export const SETTING_CREATED = 'setting-created' as const;
export const SETTING_UPDATED = 'setting-updated' as const;
export const SETTING_DELETED = 'setting-deleted' as const;
export const CLIENT_METRICS = 'client-metrics';
export const CLIENT_REGISTER = 'client-register';
export const CLIENT_METRICS = 'client-metrics' as const;
export const CLIENT_REGISTER = 'client-register' as const;
export const PAT_CREATED = 'pat-created';
export const PAT_DELETED = 'pat-deleted';
export const PAT_CREATED = 'pat-created' as const;
export const PAT_DELETED = 'pat-deleted' as const;
export const PUBLIC_SIGNUP_TOKEN_CREATED = 'public-signup-token-created';
export const PUBLIC_SIGNUP_TOKEN_USER_ADDED = 'public-signup-token-user-added';
export const PUBLIC_SIGNUP_TOKEN_TOKEN_UPDATED = 'public-signup-token-updated';
export const PUBLIC_SIGNUP_TOKEN_CREATED =
'public-signup-token-created' as const;
export const PUBLIC_SIGNUP_TOKEN_USER_ADDED =
'public-signup-token-user-added' as const;
export const PUBLIC_SIGNUP_TOKEN_TOKEN_UPDATED =
'public-signup-token-updated' as const;
export const CHANGE_REQUEST_CREATED = 'change-request-created';
export const CHANGE_REQUEST_DISCARDED = 'change-request-discarded';
export const CHANGE_ADDED = 'change-added';
export const CHANGE_DISCARDED = 'change-discarded';
export const CHANGE_REQUEST_APPROVED = 'change-request-approved';
export const CHANGE_REQUEST_APPROVAL_ADDED = 'change-request-approval-added';
export const CHANGE_REQUEST_CANCELLED = 'change-request-cancelled';
export const CHANGE_REQUEST_SENT_TO_REVIEW = 'change-request-sent-to-review';
export const CHANGE_REQUEST_APPLIED = 'change-request-applied';
export const CHANGE_REQUEST_CREATED = 'change-request-created' as const;
export const CHANGE_REQUEST_DISCARDED = 'change-request-discarded' as const;
export const CHANGE_ADDED = 'change-added' as const;
export const CHANGE_DISCARDED = 'change-discarded' as const;
export const CHANGE_REQUEST_APPROVED = 'change-request-approved' as const;
export const CHANGE_REQUEST_APPROVAL_ADDED =
'change-request-approval-added' as const;
export const CHANGE_REQUEST_CANCELLED = 'change-request-cancelled' as const;
export const CHANGE_REQUEST_SENT_TO_REVIEW =
'change-request-sent-to-review' as const;
export const CHANGE_REQUEST_APPLIED = 'change-request-applied' as const;
export const API_TOKEN_CREATED = 'api-token-created';
export const API_TOKEN_UPDATED = 'api-token-updated';
export const API_TOKEN_DELETED = 'api-token-deleted';
export const API_TOKEN_CREATED = 'api-token-created' as const;
export const API_TOKEN_UPDATED = 'api-token-updated' as const;
export const API_TOKEN_DELETED = 'api-token-deleted' as const;
export const FEATURE_FAVORITED = 'feature-favorited';
export const FEATURE_UNFAVORITED = 'feature-unfavorited';
export const PROJECT_FAVORITED = 'project-favorited';
export const PROJECT_UNFAVORITED = 'project-unfavorited';
export const FEATURES_EXPORTED = 'features-exported';
export const FEATURES_IMPORTED = 'features-imported';
export const FEATURE_FAVORITED = 'feature-favorited' as const;
export const FEATURE_UNFAVORITED = 'feature-unfavorited' as const;
export const PROJECT_FAVORITED = 'project-favorited' as const;
export const PROJECT_UNFAVORITED = 'project-unfavorited' as const;
export const FEATURES_EXPORTED = 'features-exported' as const;
export const FEATURES_IMPORTED = 'features-imported' as const;
export const IEventTypes = [
APPLICATION_CREATED,
FEATURE_CREATED,
FEATURE_DELETED,
FEATURE_UPDATED,
FEATURE_METADATA_UPDATED,
FEATURE_VARIANTS_UPDATED,
FEATURE_ENVIRONMENT_VARIANTS_UPDATED,
FEATURE_PROJECT_CHANGE,
FEATURE_ARCHIVED,
FEATURE_REVIVED,
FEATURE_IMPORT,
FEATURE_TAGGED,
FEATURE_TAG_IMPORT,
FEATURE_STRATEGY_UPDATE,
FEATURE_STRATEGY_ADD,
FEATURE_STRATEGY_REMOVE,
DROP_FEATURE_TAGS,
FEATURE_UNTAGGED,
FEATURE_STALE_ON,
FEATURE_STALE_OFF,
DROP_FEATURES,
FEATURE_ENVIRONMENT_ENABLED,
FEATURE_ENVIRONMENT_DISABLED,
STRATEGY_CREATED,
STRATEGY_DELETED,
STRATEGY_DEPRECATED,
STRATEGY_REACTIVATED,
STRATEGY_UPDATED,
STRATEGY_IMPORT,
DROP_STRATEGIES,
CONTEXT_FIELD_CREATED,
CONTEXT_FIELD_UPDATED,
CONTEXT_FIELD_DELETED,
PROJECT_ACCESS_ADDED,
PROJECT_CREATED,
PROJECT_UPDATED,
PROJECT_DELETED,
PROJECT_IMPORT,
PROJECT_USER_ADDED,
PROJECT_USER_REMOVED,
PROJECT_USER_ROLE_CHANGED,
PROJECT_GROUP_ROLE_CHANGED,
PROJECT_GROUP_ADDED,
PROJECT_GROUP_REMOVED,
DROP_PROJECTS,
TAG_CREATED,
TAG_DELETED,
TAG_IMPORT,
DROP_TAGS,
TAG_TYPE_CREATED,
TAG_TYPE_DELETED,
TAG_TYPE_UPDATED,
TAG_TYPE_IMPORT,
DROP_TAG_TYPES,
ADDON_CONFIG_CREATED,
ADDON_CONFIG_UPDATED,
ADDON_CONFIG_DELETED,
DB_POOL_UPDATE,
USER_CREATED,
USER_UPDATED,
USER_DELETED,
DROP_ENVIRONMENTS,
ENVIRONMENT_IMPORT,
SEGMENT_CREATED,
SEGMENT_UPDATED,
SEGMENT_DELETED,
GROUP_CREATED,
GROUP_UPDATED,
SETTING_CREATED,
SETTING_UPDATED,
SETTING_DELETED,
CLIENT_METRICS,
CLIENT_REGISTER,
PAT_CREATED,
PAT_DELETED,
PUBLIC_SIGNUP_TOKEN_CREATED,
PUBLIC_SIGNUP_TOKEN_USER_ADDED,
PUBLIC_SIGNUP_TOKEN_TOKEN_UPDATED,
CHANGE_REQUEST_CREATED,
CHANGE_REQUEST_DISCARDED,
CHANGE_ADDED,
CHANGE_DISCARDED,
CHANGE_REQUEST_APPROVED,
CHANGE_REQUEST_APPROVAL_ADDED,
CHANGE_REQUEST_CANCELLED,
CHANGE_REQUEST_SENT_TO_REVIEW,
CHANGE_REQUEST_APPLIED,
API_TOKEN_CREATED,
API_TOKEN_UPDATED,
API_TOKEN_DELETED,
FEATURE_FAVORITED,
FEATURE_UNFAVORITED,
PROJECT_FAVORITED,
PROJECT_UNFAVORITED,
FEATURES_EXPORTED,
FEATURES_IMPORTED,
] as const;
export type IEventType = typeof IEventTypes[number];
export interface IBaseEvent {
type: string;
type: IEventType;
createdBy: string;
project?: string;
environment?: string;
@ -132,7 +239,7 @@ export interface IEventList {
}
class BaseEvent implements IBaseEvent {
readonly type: string;
readonly type: IEventType;
readonly createdBy: string;
@ -141,7 +248,11 @@ class BaseEvent implements IBaseEvent {
/**
* @param createdBy accepts a string for backward compatibility. Prefer using IUser for standardization
*/
constructor(type: string, createdBy: string | IUser, tags: ITag[] = []) {
constructor(
type: IEventType,
createdBy: string | IUser,
tags: ITag[] = [],
) {
this.type = type;
this.createdBy =
typeof createdBy === 'string'

View File

@ -59,7 +59,6 @@ test('the generated OpenAPI spec is valid', async () => {
.get('/docs/openapi.json')
.expect('Content-Type', /json/)
.expect(200);
// this throws if the swagger parser can't parse it correctly
// also parses examples, but _does_ do some string coercion in examples
try {
@ -86,7 +85,6 @@ test('the generated OpenAPI spec is valid', async () => {
],
},
});
if (enforcerWarning !== undefined) {
console.warn(enforcerWarning);
}

View File

@ -47,8 +47,8 @@ beforeAll(async () => {
});
userStore = stores.userStore;
const rootRoles = await accessService.getRootRoles();
adminRole = rootRoles.find((r) => r.name === RoleName.ADMIN);
viewerRole = rootRoles.find((r) => r.name === RoleName.VIEWER);
adminRole = rootRoles.find((r) => r.name === RoleName.ADMIN)!;
viewerRole = rootRoles.find((r) => r.name === RoleName.VIEWER)!;
});
afterAll(async () => {
@ -218,7 +218,6 @@ test('updating a user without an email should not strip the email', async () =>
await userService.updateUser({
id: user.id,
email: null,
name: 'some',
});

View File

@ -40,7 +40,7 @@ test('Should include id and createdAt when saving', async () => {
appName: 'test1',
},
};
const seen = [];
const seen: Array<IEvent> = [];
eventStore.on(APPLICATION_CREATED, (e) => seen.push(e));
await eventStore.store(event1);
jest.advanceTimersByTime(100);