Skip to content

Commit

Permalink
refactor: Context service feature oriented (#9052)
Browse files Browse the repository at this point in the history
  • Loading branch information
kwasniew authored Jan 3, 2025
1 parent 9003a7e commit eb0b7d5
Show file tree
Hide file tree
Showing 26 changed files with 131 additions and 100 deletions.
2 changes: 1 addition & 1 deletion src/lib/db/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import FeatureTypeStore from './feature-type-store';
import StrategyStore from './strategy-store';
import ClientInstanceStore from './client-instance-store';
import ClientApplicationsStore from './client-applications-store';
import ContextFieldStore from './context-field-store';
import ContextFieldStore from '../features/context/context-field-store';
import SettingStore from './setting-store';
import UserStore from './user-store';
import ProjectStore from '../features/project/project-store';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Store } from './store';
import type { Store } from '../../types/stores/store';

export interface IContextFieldDto {
name: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import type { Db } from './db';
import type { Logger, LogProvider } from '../logger';
import type { Db } from '../../db/db';
import type { Logger, LogProvider } from '../../logger';
import type {
IContextField,
IContextFieldDto,
IContextFieldStore,
ILegalValue,
} from '../types/stores/context-field-store';
import NotFoundError from '../error/notfound-error';
import type { IFlagResolver } from '../types';
} from './context-field-store-type';
import NotFoundError from '../../error/notfound-error';
import type { IFlagResolver } from '../../types';

const COLUMNS = [
'name',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
import type { Logger } from '../logger';
import type { Logger } from '../../logger';
import type {
IContextField,
IContextFieldDto,
IContextFieldStore,
} from '../types/stores/context-field-store';
import type { IProjectStore } from '../features/project/project-store-type';
import type { IFeatureStrategiesStore, IUnleashStores } from '../types/stores';
import type { IUnleashConfig } from '../types/option';
import type { ContextFieldStrategiesSchema } from '../openapi/spec/context-field-strategies-schema';
} from './context-field-store-type';
import type {
IFeatureStrategiesStore,
IUnleashStores,
} from '../../types/stores';
import type { IUnleashConfig } from '../../types/option';
import type { ContextFieldStrategiesSchema } from '../../openapi/spec/context-field-strategies-schema';
import {
CONTEXT_FIELD_CREATED,
CONTEXT_FIELD_DELETED,
CONTEXT_FIELD_UPDATED,
type IAuditUser,
type IFeatureStrategy,
type IFlagResolver,
} from '../types';
import type { IPrivateProjectChecker } from '../features/private-project/privateProjectCheckerType';
import type EventService from '../features/events/event-service';
import { contextSchema } from './context-schema';
import { NameExistsError } from '../error';
import { nameSchema } from '../schema/feature-schema';
} from '../../types';
import type { IPrivateProjectChecker } from '../private-project/privateProjectCheckerType';
import type EventService from '../events/event-service';
import { contextSchema } from '../../services/context-schema';
import { NameExistsError } from '../../error';
import { nameSchema } from '../../schema/feature-schema';

