1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/src/lib/addons/feature-event-formatter-md.ts
Aneesh Relan 1d5249eddc
fix: slack back link url to point to the feature page (#2128)
* fix: slack back link url to point to the feature page

* update snapshots

* update feature link in case project info is available in event

* update missing snapshot
2022-10-05 11:30:51 +02:00

154 lines
5.4 KiB
TypeScript

import {
FEATURE_CREATED,
FEATURE_UPDATED,
FEATURE_ARCHIVED,
FEATURE_STALE_ON,
FEATURE_STRATEGY_UPDATE,
FEATURE_STRATEGY_ADD,
FEATURE_ENVIRONMENT_ENABLED,
FEATURE_REVIVED,
FEATURE_STALE_OFF,
FEATURE_ENVIRONMENT_DISABLED,
FEATURE_STRATEGY_REMOVE,
FEATURE_METADATA_UPDATED,
FEATURE_PROJECT_CHANGE,
IEvent,
FEATURE_VARIANTS_UPDATED,
} from '../types/events';
export interface FeatureEventFormatter {
format: (event: IEvent) => string;
featureLink: (event: IEvent) => string;
}
export enum LinkStyle {
SLACK,
MD,
}
export class FeatureEventFormatterMd implements FeatureEventFormatter {
private unleashUrl: string;
private linkStyle: LinkStyle;
constructor(unleashUrl: string, linkStyle: LinkStyle = LinkStyle.MD) {
this.unleashUrl = unleashUrl;
this.linkStyle = linkStyle;
}
generateArchivedText(event: IEvent): string {
const { createdBy, type } = event;
const action = type === FEATURE_ARCHIVED ? 'archived' : 'revived';
const feature = this.generateFeatureLink(event);
return ` ${createdBy} just ${action} feature toggle *${feature}*`;
}
generateFeatureLink(event: IEvent): string {
if (this.linkStyle === LinkStyle.SLACK) {
return `<${this.featureLink(event)}|${event.featureName}>`;
} else {
return `[${event.featureName}](${this.featureLink(event)})`;
}
}
generateStaleText(event: IEvent): string {
const { createdBy, type } = event;
const isStale = type === FEATURE_STALE_ON;
const feature = this.generateFeatureLink(event);
if (isStale) {
return `${createdBy} marked ${feature} as stale and this feature toggle is now *ready to be removed* from the code.`;
}
return `${createdBy} removed the stale marking on *${feature}*.`;
}
generateEnvironmentToggleText(event: IEvent): string {
const { createdBy, environment, type, project } = event;
const toggleStatus =
type === FEATURE_ENVIRONMENT_ENABLED ? 'enabled' : 'disabled';
const feature = this.generateFeatureLink(event);
return `${createdBy} *${toggleStatus}* ${feature} in *${environment}* environment in project *${project}*`;
}
generateStrategyChangeText(event: IEvent): string {
const { createdBy, environment, project, data, preData, type } = event;
const feature = this.generateFeatureLink(event);
let strategyText: string = '';
if (FEATURE_STRATEGY_UPDATE === type) {
strategyText = `by updating strategy ${data?.name} in *${environment}*`;
} else if (FEATURE_STRATEGY_ADD === type) {
strategyText = `by adding strategy ${data?.name} in *${environment}*`;
} else if (FEATURE_STRATEGY_REMOVE === type) {
strategyText = `by removing strategy ${preData?.name} in *${environment}*`;
}
return `${createdBy} updated *${feature}* in project *${project}* ${strategyText}`;
}
generateMetadataText(event: IEvent): string {
const { createdBy, project } = event;
const feature = this.generateFeatureLink(event);
return `${createdBy} updated the metadata for ${feature} in project *${project}*`;
}
generateProjectChangeText(event: IEvent): string {
const { createdBy, project, featureName } = event;
return `${createdBy} moved ${featureName} to ${project}`;
}
featureLink(event: IEvent): string {
const { type, project = '', featureName } = event;
if (type === FEATURE_ARCHIVED) {
if (project) {
return `${this.unleashUrl}/projects/${project}/archive`;
}
return `${this.unleashUrl}/archive`;
}
return `${this.unleashUrl}/projects/${project}/features/${featureName}`;
}
getAction(type: string): string {
switch (type) {
case FEATURE_CREATED:
return 'created';
case FEATURE_UPDATED:
return 'updated';
case FEATURE_VARIANTS_UPDATED:
return 'updated variants for';
default:
return type;
}
}
defaultText(event: IEvent): string {
const { createdBy, project, type } = event;
const action = this.getAction(type);
const feature = this.generateFeatureLink(event);
return `${createdBy} ${action} feature toggle ${feature} in project *${project}*`;
}
format(event: IEvent): string {
switch (event.type) {
case FEATURE_ARCHIVED:
case FEATURE_REVIVED:
return this.generateArchivedText(event);
case FEATURE_STALE_ON:
case FEATURE_STALE_OFF:
return this.generateStaleText(event);
case FEATURE_ENVIRONMENT_DISABLED:
case FEATURE_ENVIRONMENT_ENABLED:
return this.generateEnvironmentToggleText(event);
case FEATURE_STRATEGY_ADD:
case FEATURE_STRATEGY_REMOVE:
case FEATURE_STRATEGY_UPDATE:
return this.generateStrategyChangeText(event);
case FEATURE_METADATA_UPDATED:
return this.generateMetadataText(event);
case FEATURE_PROJECT_CHANGE:
return this.generateProjectChangeText(event);
default:
return this.defaultText(event);
}
}
}