1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-04-15 01:16:22 +02:00

refactor: feature oriented architecture for project-environment (#5510)

This commit is contained in:
Mateusz Kwasniewski 2023-12-01 12:41:46 +01:00 committed by GitHub
parent 63f6af06da
commit 26f9cf98d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 217 additions and 97 deletions

View File

@ -20,7 +20,7 @@ import { ResetTokenStore } from './reset-token-store';
import UserFeedbackStore from './user-feedback-store';
import FeatureStrategyStore from '../features/feature-toggle/feature-toggle-strategies-store';
import FeatureToggleClientStore from '../features/client-feature-toggles/client-feature-toggle-store';
import EnvironmentStore from './environment-store';
import EnvironmentStore from '../features/project-environments/environment-store';
import FeatureTagStore from './feature-tag-store';
import { FeatureEnvironmentStore } from './feature-environment-store';
import { ClientMetricsStoreV2 } from './client-metrics-store-v2';

View File

@ -3,14 +3,14 @@ import EventStore from '../../db/event-store';
import GroupStore from '../../db/group-store';
import { AccountStore } from '../../db/account-store';
import RoleStore from '../../db/role-store';
import EnvironmentStore from '../../db/environment-store';
import EnvironmentStore from '../project-environments/environment-store';
import { AccessStore } from '../../db/access-store';
import { AccessService, EventService, GroupService } from '../../services';
import FakeGroupStore from '../../../test/fixtures/fake-group-store';
import FakeEventStore from '../../../test/fixtures/fake-event-store';
import { FakeAccountStore } from '../../../test/fixtures/fake-account-store';
import FakeRoleStore from '../../../test/fixtures/fake-role-store';
import FakeEnvironmentStore from '../../../test/fixtures/fake-environment-store';
import FakeEnvironmentStore from '../project-environments/fake-environment-store';
import FakeAccessStore from '../../../test/fixtures/fake-access-store';
import FeatureTagStore from '../../db/feature-tag-store';
import FakeFeatureTagStore from '../../../test/fixtures/fake-feature-tag-store';

View File

@ -14,7 +14,7 @@ import GroupStore from '../../db/group-store';
import { AccountStore } from '../../db/account-store';
import { AccessStore } from '../../db/access-store';
import RoleStore from '../../db/role-store';
import EnvironmentStore from '../../db/environment-store';
import EnvironmentStore from '../project-environments/environment-store';
import { Db } from '../../db/db';
import { IUnleashConfig } from '../../types';
import FakeEventStore from '../../../test/fixtures/fake-event-store';
@ -28,7 +28,7 @@ import FakeGroupStore from '../../../test/fixtures/fake-group-store';
import { FakeAccountStore } from '../../../test/fixtures/fake-account-store';
import FakeAccessStore from '../../../test/fixtures/fake-access-store';
import FakeRoleStore from '../../../test/fixtures/fake-role-store';
import FakeEnvironmentStore from '../../../test/fixtures/fake-environment-store';
import FakeEnvironmentStore from '../project-environments/fake-environment-store';
import EventStore from '../../db/event-store';
import {
createChangeRequestAccessReadModel,

View File

@ -10,7 +10,7 @@ import {
IVariant,
SKIP_CHANGE_REQUEST,
} from '../../../types';
import EnvironmentService from '../../../services/environment-service';
import EnvironmentService from '../../project-environments/environment-service';
import { ForbiddenError, PatternError, PermissionError } from '../../../error';
import { ISegmentService } from '../../../segments/segment-service-interface';
import { createFeatureToggleService, createSegmentService } from '../..';

View File

@ -6,3 +6,4 @@ export * from './change-request-access-service/createChangeRequestAccessReadMode
export * from './segment/createSegmentService';
export * from './dependent-features/createDependentFeaturesService';
export * from './tag-type/createTagTypeService';
export * from './project-environments/createEnvironmentService';

View File

@ -7,7 +7,7 @@ import {
IUnleashStores,
} from '../../types/stores';
import { IContextFieldStore } from '../../types/stores/context-field-store';
import { IEnvironmentStore } from '../../types/stores/environment-store';
import { IEnvironmentStore } from '../project-environments/environment-store-type';
import { IFeatureToggleStore } from '../feature-toggle/types/feature-toggle-store-type';
import { IGroupStore } from '../../types/stores/group-store';
import { IProjectStore } from '../../types/stores/project-store';

View File

@ -0,0 +1,88 @@
import { Db } from '../../db/db';
import EventStore from '../../db/event-store';
import { IUnleashConfig } from '../../types';
import { EventService } from '../../services';
import FeatureTagStore from '../../db/feature-tag-store';
import FakeEventStore from '../../../test/fixtures/fake-event-store';
import FakeFeatureTagStore from '../../../test/fixtures/fake-feature-tag-store';
import EnvironmentService from './environment-service';
import EnvironmentStore from './environment-store';
import FeatureStrategiesStore from '../feature-toggle/feature-toggle-strategies-store';
import { FeatureEnvironmentStore } from '../../db/feature-environment-store';
import ProjectStore from '../../db/project-store';
import FakeFeatureEnvironmentStore from '../../../test/fixtures/fake-feature-environment-store';
import FakeProjectStore from '../../../test/fixtures/fake-project-store';
import FakeFeatureStrategiesStore from '../feature-toggle/fakes/fake-feature-strategies-store';
import FakeEnvironmentStore from './fake-environment-store';
export const createEnvironmentService =
(config: IUnleashConfig) =>
(db: Db): EnvironmentService => {
const { getLogger, eventBus, flagResolver } = config;
const eventStore = new EventStore(db, getLogger);
const featureTagStore = new FeatureTagStore(db, eventBus, getLogger);
const featureEnvironmentStore = new FeatureEnvironmentStore(
db,
eventBus,
getLogger,
);
const projectStore = new ProjectStore(
db,
eventBus,
getLogger,
flagResolver,
);
const featureStrategiesStore = new FeatureStrategiesStore(
db,
eventBus,
getLogger,
flagResolver,
);
const environmentStore = new EnvironmentStore(db, eventBus, getLogger);
const eventService = new EventService(
{
eventStore,
featureTagStore,
},
config,
);
return new EnvironmentService(
{
environmentStore,
featureStrategiesStore,
featureEnvironmentStore,
projectStore,
},
config,
eventService,
);
};
export const createFakeEnvironmentService = (
config: IUnleashConfig,
): EnvironmentService => {
const eventStore = new FakeEventStore();
const featureTagStore = new FakeFeatureTagStore();
const featureEnvironmentStore = new FakeFeatureEnvironmentStore();
const projectStore = new FakeProjectStore();
const featureStrategiesStore = new FakeFeatureStrategiesStore();
const environmentStore = new FakeEnvironmentStore();
const eventService = new EventService(
{
eventStore,
featureTagStore,
},
config,
);
return new EnvironmentService(
{
environmentStore,
featureStrategiesStore,
featureEnvironmentStore,
projectStore,
},
config,
eventService,
);
};

View File

@ -1,10 +1,10 @@
import EnvironmentService from '../../../lib/services/environment-service';
import { createTestConfig } from '../../config/test-config';
import dbInit from '../helpers/database-init';
import NotFoundError from '../../../lib/error/notfound-error';
import { IUnleashStores } from '../../../lib/types';
import NameExistsError from '../../../lib/error/name-exists-error';
import { EventService } from '../../../lib/services';
import EnvironmentService from './environment-service';
import { createTestConfig } from '../../../test/config/test-config';
import dbInit from '../../../test/e2e/helpers/database-init';
import NotFoundError from '../../error/notfound-error';
import { IUnleashStores } from '../../types';
import NameExistsError from '../../error/name-exists-error';
import { EventService } from '../../services';
let stores: IUnleashStores;
let db;

View File

@ -10,17 +10,17 @@ import {
IUnleashStores,
PROJECT_ENVIRONMENT_ADDED,
PROJECT_ENVIRONMENT_REMOVED,
} from '../types';
import { Logger } from '../logger';
import { BadDataError, UNIQUE_CONSTRAINT_VIOLATION } from '../error';
import NameExistsError from '../error/name-exists-error';
import { sortOrderSchema } from './state-schema';
import NotFoundError from '../error/notfound-error';
} from '../../types';
import { Logger } from '../../logger';
import { BadDataError, UNIQUE_CONSTRAINT_VIOLATION } from '../../error';
import NameExistsError from '../../error/name-exists-error';
import { sortOrderSchema } from '../../services/state-schema';
import NotFoundError from '../../error/notfound-error';
import { IProjectStore } from 'lib/types/stores/project-store';
import MinimumOneEnvironmentError from '../error/minimum-one-environment-error';
import MinimumOneEnvironmentError from '../../error/minimum-one-environment-error';
import { IFlagResolver } from 'lib/types/experimental';
import { CreateFeatureStrategySchema } from '../openapi';
import EventService from './event-service';
import { CreateFeatureStrategySchema } from '../../openapi';
import EventService from '../../services/event-service';
export default class EnvironmentService {
private logger: Logger;

View File

@ -2,8 +2,8 @@ import {
IEnvironment,
IEnvironmentCreate,
IProjectEnvironment,
} from '../model';
import { Store } from './store';
} from '../../types/model';
import { Store } from '../../types/stores/store';
export interface IEnvironmentStore extends Store<IEnvironment, string> {
exists(name: string): Promise<boolean>;

View File

@ -1,17 +1,17 @@
import EventEmitter from 'events';
import { Db } from './db';
import { Logger, LogProvider } from '../logger';
import metricsHelper from '../util/metrics-helper';
import { DB_TIME } from '../metric-events';
import { Db } from '../../db/db';
import { Logger, LogProvider } from '../../logger';
import metricsHelper from '../../util/metrics-helper';
import { DB_TIME } from '../../metric-events';
import {
IEnvironment,
IEnvironmentCreate,
IProjectEnvironment,
} from '../types/model';
import NotFoundError from '../error/notfound-error';
import { IEnvironmentStore } from '../types/stores/environment-store';
import { snakeCaseKeys } from '../util/snakeCase';
import { CreateFeatureStrategySchema } from '../openapi';
} from '../../types/model';
import NotFoundError from '../../error/notfound-error';
import { IEnvironmentStore } from './environment-store-type';
import { snakeCaseKeys } from '../../util/snakeCase';
import { CreateFeatureStrategySchema } from '../../openapi';
interface IEnvironmentsTable {
name: string;

View File

@ -1,10 +1,10 @@
import dbInit, { ITestDb } from '../../../helpers/database-init';
import dbInit, { ITestDb } from '../../../test/e2e/helpers/database-init';
import {
IUnleashTest,
setupAppWithCustomConfig,
} from '../../../helpers/test-helper';
import getLogger from '../../../../fixtures/no-logger';
import { DEFAULT_ENV } from '../../../../../lib/util';
} from '../../../test/e2e/helpers/test-helper';
import getLogger from '../../../test/fixtures/no-logger';
import { DEFAULT_ENV } from '../../util';
let app: IUnleashTest;
let db: ITestDb;

View File

@ -1,13 +1,13 @@
import { Request, Response } from 'express';
import Controller from '../../controller';
import Controller from '../../routes/controller';
import {
IUnleashConfig,
IUnleashServices,
serializeDates,
UPDATE_PROJECT,
} from '../../../types';
import { Logger } from '../../../logger';
import EnvironmentService from '../../../services/environment-service';
} from '../../types';
import { Logger } from '../../logger';
import EnvironmentService from './environment-service';
import {
createFeatureStrategySchema,
CreateFeatureStrategySchema,
@ -16,10 +16,11 @@ import {
emptyResponse,
getStandardResponses,
ProjectEnvironmentSchema,
} from '../../../openapi';
import { OpenApiService, ProjectService } from '../../../services';
import { extractUsername } from '../../../util';
import { IAuthRequest } from '../../unleash-types';
} from '../../openapi';
import { OpenApiService, ProjectService } from '../../services';
import { extractUsername } from '../../util';
import { IAuthRequest } from '../../routes/unleash-types';
import { WithTransactional } from '../../db/transaction';
const PREFIX = '/:projectId/environments';
@ -31,7 +32,7 @@ interface IProjectEnvironmentParams {
export default class EnvironmentsController extends Controller {
private logger: Logger;
private environmentService: EnvironmentService;
private environmentService: WithTransactional<EnvironmentService>;
private openApiService: OpenApiService;
@ -40,18 +41,20 @@ export default class EnvironmentsController extends Controller {
constructor(
config: IUnleashConfig,
{
environmentService,
transactionalEnvironmentService,
openApiService,
projectService,
}: Pick<
IUnleashServices,
'environmentService' | 'openApiService' | 'projectService'
| 'transactionalEnvironmentService'
| 'openApiService'
| 'projectService'
>,
) {
super(config);
this.logger = config.getLogger('admin-api/project/environments.ts');
this.environmentService = environmentService;
this.environmentService = transactionalEnvironmentService;
this.openApiService = openApiService;
this.projectService = projectService;
@ -137,10 +140,12 @@ export default class EnvironmentsController extends Controller {
const { environment } = req.body;
await this.projectService.getProject(projectId); // Validates that the project exists
await this.environmentService.addEnvironmentToProject(
environment,
projectId,
extractUsername(req),
await this.environmentService.transactional((service) =>
service.addEnvironmentToProject(
environment,
projectId,
extractUsername(req),
),
);
res.status(200).end();
@ -152,10 +157,12 @@ export default class EnvironmentsController extends Controller {
): Promise<void> {
const { projectId, environment } = req.params;
await this.environmentService.removeEnvironmentFromProject(
environment,
projectId,
extractUsername(req),
await this.environmentService.transactional((service) =>
service.removeEnvironmentFromProject(
environment,
projectId,
extractUsername(req),
),
);
res.status(200).end();
@ -171,11 +178,13 @@ export default class EnvironmentsController extends Controller {
const { projectId, environment } = req.params;
const strategy = req.body;
const saved = await this.environmentService.updateDefaultStrategy(
environment,
projectId,
strategy,
extractUsername(req),
const saved = await this.environmentService.transactional((service) =>
service.updateDefaultStrategy(
environment,
projectId,
strategy,
extractUsername(req),
),
);
this.openApiService.respondWithValidation(

View File

@ -1,6 +1,6 @@
import { IEnvironment, IProjectEnvironment } from '../../lib/types/model';
import NotFoundError from '../../lib/error/notfound-error';
import { IEnvironmentStore } from '../../lib/types/stores/environment-store';
import { IEnvironment, IProjectEnvironment } from '../../types/model';
import NotFoundError from '../../error/notfound-error';
import { IEnvironmentStore } from './environment-store-type';
export default class FakeEnvironmentStore implements IEnvironmentStore {
importEnvironments(envs: IEnvironment[]): Promise<IEnvironment[]> {

View File

@ -2,7 +2,7 @@ import { Db, IUnleashConfig } from 'lib/server-impl';
import EventStore from '../../db/event-store';
import GroupStore from '../../db/group-store';
import { AccountStore } from '../../db/account-store';
import EnvironmentStore from '../../db/environment-store';
import EnvironmentStore from '../project-environments/environment-store';
import {
AccessService,
EventService,
@ -28,7 +28,7 @@ import { FavoriteFeaturesStore } from '../../db/favorite-features-store';
import { FavoriteProjectsStore } from '../../db/favorite-projects-store';
import FakeProjectStore from '../../../test/fixtures/fake-project-store';
import FakeFeatureToggleStore from '../feature-toggle/fakes/fake-feature-toggle-store';
import FakeEnvironmentStore from '../../../test/fixtures/fake-environment-store';
import FakeEnvironmentStore from '../project-environments/fake-environment-store';
import FakeFeatureEnvironmentStore from '../../../test/fixtures/fake-feature-environment-store';
import FakeProjectStatsStore from '../../../test/fixtures/fake-project-stats-store';
import FakeFavoriteFeaturesStore from '../../../test/fixtures/fake-favorite-features-store';

View File

@ -2,7 +2,7 @@ import { Request, Response } from 'express';
import Controller from '../controller';
import { IUnleashServices } from '../../types/services';
import { IUnleashConfig } from '../../types/option';
import EnvironmentService from '../../services/environment-service';
import EnvironmentService from '../../features/project-environments/environment-service';
import { Logger } from '../../logger';
import { ADMIN, NONE } from '../../types/permissions';
import { OpenApiService } from '../../services/openapi-service';

View File

@ -9,7 +9,7 @@ import {
serializeDates,
} from '../../../types';
import ProjectFeaturesController from '../../../features/feature-toggle/feature-toggle-controller';
import EnvironmentsController from './environments';
import EnvironmentsController from '../../../features/project-environments/environments';
import ProjectHealthReport from './health-report';
import ProjectService from '../../../services/project-service';
import VariantsController from './variants';

View File

@ -11,7 +11,7 @@ import { CUSTOM_ROOT_ROLE_TYPE } from '../util/constants';
import FakeGroupStore from '../../test/fixtures/fake-group-store';
import { FakeAccountStore } from '../../test/fixtures/fake-account-store';
import FakeRoleStore from '../../test/fixtures/fake-role-store';
import FakeEnvironmentStore from '../../test/fixtures/fake-environment-store';
import FakeEnvironmentStore from '../features/project-environments/fake-environment-store';
import AccessStoreMock from '../../test/fixtures/fake-access-store';
import { GroupService } from '../services/group-service';
import FakeEventStore from '../../test/fixtures/fake-event-store';

View File

@ -24,7 +24,7 @@ import {
} from '../types/model';
import { IRoleStore } from '../types/stores/role-store';
import NameExistsError from '../error/name-exists-error';
import { IEnvironmentStore } from '../types/stores/environment-store';
import { IEnvironmentStore } from '../features/project-environments/environment-store-type';
import RoleInUseError from '../error/role-in-use-error';
import { roleSchema } from '../schema/role-schema';
import {

View File

@ -3,7 +3,7 @@ import { createTestConfig } from '../../test/config/test-config';
import { IUnleashConfig } from '../server-impl';
import { ApiTokenType, IApiTokenCreate } from '../types/models/api-token';
import FakeApiTokenStore from '../../test/fixtures/fake-api-token-store';
import FakeEnvironmentStore from '../../test/fixtures/fake-environment-store';
import FakeEnvironmentStore from '../features/project-environments/fake-environment-store';
import FakeEventStore from '../../test/fixtures/fake-event-store';
import {
API_TOKEN_CREATED,

View File

@ -17,7 +17,7 @@ import {
import { IApiTokenStore } from '../types/stores/api-token-store';
import { FOREIGN_KEY_VIOLATION } from '../error/db-error';
import BadDataError from '../error/bad-data-error';
import { IEnvironmentStore } from 'lib/types/stores/environment-store';
import { IEnvironmentStore } from 'lib/features/project-environments/environment-store-type';
import { constantTimeCompare } from '../util/constantTimeCompare';
import {
ApiTokenCreatedEvent,

View File

@ -22,7 +22,7 @@ import SettingService from './setting-service';
import SessionService from './session-service';
import UserFeedbackService from './user-feedback-service';
import FeatureToggleService from '../features/feature-toggle/feature-toggle-service';
import EnvironmentService from './environment-service';
import EnvironmentService from '../features/project-environments/environment-service';
import FeatureTagService from './feature-tag-service';
import ProjectHealthService from './project-health-service';
import UserSplashService from './user-splash-service';
@ -59,6 +59,8 @@ import {
} from '../features/change-request-segment-usage-service/createChangeRequestSegmentUsageReadModel';
import ConfigurationRevisionService from '../features/feature-toggle/configuration-revision-service';
import {
createEnvironmentService,
createFakeEnvironmentService,
createFakeProjectService,
createFeatureToggleService,
createProjectService,
@ -229,11 +231,11 @@ export const createServices = (
dependentFeaturesReadModel,
dependentFeaturesService,
);
const environmentService = new EnvironmentService(
stores,
config,
eventService,
);
const transactionalEnvironmentService = db
? withTransactional(createEnvironmentService(config), db)
: withFakeTransactional(createFakeEnvironmentService(config));
const environmentService = transactionalEnvironmentService;
const featureTagService = new FeatureTagService(
stores,
config,
@ -340,6 +342,7 @@ export const createServices = (
resetTokenService,
eventService,
environmentService,
transactionalEnvironmentService,
settingService,
sessionService,
userFeedbackService,

View File

@ -45,7 +45,7 @@ import { ITagStore } from '../types/stores/tag-store';
import { IStrategy, IStrategyStore } from '../types/stores/strategy-store';
import { IFeatureToggleStore } from '../features/feature-toggle/types/feature-toggle-store-type';
import { IFeatureStrategiesStore } from '../features/feature-toggle/types/feature-toggle-strategies-store-type';
import { IEnvironmentStore } from '../types/stores/environment-store';
import { IEnvironmentStore } from '../features/project-environments/environment-store-type';
import { IFeatureEnvironmentStore } from '../types/stores/feature-environment-store';
import { IUnleashStores } from '../types/stores';
import { DEFAULT_ENV } from '../util/constants';

View File

@ -19,7 +19,7 @@ import SettingService from '../services/setting-service';
import SessionService from '../services/session-service';
import UserFeedbackService from '../services/user-feedback-service';
import FeatureToggleService from '../features/feature-toggle/feature-toggle-service';
import EnvironmentService from '../services/environment-service';
import EnvironmentService from '../features/project-environments/environment-service';
import FeatureTagService from '../services/feature-tag-service';
import ProjectHealthService from '../services/project-health-service';
import ClientMetricsServiceV2 from '../services/client-metrics/metrics-service-v2';
@ -62,6 +62,7 @@ export interface IUnleashServices {
contextService: ContextService;
emailService: EmailService;
environmentService: EnvironmentService;
transactionalEnvironmentService: WithTransactional<EnvironmentService>;
eventService: EventService;
edgeService: EdgeService;
featureTagService: FeatureTagService;

View File

@ -19,7 +19,7 @@ import { IResetTokenStore } from './stores/reset-token-store';
import { IUserFeedbackStore } from './stores/user-feedback-store';
import { IFeatureEnvironmentStore } from './stores/feature-environment-store';
import { IFeatureStrategiesStore } from '../features/feature-toggle/types/feature-toggle-strategies-store-type';
import { IEnvironmentStore } from './stores/environment-store';
import { IEnvironmentStore } from '../features/project-environments/environment-store-type';
import { IFeatureToggleClientStore } from '../features/client-feature-toggles/types/client-feature-toggle-store-type';
import { IClientMetricsStoreV2 } from './stores/client-metrics-store-v2';
import { IUserSplashStore } from './stores/user-splash-store';

View File

@ -11,13 +11,17 @@ let db: ITestDb;
beforeAll(async () => {
db = await dbInit('environment_api_serial', getLogger);
app = await setupAppWithCustomConfig(db.stores, {
experimental: {
flags: {
strictSchemaValidation: true,
app = await setupAppWithCustomConfig(
db.stores,
{
experimental: {
flags: {
strictSchemaValidation: true,
},
},
},
});
db.rawDatabase,
);
});
afterAll(async () => {

View File

@ -1,5 +1,9 @@
import dbInit, { ITestDb } from '../../helpers/database-init';
import { IUnleashTest, setupApp } from '../../helpers/test-helper';
import {
IUnleashTest,
setupApp,
setupAppWithCustomConfig,
} from '../../helpers/test-helper';
import getLogger from '../../../fixtures/no-logger';
import { DEFAULT_ENV } from '../../../../lib/util/constants';
import { collectIds } from '../../../../lib/util/collect-ids';
@ -12,7 +16,17 @@ let db: ITestDb;
beforeAll(async () => {
db = await dbInit('state_api_serial', getLogger);
app = await setupApp(db.stores);
app = await setupAppWithCustomConfig(
db.stores,
{
experimental: {
flags: {
strictSchemaValidation: true,
},
},
},
db.rawDatabase,
);
});
afterAll(async () => {

View File

@ -6,7 +6,7 @@ import { createTestConfig } from '../../config/test-config';
import dbState from './database.json';
import { LogProvider } from '../../../lib/logger';
import noLoggerProvider from '../../fixtures/no-logger';
import EnvironmentStore from '../../../lib/db/environment-store';
import EnvironmentStore from '../../../lib/features/project-environments/environment-store';
import { IUnleashStores } from '../../../lib/types';
import { IFeatureEnvironmentStore } from '../../../lib/types/stores/feature-environment-store';
import { DEFAULT_ENV } from '../../../lib/util/constants';

View File

@ -7,7 +7,7 @@ import { MOVE_FEATURE_TOGGLE } from '../../../lib/types/permissions';
import { createTestConfig } from '../../config/test-config';
import { RoleName } from '../../../lib/types/model';
import { randomId } from '../../../lib/util/random-id';
import EnvironmentService from '../../../lib/services/environment-service';
import EnvironmentService from '../../../lib/features/project-environments/environment-service';
import IncompatibleProjectError from '../../../lib/error/incompatible-project-error';
import { EventService } from '../../../lib/services';
import { FeatureEnvironmentEvent } from '../../../lib/types/events';

View File

@ -3,7 +3,7 @@ import dbInit from '../helpers/database-init';
import getLogger from '../../fixtures/no-logger';
import { IFeatureEnvironmentStore } from '../../../lib/types/stores/feature-environment-store';
import { IFeatureToggleStore } from '../../../lib/features/feature-toggle/types/feature-toggle-store-type';
import { IEnvironmentStore } from '../../../lib/types/stores/environment-store';
import { IEnvironmentStore } from '../../../lib/features/project-environments/environment-store-type';
let db;
let stores: IUnleashStores;

View File

@ -1,5 +1,5 @@
import { IProjectInsert, IProjectStore } from 'lib/types/stores/project-store';
import { IEnvironmentStore } from 'lib/types/stores/environment-store';
import { IEnvironmentStore } from 'lib/features/project-environments/environment-store-type';
import dbInit from '../helpers/database-init';
import getLogger from '../../fixtures/no-logger';

View File

@ -13,7 +13,7 @@ import FakeUserStore from './fake-user-store';
import FakeAccessStore from './fake-access-store';
import FakeUserFeedbackStore from './fake-user-feedback-store';
import FakeFeatureTagStore from './fake-feature-tag-store';
import FakeEnvironmentStore from './fake-environment-store';
import FakeEnvironmentStore from '../../lib/features/project-environments/fake-environment-store';
import FakeStrategiesStore from './fake-strategies-store';
import {
IImportTogglesStore,