mirror of
https://github.com/Unleash/unleash.git
synced 2024-10-23 20:07:40 +02:00
300 lines
8.9 KiB
TypeScript
300 lines
8.9 KiB
TypeScript
|
import { randomUUID } from 'crypto';
|
||
|
import FeatureStrategiesStore, {
|
||
|
IFeatureStrategy,
|
||
|
} from '../../lib/db/feature-strategy-store';
|
||
|
import noLoggerProvider from './no-logger';
|
||
|
import {
|
||
|
FeatureToggle,
|
||
|
FeatureToggleDTO,
|
||
|
FeatureToggleWithEnvironment,
|
||
|
IFeatureEnvironment,
|
||
|
IFeatureOverview,
|
||
|
IFeatureToggleClient,
|
||
|
IFeatureToggleQuery,
|
||
|
} from '../../lib/types/model';
|
||
|
import NotFoundError from '../../lib/error/notfound-error';
|
||
|
|
||
|
interface ProjectEnvironment {
|
||
|
projectName: string;
|
||
|
environment: string;
|
||
|
}
|
||
|
|
||
|
export default class FakeFeatureStrategiesStore extends FeatureStrategiesStore {
|
||
|
environmentAndFeature: Map<string, any[]> = new Map();
|
||
|
|
||
|
projectToEnvironment: ProjectEnvironment[] = [];
|
||
|
|
||
|
featureStrategies: IFeatureStrategy[] = [];
|
||
|
|
||
|
featureToggles: FeatureToggle[] = [];
|
||
|
|
||
|
constructor() {
|
||
|
super(undefined, undefined, noLoggerProvider);
|
||
|
}
|
||
|
|
||
|
async createStrategyConfig(
|
||
|
strategyConfig: Omit<IFeatureStrategy, 'id' | 'createdAt'>,
|
||
|
): Promise<IFeatureStrategy> {
|
||
|
const newStrat = { ...strategyConfig, id: randomUUID() };
|
||
|
this.featureStrategies.push(newStrat);
|
||
|
return Promise.resolve(newStrat);
|
||
|
}
|
||
|
|
||
|
async getStrategiesForToggle(
|
||
|
featureName: string,
|
||
|
): Promise<IFeatureStrategy[]> {
|
||
|
return this.featureStrategies.filter(
|
||
|
fS => fS.featureName === featureName,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
async createFeature(feature: any): Promise<void> {
|
||
|
this.featureToggles.push({
|
||
|
project: feature.project || 'default',
|
||
|
createdAt: new Date(),
|
||
|
...feature,
|
||
|
});
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async getAllFeatureStrategies(): Promise<IFeatureStrategy[]> {
|
||
|
return this.featureStrategies;
|
||
|
}
|
||
|
|
||
|
async deleteFeatureStrategies(): Promise<void> {
|
||
|
this.featureStrategies = [];
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async getStrategiesForEnvironment(
|
||
|
environment: string,
|
||
|
): Promise<IFeatureStrategy[]> {
|
||
|
const stratEnvs = this.featureStrategies.filter(
|
||
|
fS => fS.environment === environment,
|
||
|
);
|
||
|
return Promise.resolve(stratEnvs);
|
||
|
}
|
||
|
|
||
|
async removeAllStrategiesForEnv(
|
||
|
feature_name: string,
|
||
|
environment: string,
|
||
|
): Promise<void> {
|
||
|
const toRemove = this.featureStrategies.filter(
|
||
|
fS =>
|
||
|
fS.featureName === feature_name &&
|
||
|
fS.environment === environment,
|
||
|
);
|
||
|
this.featureStrategies = this.featureStrategies.filter(
|
||
|
f =>
|
||
|
!toRemove.some(
|
||
|
r =>
|
||
|
r.featureName === f.featureName &&
|
||
|
r.environment === f.environment,
|
||
|
),
|
||
|
);
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async getAll(): Promise<IFeatureStrategy[]> {
|
||
|
return Promise.resolve(this.featureStrategies);
|
||
|
}
|
||
|
|
||
|
async getStrategiesForFeature(
|
||
|
project_name: string,
|
||
|
feature_name: string,
|
||
|
environment: string,
|
||
|
): Promise<IFeatureStrategy[]> {
|
||
|
const rows = this.featureStrategies.filter(
|
||
|
fS =>
|
||
|
fS.projectName === project_name &&
|
||
|
fS.featureName === feature_name &&
|
||
|
fS.environment === environment,
|
||
|
);
|
||
|
return Promise.resolve(rows);
|
||
|
}
|
||
|
|
||
|
async getStrategiesForEnv(
|
||
|
environment: string,
|
||
|
): Promise<IFeatureStrategy[]> {
|
||
|
return this.featureStrategies.filter(
|
||
|
fS => fS.environment === environment,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
async getFeatureToggleAdmin(
|
||
|
featureName: string,
|
||
|
archived: boolean = false,
|
||
|
): Promise<FeatureToggleWithEnvironment> {
|
||
|
const toggle = this.featureToggles.find(f => f.name === featureName);
|
||
|
if (toggle) {
|
||
|
return Promise.resolve({ ...toggle, environments: [] });
|
||
|
}
|
||
|
return Promise.reject(
|
||
|
new NotFoundError(
|
||
|
`Could not find feature with name ${featureName}`,
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
async getFeatures(
|
||
|
featureQuery?: IFeatureToggleQuery,
|
||
|
archived: boolean = false,
|
||
|
): Promise<IFeatureToggleClient[]> {
|
||
|
const rows = this.featureToggles.filter(toggle => {
|
||
|
if (featureQuery.namePrefix) {
|
||
|
if (featureQuery.project) {
|
||
|
return (
|
||
|
toggle.name.startsWith(featureQuery.namePrefix) &&
|
||
|
featureQuery.project.includes(toggle.project)
|
||
|
);
|
||
|
}
|
||
|
return toggle.name.startsWith(featureQuery.namePrefix);
|
||
|
}
|
||
|
if (featureQuery.project) {
|
||
|
return featureQuery.project.includes(toggle.project);
|
||
|
}
|
||
|
return true;
|
||
|
});
|
||
|
const clientRows: IFeatureToggleClient[] = rows.map(t => ({
|
||
|
...t,
|
||
|
enabled: true,
|
||
|
strategies: [],
|
||
|
description: t.description || '',
|
||
|
type: t.type || 'Release',
|
||
|
stale: t.stale || false,
|
||
|
variants: [],
|
||
|
}));
|
||
|
return Promise.resolve(clientRows);
|
||
|
}
|
||
|
|
||
|
async getProjectOverview(projectId: string): Promise<IFeatureOverview[]> {
|
||
|
return Promise.resolve([]);
|
||
|
}
|
||
|
|
||
|
async getStrategyById(id: string): Promise<IFeatureStrategy> {
|
||
|
const strat = this.featureStrategies.find(fS => fS.id === id);
|
||
|
if (strat) {
|
||
|
return Promise.resolve(strat);
|
||
|
}
|
||
|
return Promise.reject(
|
||
|
new NotFoundError(`Could not find strategy with id ${id}`),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
async connectEnvironmentAndFeature(
|
||
|
feature_name: string,
|
||
|
environment: string,
|
||
|
enabled: boolean = false,
|
||
|
): Promise<void> {
|
||
|
if (!this.environmentAndFeature.has(environment)) {
|
||
|
this.environmentAndFeature.set(environment, []);
|
||
|
}
|
||
|
this.environmentAndFeature
|
||
|
.get(environment)
|
||
|
.push({ feature: feature_name, enabled });
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async enableEnvironmentForFeature(
|
||
|
feature_name: string,
|
||
|
environment: string,
|
||
|
): Promise<void> {
|
||
|
if (!this.environmentAndFeature.has(environment)) {
|
||
|
this.environmentAndFeature.set(environment, [
|
||
|
{
|
||
|
featureName: feature_name,
|
||
|
enabled: true,
|
||
|
},
|
||
|
]);
|
||
|
}
|
||
|
const features = this.environmentAndFeature.get(environment).map(f => {
|
||
|
if (f.featureName === feature_name) {
|
||
|
// eslint-disable-next-line no-param-reassign
|
||
|
f.enabled = true;
|
||
|
}
|
||
|
return f;
|
||
|
});
|
||
|
this.environmentAndFeature.set(environment, features);
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async removeEnvironmentForFeature(
|
||
|
feature_name: string,
|
||
|
environment: string,
|
||
|
): Promise<void> {
|
||
|
this.environmentAndFeature.set(
|
||
|
environment,
|
||
|
this.environmentAndFeature
|
||
|
.get(environment)
|
||
|
.filter(e => e.featureName !== feature_name),
|
||
|
);
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async disconnectEnvironmentFromProject(
|
||
|
environment: string,
|
||
|
project: string,
|
||
|
): Promise<void> {
|
||
|
this.projectToEnvironment = this.projectToEnvironment.filter(
|
||
|
f => f.projectName !== project && f.environment !== environment,
|
||
|
);
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async updateStrategy(
|
||
|
id: string,
|
||
|
updates: Partial<IFeatureStrategy>,
|
||
|
): Promise<IFeatureStrategy> {
|
||
|
this.featureStrategies = this.featureStrategies.map(f => {
|
||
|
if (f.id === id) {
|
||
|
return { ...f, ...updates };
|
||
|
}
|
||
|
return f;
|
||
|
});
|
||
|
return Promise.resolve(this.featureStrategies.find(f => f.id === id));
|
||
|
}
|
||
|
|
||
|
async getMembers(projectId: string): Promise<number> {
|
||
|
return Promise.resolve(0);
|
||
|
}
|
||
|
|
||
|
async getStrategiesAndMetadataForEnvironment(
|
||
|
environment: string,
|
||
|
featureName: string,
|
||
|
): Promise<void> {
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async deleteConfigurationsForProjectAndEnvironment(
|
||
|
projectId: String,
|
||
|
environment: String,
|
||
|
): Promise<void> {
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
async isEnvironmentEnabled(
|
||
|
featureName: string,
|
||
|
environment: string,
|
||
|
): Promise<boolean> {
|
||
|
const enabled =
|
||
|
this.environmentAndFeature
|
||
|
.get(environment)
|
||
|
?.find(f => f.featureName === featureName)?.enabled || false;
|
||
|
return Promise.resolve(enabled);
|
||
|
}
|
||
|
|
||
|
async toggleEnvironmentEnabledStatus(
|
||
|
environment: string,
|
||
|
featureName: string,
|
||
|
enabled: boolean,
|
||
|
): Promise<boolean> {
|
||
|
return Promise.resolve(enabled);
|
||
|
}
|
||
|
|
||
|
async getAllFeatureEnvironments(): Promise<IFeatureEnvironment[]> {
|
||
|
return Promise.resolve([]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = FakeFeatureStrategiesStore;
|