class ContextService {
private projectStore: IProjectStore;

private eventService: EventService;

private contextFieldStore: IContextFieldStore;
Expand All @@ -39,13 +39,9 @@ class ContextService {

constructor(
{
projectStore,
contextFieldStore,
featureStrategiesStore,
}: Pick<
IUnleashStores,
'projectStore' | 'contextFieldStore' | 'featureStrategiesStore'
>,
}: Pick<IUnleashStores, 'contextFieldStore' | 'featureStrategiesStore'>,
{
getLogger,
flagResolver,
Expand All @@ -54,7 +50,6 @@ class ContextService {
privateProjectChecker: IPrivateProjectChecker,
) {
this.privateProjectChecker = privateProjectChecker;
this.projectStore = projectStore;
this.eventService = eventService;
this.flagResolver = flagResolver;
this.contextFieldStore = contextFieldStore;
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Request, Response } from 'express';

import Controller from '../controller';
import Controller from '../../routes/controller';

import {
CREATE_CONTEXT_FIELD,
Expand All @@ -10,9 +10,9 @@ import {
} from '../../types/permissions';
import type { IUnleashConfig } from '../../types/option';
import type { IUnleashServices } from '../../types/services';
import type ContextService from '../../services/context-service';
import type ContextService from './context-service';
import type { Logger } from '../../logger';
import type { IAuthRequest } from '../unleash-types';
import type { IAuthRequest } from '../../routes/unleash-types';

import type { OpenApiService } from '../../services/openapi-service';
import {
Expand Down
65 changes: 65 additions & 0 deletions src/lib/features/context/createContextService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import type { Db } from '../../db/db';
import type { IUnleashConfig } from '../../types';
import ContextService from './context-service';
import ContextFieldStore from './context-field-store';
import FeatureStrategiesStore from '../feature-toggle/feature-toggle-strategies-store';
import {
createEventsService,
createFakeEventsService,
} from '../events/createEventsService';
import { PrivateProjectChecker } from '../private-project/privateProjectChecker';
import PrivateProjectStore from '../private-project/privateProjectStore';
import FakeContextFieldStore from './fake-context-field-store';
import FakeFeatureStrategiesStore from '../feature-toggle/fakes/fake-feature-strategies-store';
import { FakePrivateProjectChecker } from '../private-project/fakePrivateProjectChecker';

export const createContextService =
(config: IUnleashConfig) =>
(db: Db): ContextService => {
const { getLogger, flagResolver, eventBus, isEnterprise } = config;
const contextFieldStore = new ContextFieldStore(
db,
getLogger,
flagResolver,
);
const featureStrategiesStore = new FeatureStrategiesStore(
db,
eventBus,
getLogger,
flagResolver,
);
const eventService = createEventsService(db, config);
const privateProjectStore = new PrivateProjectStore(db, getLogger);
const privateProjectChecker = new PrivateProjectChecker(
{ privateProjectStore },
{ isEnterprise },
);
return new ContextService(
{ contextFieldStore, featureStrategiesStore },
{
getLogger,
flagResolver,
},
eventService,
privateProjectChecker,
);
};

export const createFakeContextService = (
config: IUnleashConfig,
): ContextService => {
const { getLogger, flagResolver, eventBus, isEnterprise } = config;
const contextFieldStore = new FakeContextFieldStore();
const featureStrategiesStore = new FakeFeatureStrategiesStore();
const eventService = createFakeEventsService(config);
const privateProjectChecker = new FakePrivateProjectChecker();
return new ContextService(
{ contextFieldStore, featureStrategiesStore },
{
getLogger,
flagResolver,
},
eventService,
privateProjectChecker,
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import type {
IContextField,
IContextFieldDto,
IContextFieldStore,
} from '../../lib/types/stores/context-field-store';
import NotFoundError from '../../lib/error/notfound-error';
} from './context-field-store-type';
import NotFoundError from '../../error/notfound-error';

export default class FakeContextFieldStore implements IContextFieldStore {
count(): Promise<number> {
Expand Down
56 changes: 13 additions & 43 deletions src/lib/features/export-import-toggles/createExportImportService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@ import { ImportTogglesStore } from './import-toggles-store';
import FeatureToggleStore from '../feature-toggle/feature-toggle-store';
import TagStore from '../../db/tag-store';
import TagTypeStore from '../tag-type/tag-type-store';
import ProjectStore from '../project/project-store';
import FeatureTagStore from '../../db/feature-tag-store';
import StrategyStore from '../../db/strategy-store';
import ContextFieldStore from '../../db/context-field-store';
import ContextFieldStore from '../context/context-field-store';
import FeatureStrategiesStore from '../feature-toggle/feature-toggle-strategies-store';
import {
ContextService,
FeatureTagService,
StrategyService,
TagTypeService,
Expand All @@ -28,17 +26,12 @@ import { FeatureEnvironmentStore } from '../../db/feature-environment-store';
import FakeFeatureToggleStore from '../feature-toggle/fakes/fake-feature-toggle-store';
import FakeTagStore from '../../../test/fixtures/fake-tag-store';
import FakeTagTypeStore from '../tag-type/fake-tag-type-store';
import FakeProjectStore from '../../../test/fixtures/fake-project-store';
import FakeFeatureTagStore from '../../../test/fixtures/fake-feature-tag-store';
import FakeContextFieldStore from '../../../test/fixtures/fake-context-field-store';
import FakeContextFieldStore from '../context/fake-context-field-store';
import FakeFeatureStrategiesStore from '../feature-toggle/fakes/fake-feature-strategies-store';
import FakeFeatureEnvironmentStore from '../../../test/fixtures/fake-feature-environment-store';
import FakeStrategiesStore from '../../../test/fixtures/fake-strategies-store';
import EventStore from '../events/event-store';
import {
createFakePrivateProjectChecker,
createPrivateProjectChecker,
} from '../private-project/createPrivateProjectChecker';
import { createPrivateProjectChecker } from '../private-project/createPrivateProjectChecker';
import type { DeferredServiceFactory } from '../../db/transaction';
import { DependentFeaturesReadModel } from '../dependent-features/dependent-features-read-model';
import { FakeDependentFeaturesReadModel } from '../dependent-features/fake-dependent-features-read-model';
Expand All @@ -52,24 +45,26 @@ import {
} from '../events/createEventsService';
import { SegmentReadModel } from '../segment/segment-read-model';
import { FakeSegmentReadModel } from '../segment/fake-segment-read-model';
import {
createContextService,
createFakeContextService,
} from '../context/createContextService';

export const createFakeExportImportTogglesService = (
config: IUnleashConfig,
): ExportImportService => {
const { getLogger, flagResolver } = config;
const { getLogger } = config;
const importTogglesStore = {} as ImportTogglesStore;
const featureToggleStore = new FakeFeatureToggleStore();
const tagStore = new FakeTagStore();
const tagTypeStore = new FakeTagTypeStore();
const projectStore = new FakeProjectStore();
const featureTagStore = new FakeFeatureTagStore();
const strategyStore = new FakeStrategiesStore();
const contextFieldStore = new FakeContextFieldStore();
const featureStrategiesStore = new FakeFeatureStrategiesStore();
const featureEnvironmentStore = new FakeFeatureEnvironmentStore();
const { accessService } = createFakeAccessService(config);
const { featureToggleService } = createFakeFeatureToggleService(config);
const privateProjectChecker = createFakePrivateProjectChecker();

const eventService = createFakeEventsService(config);

Expand All @@ -82,16 +77,7 @@ export const createFakeExportImportTogglesService = (
{ getLogger },
eventService,
);
const contextService = new ContextService(
{
projectStore,
contextFieldStore,
featureStrategiesStore,
},
{ getLogger, flagResolver },
eventService,
privateProjectChecker,
);
const contextService = createFakeContextService(config);
const strategyService = new StrategyService(
{ strategyStore },
{ getLogger },
Expand All @@ -108,7 +94,7 @@ export const createFakeExportImportTogglesService = (

const dependentFeaturesService = createFakeDependentFeaturesService(config);

const exportImportService = new ExportImportService(
return new ExportImportService(
{
importTogglesStore,
featureStrategiesStore,
Expand All @@ -132,8 +118,6 @@ export const createFakeExportImportTogglesService = (
dependentFeaturesReadModel,
segmentReadModel,
);

return exportImportService;
};

export const deferredExportImportTogglesService = (
Expand All @@ -150,7 +134,6 @@ export const deferredExportImportTogglesService = (
);
const tagStore = new TagStore(db, eventBus, getLogger);
const tagTypeStore = new TagTypeStore(db, eventBus, getLogger);
const projectStore = new ProjectStore(db, eventBus, config);
const featureTagStore = new FeatureTagStore(db, eventBus, getLogger);
const strategyStore = new StrategyStore(db, getLogger);
const contextFieldStore = new ContextFieldStore(
Expand All @@ -169,11 +152,9 @@ export const deferredExportImportTogglesService = (
eventBus,
config,
);
const eventStore = new EventStore(db, getLogger);
const accessService = createAccessService(db, config);
const featureToggleService = createFeatureToggleService(db, config);
const privateProjectChecker = createPrivateProjectChecker(db, config);

createPrivateProjectChecker(db, config);
const eventService = createEventsService(db, config);

const featureTagService = new FeatureTagService(
Expand All @@ -185,16 +166,7 @@ export const deferredExportImportTogglesService = (
{ getLogger },
eventService,
);
const contextService = new ContextService(
{
projectStore,
contextFieldStore,
featureStrategiesStore,
},
{ getLogger, flagResolver },
eventService,
privateProjectChecker,
);
const contextService = createContextService(config)(db);
const strategyService = new StrategyService(
{ strategyStore },
{ getLogger },
Expand All @@ -212,7 +184,7 @@ export const deferredExportImportTogglesService = (
const dependentFeaturesService =
createDependentFeaturesService(config)(db);

const exportImportService = new ExportImportService(
return new ExportImportService(
{
importTogglesStore,
featureStrategiesStore,
Expand All @@ -236,8 +208,6 @@ export const deferredExportImportTogglesService = (
dependentFeaturesReadModel,
segmentReadModel,
);

return exportImportService;
};
};
export const createExportImportTogglesService = (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
RoleName,
} from '../../types';
import type { ImportTogglesSchema, VariantsSchema } from '../../openapi';
import type { IContextFieldDto } from '../../types/stores/context-field-store';
import type { IContextFieldDto } from '../context/context-field-store-type';
import type { AccessService } from '../../services';
import { DEFAULT_ENV } from '../../util';
import type { IRole } from '../../types/stores/access-store';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import type {
UpsertSegmentSchema,
VariantsSchema,
} from '../../openapi';
import type { IContextFieldDto } from '../../types/stores/context-field-store';
import type { IContextFieldDto } from '../context/context-field-store-type';

let app: IUnleashTest;
let db: ITestDb;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { IContextFieldDto } from '../../types/stores/context-field-store';
import type { IContextFieldDto } from '../context/context-field-store-type';

export const isValidField = (
importedField: IContextFieldDto,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type {
FeatureStrategySchema,
ImportTogglesValidateItemSchema,
} from '../../openapi';
import type { IContextFieldDto } from '../../types/stores/context-field-store';
import type { IContextFieldDto } from '../context/context-field-store-type';
import type { FeatureNameCheckResultWithFeaturePattern } from '../feature-toggle/feature-toggle-service';
import type { ProjectFeaturesLimit } from './import-toggles-store-type';

Expand Down
Loading

0 comments on commit eb0b7d5

Please sign in to comment.