From 5d00157b7c17789bad1d7cb7d82d638ccd75f61a Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Tue, 5 Mar 2024 14:45:41 +0100 Subject: [PATCH] refactor: segment in feature oriented architecture (#6434) --- src/lib/db/index.ts | 2 +- .../feature-toggle/feature-toggle-service.ts | 2 +- .../tests/feature-toggle-service.e2e.test.ts | 2 +- .../createInstanceStatsService.ts | 2 +- .../instance-stats/instance-stats-service.ts | 2 +- .../segment/admin-segment.e2e.test.ts} | 18 +++++----- .../segment/client-segment.e2e.test.ts} | 28 +++++++-------- .../features/segment/createSegmentService.ts | 4 +-- .../features/segment/segment-controller.ts | 2 +- .../segment}/segment-service-interface.ts | 6 ++-- .../segment}/segment-service.ts | 34 +++++++++---------- .../segment/segment-store-type.ts} | 6 ++-- .../segment}/segment-store.test.ts | 10 +++--- .../{db => features/segment}/segment-store.ts | 22 +++++++----- src/lib/internals.ts | 2 +- .../feature-service-potentially-stale.test.ts | 2 +- src/lib/services/index.ts | 2 +- src/lib/services/state-service.ts | 2 +- src/lib/types/services.ts | 2 +- src/lib/types/stores.ts | 2 +- src/test/fixtures/fake-segment-store.ts | 2 +- 21 files changed, 77 insertions(+), 77 deletions(-) rename src/{test/e2e/api/admin/segment.e2e.test.ts => lib/features/segment/admin-segment.e2e.test.ts} (97%) rename src/{test/e2e/api/client/segment.e2e.test.ts => lib/features/segment/client-segment.e2e.test.ts} (96%) rename src/lib/{segments => features/segment}/segment-service-interface.ts (87%) rename src/lib/{services => features/segment}/segment-service.ts (90%) rename src/lib/{types/stores/segment-store.ts => features/segment/segment-store-type.ts} (82%) rename src/lib/{db => features/segment}/segment-store.test.ts (95%) rename src/lib/{db => features/segment}/segment-store.ts (96%) diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts index 1e9a5bdb80..67d3055916 100644 --- a/src/lib/db/index.ts +++ b/src/lib/db/index.ts @@ -26,7 +26,7 @@ import { FeatureEnvironmentStore } from './feature-environment-store'; import { ClientMetricsStoreV2 } from '../features/metrics/client-metrics/client-metrics-store-v2'; import UserSplashStore from './user-splash-store'; import RoleStore from './role-store'; -import SegmentStore from './segment-store'; +import SegmentStore from '../features/segment/segment-store'; import GroupStore from './group-store'; import PatStore from './pat-store'; import { PublicSignupTokenStore } from './public-signup-token-store'; diff --git a/src/lib/features/feature-toggle/feature-toggle-service.ts b/src/lib/features/feature-toggle/feature-toggle-service.ts index 56c5a53418..215c135b57 100644 --- a/src/lib/features/feature-toggle/feature-toggle-service.ts +++ b/src/lib/features/feature-toggle/feature-toggle-service.ts @@ -96,7 +96,7 @@ import { AccessService } from '../../services/access-service'; import { IUser } from '../../server-impl'; import { IFeatureProjectUserParams } from './feature-toggle-controller'; import { unique } from '../../util/unique'; -import { ISegmentService } from '../../segments/segment-service-interface'; +import { ISegmentService } from '../segment/segment-service-interface'; import { IChangeRequestAccessReadModel } from '../change-request-access-service/change-request-access-read-model'; import { checkFeatureFlagNamesAgainstPattern } from '../feature-naming-pattern/feature-naming-validation'; import { IPrivateProjectChecker } from '../private-project/privateProjectCheckerType'; diff --git a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts index 0cdef2a68f..bb216bb31d 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts @@ -15,7 +15,7 @@ import { } from '../../../types'; import EnvironmentService from '../../project-environments/environment-service'; import { ForbiddenError, PatternError, PermissionError } from '../../../error'; -import { ISegmentService } from '../../../segments/segment-service-interface'; +import { ISegmentService } from '../../segment/segment-service-interface'; import { createFeatureToggleService, createSegmentService } from '../..'; import { insertFeatureEnvironmentsLastSeen, diff --git a/src/lib/features/instance-stats/createInstanceStatsService.ts b/src/lib/features/instance-stats/createInstanceStatsService.ts index 98b8a75cb8..2a369b9eec 100644 --- a/src/lib/features/instance-stats/createInstanceStatsService.ts +++ b/src/lib/features/instance-stats/createInstanceStatsService.ts @@ -16,7 +16,7 @@ import EnvironmentStore from '../project-environments/environment-store'; import StrategyStore from '../../db/strategy-store'; import ContextFieldStore from '../../db/context-field-store'; import GroupStore from '../../db/group-store'; -import SegmentStore from '../../db/segment-store'; +import SegmentStore from '../segment/segment-store'; import RoleStore from '../../db/role-store'; import SettingStore from '../../db/setting-store'; import ClientInstanceStore from '../../db/client-instance-store'; diff --git a/src/lib/features/instance-stats/instance-stats-service.ts b/src/lib/features/instance-stats/instance-stats-service.ts index 656e8ac9a0..404d7eabba 100644 --- a/src/lib/features/instance-stats/instance-stats-service.ts +++ b/src/lib/features/instance-stats/instance-stats-service.ts @@ -14,7 +14,7 @@ import { IGroupStore } from '../../types/stores/group-store'; import { IProjectStore } from '../../features/project/project-store-type'; import { IStrategyStore } from '../../types/stores/strategy-store'; import { IUserStore } from '../../types/stores/user-store'; -import { ISegmentStore } from '../../types/stores/segment-store'; +import { ISegmentStore } from '../segment/segment-store-type'; import { IRoleStore } from '../../types/stores/role-store'; import VersionService from '../../services/version-service'; import { ISettingStore } from '../../types/stores/settings-store'; diff --git a/src/test/e2e/api/admin/segment.e2e.test.ts b/src/lib/features/segment/admin-segment.e2e.test.ts similarity index 97% rename from src/test/e2e/api/admin/segment.e2e.test.ts rename to src/lib/features/segment/admin-segment.e2e.test.ts index 1e0bf95664..eaef38cf95 100644 --- a/src/test/e2e/api/admin/segment.e2e.test.ts +++ b/src/lib/features/segment/admin-segment.e2e.test.ts @@ -1,18 +1,18 @@ -import { randomId } from '../../../../lib/util/random-id'; -import { IFeatureToggleClient, ISegment } from '../../../../lib/types/model'; -import { collectIds } from '../../../../lib/util/collect-ids'; -import dbInit, { ITestDb } from '../../helpers/database-init'; -import getLogger from '../../../fixtures/no-logger'; +import { randomId } from '../../util/random-id'; +import { IFeatureToggleClient, ISegment } from '../../types/model'; +import { collectIds } from '../../util/collect-ids'; +import dbInit, { ITestDb } from '../../../test/e2e/helpers/database-init'; +import getLogger from '../../../test/fixtures/no-logger'; import { addStrategyToFeatureEnv, createFeatureToggle, -} from '../../helpers/app.utils'; +} from '../../../test/e2e/helpers/app.utils'; import { IUnleashTest, setupAppWithCustomConfig, -} from '../../helpers/test-helper'; -import { StrategiesUsingSegment } from '../../../../lib/segments/segment-service-interface'; -import { IUser } from '../../../../lib/types'; +} from '../../../test/e2e/helpers/test-helper'; +import { StrategiesUsingSegment } from './segment-service-interface'; +import { IUser } from '../../types'; let app: IUnleashTest; let db: ITestDb; diff --git a/src/test/e2e/api/client/segment.e2e.test.ts b/src/lib/features/segment/client-segment.e2e.test.ts similarity index 96% rename from src/test/e2e/api/client/segment.e2e.test.ts rename to src/lib/features/segment/client-segment.e2e.test.ts index 9c35d719af..960b386371 100644 --- a/src/test/e2e/api/client/segment.e2e.test.ts +++ b/src/lib/features/segment/client-segment.e2e.test.ts @@ -1,30 +1,26 @@ -import dbInit, { ITestDb } from '../../helpers/database-init'; -import getLogger from '../../../fixtures/no-logger'; +import dbInit, { ITestDb } from '../../../test/e2e/helpers/database-init'; +import getLogger from '../../../test/fixtures/no-logger'; import { IUnleashTest, setupAppWithCustomConfig, -} from '../../helpers/test-helper'; -import { - IConstraint, - IFeatureToggleClient, - ISegment, -} from '../../../../lib/types/model'; -import { randomId } from '../../../../lib/util/random-id'; -import User from '../../../../lib/types/user'; +} from '../../../test/e2e/helpers/test-helper'; +import { IConstraint, IFeatureToggleClient, ISegment } from '../../types/model'; +import { randomId } from '../../util/random-id'; +import User from '../../types/user'; import { DEFAULT_SEGMENT_VALUES_LIMIT, DEFAULT_STRATEGY_SEGMENTS_LIMIT, -} from '../../../../lib/util/segments'; -import { collectIds } from '../../../../lib/util/collect-ids'; -import { arraysHaveSameItems } from '../../../../lib/util/arraysHaveSameItems'; +} from '../../util/segments'; +import { collectIds } from '../../util/collect-ids'; +import { arraysHaveSameItems } from '../../util/arraysHaveSameItems'; import { CreateFeatureSchema, CreateFeatureStrategySchema, FeatureStrategySchema, UpsertSegmentSchema, -} from '../../../../lib/openapi'; -import { DEFAULT_ENV } from '../../../../lib/util'; -import { DEFAULT_PROJECT } from '../../../../lib/types'; +} from '../../openapi'; +import { DEFAULT_ENV } from '../../util'; +import { DEFAULT_PROJECT } from '../../types'; let db: ITestDb; let app: IUnleashTest; diff --git a/src/lib/features/segment/createSegmentService.ts b/src/lib/features/segment/createSegmentService.ts index 958d88cddf..ddab9bb192 100644 --- a/src/lib/features/segment/createSegmentService.ts +++ b/src/lib/features/segment/createSegmentService.ts @@ -1,9 +1,9 @@ import { Db, IUnleashConfig } from '../../server-impl'; import { EventService, SegmentService } from '../../services'; import FakeEventStore from '../../../test/fixtures/fake-event-store'; -import { ISegmentService } from '../../segments/segment-service-interface'; +import { ISegmentService } from './segment-service-interface'; import FeatureStrategiesStore from '../feature-toggle/feature-toggle-strategies-store'; -import SegmentStore from '../../db/segment-store'; +import SegmentStore from './segment-store'; import FakeSegmentStore from '../../../test/fixtures/fake-segment-store'; import FakeFeatureStrategiesStore from '../feature-toggle/fakes/fake-feature-strategies-store'; import { diff --git a/src/lib/features/segment/segment-controller.ts b/src/lib/features/segment/segment-controller.ts index 5633263f58..e216d070ad 100644 --- a/src/lib/features/segment/segment-controller.ts +++ b/src/lib/features/segment/segment-controller.ts @@ -21,7 +21,7 @@ import { emptyResponse, getStandardResponses, } from '../../openapi/util/standard-responses'; -import { ISegmentService } from '../../segments/segment-service-interface'; +import { ISegmentService } from './segment-service-interface'; import { SegmentStrategiesSchema } from '../../openapi/spec/segment-strategies-schema'; import { AccessService, OpenApiService } from '../../services'; import { diff --git a/src/lib/segments/segment-service-interface.ts b/src/lib/features/segment/segment-service-interface.ts similarity index 87% rename from src/lib/segments/segment-service-interface.ts rename to src/lib/features/segment/segment-service-interface.ts index 67484522bb..590db47ef9 100644 --- a/src/lib/segments/segment-service-interface.ts +++ b/src/lib/features/segment/segment-service-interface.ts @@ -1,6 +1,6 @@ -import { ChangeRequestStrategy } from '../features/change-request-segment-usage-service/change-request-segment-usage-read-model'; -import { UpsertSegmentSchema } from '../openapi'; -import { IFeatureStrategy, ISegment, IUser } from '../types'; +import { ChangeRequestStrategy } from '../change-request-segment-usage-service/change-request-segment-usage-read-model'; +import { UpsertSegmentSchema } from '../../openapi'; +import { IFeatureStrategy, ISegment, IUser } from '../../types'; export type StrategiesUsingSegment = { strategies: IFeatureStrategy[]; diff --git a/src/lib/services/segment-service.ts b/src/lib/features/segment/segment-service.ts similarity index 90% rename from src/lib/services/segment-service.ts rename to src/lib/features/segment/segment-service.ts index 1231c1cf54..d88656f297 100644 --- a/src/lib/services/segment-service.ts +++ b/src/lib/features/segment/segment-service.ts @@ -1,32 +1,32 @@ -import { IUnleashConfig } from '../types/option'; +import { IUnleashConfig } from '../../types/option'; import { IFlagResolver, IUnleashStores, SKIP_CHANGE_REQUEST, SYSTEM_USER, -} from '../types'; -import { Logger } from '../logger'; -import NameExistsError from '../error/name-exists-error'; -import { ISegmentStore } from '../types/stores/segment-store'; -import { ISegment } from '../types/model'; -import { segmentSchema } from './segment-schema'; +} from '../../types'; +import { Logger } from '../../logger'; +import NameExistsError from '../../error/name-exists-error'; +import { ISegmentStore } from './segment-store-type'; +import { ISegment } from '../../types/model'; +import { segmentSchema } from '../../services/segment-schema'; import { SEGMENT_CREATED, SEGMENT_DELETED, SEGMENT_UPDATED, -} from '../types/events'; -import User from '../types/user'; -import { IFeatureStrategiesStore } from '../features/feature-toggle/types/feature-toggle-strategies-store-type'; -import BadDataError from '../error/bad-data-error'; +} from '../../types/events'; +import User from '../../types/user'; +import { IFeatureStrategiesStore } from '../feature-toggle/types/feature-toggle-strategies-store-type'; +import BadDataError from '../../error/bad-data-error'; import { ISegmentService, StrategiesUsingSegment, -} from '../segments/segment-service-interface'; -import { PermissionError } from '../error'; -import { IChangeRequestAccessReadModel } from '../features/change-request-access-service/change-request-access-read-model'; -import { IPrivateProjectChecker } from '../features/private-project/privateProjectCheckerType'; -import EventService from '../features/events/event-service'; -import { IChangeRequestSegmentUsageReadModel } from '../features/change-request-segment-usage-service/change-request-segment-usage-read-model'; +} from './segment-service-interface'; +import { PermissionError } from '../../error'; +import { IChangeRequestAccessReadModel } from '../change-request-access-service/change-request-access-read-model'; +import { IPrivateProjectChecker } from '../private-project/privateProjectCheckerType'; +import EventService from '../events/event-service'; +import { IChangeRequestSegmentUsageReadModel } from '../change-request-segment-usage-service/change-request-segment-usage-read-model'; export class SegmentService implements ISegmentService { private logger: Logger; diff --git a/src/lib/types/stores/segment-store.ts b/src/lib/features/segment/segment-store-type.ts similarity index 82% rename from src/lib/types/stores/segment-store.ts rename to src/lib/features/segment/segment-store-type.ts index 9328c73ec8..cf939d7edd 100644 --- a/src/lib/types/stores/segment-store.ts +++ b/src/lib/features/segment/segment-store-type.ts @@ -1,6 +1,6 @@ -import { IFeatureStrategySegment, ISegment } from '../model'; -import { Store } from './store'; -import User from '../user'; +import { IFeatureStrategySegment, ISegment } from '../../types/model'; +import { Store } from '../../types/stores/store'; +import User from '../../types/user'; export interface ISegmentStore extends Store { getAll(includeChangeRequestUsageData?: boolean): Promise; diff --git a/src/lib/db/segment-store.test.ts b/src/lib/features/segment/segment-store.test.ts similarity index 95% rename from src/lib/db/segment-store.test.ts rename to src/lib/features/segment/segment-store.test.ts index 0af116a282..39e6654de2 100644 --- a/src/lib/db/segment-store.test.ts +++ b/src/lib/features/segment/segment-store.test.ts @@ -1,8 +1,8 @@ -import { ISegmentStore } from '../types/stores/segment-store'; -import dbInit, { ITestDb } from '../../test/e2e/helpers/database-init'; -import getLogger from '../../test/fixtures/no-logger'; -import NotFoundError from '../error/notfound-error'; -import { IUnleashStores, IUser } from '../types'; +import { ISegmentStore } from './segment-store-type'; +import dbInit, { ITestDb } from '../../../test/e2e/helpers/database-init'; +import getLogger from '../../../test/fixtures/no-logger'; +import NotFoundError from '../../error/notfound-error'; +import { IUnleashStores, IUser } from '../../types'; let stores: IUnleashStores; let db: ITestDb; diff --git a/src/lib/db/segment-store.ts b/src/lib/features/segment/segment-store.ts similarity index 96% rename from src/lib/db/segment-store.ts rename to src/lib/features/segment/segment-store.ts index 6e19a5acb4..67346621e8 100644 --- a/src/lib/db/segment-store.ts +++ b/src/lib/features/segment/segment-store.ts @@ -1,13 +1,17 @@ -import { ISegmentStore } from '../types/stores/segment-store'; -import { IConstraint, IFeatureStrategySegment, ISegment } from '../types/model'; -import { Logger, LogProvider } from '../logger'; +import { ISegmentStore } from './segment-store-type'; +import { + IConstraint, + IFeatureStrategySegment, + ISegment, +} from '../../types/model'; +import { Logger, LogProvider } from '../../logger'; import EventEmitter from 'events'; -import NotFoundError from '../error/notfound-error'; -import { PartialSome } from '../types/partial'; -import User from '../types/user'; -import { Db } from './db'; -import { IFlagResolver } from '../types'; -import { isDefined } from '../util'; +import NotFoundError from '../../error/notfound-error'; +import { PartialSome } from '../../types/partial'; +import User from '../../types/user'; +import { Db } from '../../db/db'; +import { IFlagResolver } from '../../types'; +import { isDefined } from '../../util'; const T = { segments: 'segments', diff --git a/src/lib/internals.ts b/src/lib/internals.ts index 080762b956..369c8529f6 100644 --- a/src/lib/internals.ts +++ b/src/lib/internals.ts @@ -13,4 +13,4 @@ export * from './types'; export * from './util'; export * from './error'; export * from './features'; -export * from './segments/segment-service-interface'; +export * from './features/segment/segment-service-interface'; diff --git a/src/lib/services/feature-service-potentially-stale.test.ts b/src/lib/services/feature-service-potentially-stale.test.ts index eb4289e1f6..f6e69d7cd0 100644 --- a/src/lib/services/feature-service-potentially-stale.test.ts +++ b/src/lib/services/feature-service-potentially-stale.test.ts @@ -8,7 +8,7 @@ import { createTestConfig } from '../../test/config/test-config'; import FeatureToggleService from '../features/feature-toggle/feature-toggle-service'; import { AccessService } from './access-service'; import { IChangeRequestAccessReadModel } from '../features/change-request-access-service/change-request-access-read-model'; -import { ISegmentService } from '../segments/segment-service-interface'; +import { ISegmentService } from '../features/segment/segment-service-interface'; import { IPrivateProjectChecker } from '../features/private-project/privateProjectCheckerType'; import { IDependentFeaturesReadModel } from '../features/dependent-features/dependent-features-read-model-type'; import EventService from '../features/events/event-service'; diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts index 80fb65bb0c..8264bf5b35 100644 --- a/src/lib/services/index.ts +++ b/src/lib/services/index.ts @@ -26,7 +26,7 @@ import EnvironmentService from '../features/project-environments/environment-ser import FeatureTagService from './feature-tag-service'; import ProjectHealthService from './project-health-service'; import UserSplashService from './user-splash-service'; -import { SegmentService } from './segment-service'; +import { SegmentService } from '../features/segment/segment-service'; import { OpenApiService } from './openapi-service'; import { ClientSpecService } from './client-spec-service'; import { PlaygroundService } from '../features/playground/playground-service'; diff --git a/src/lib/services/state-service.ts b/src/lib/services/state-service.ts index 0ab906efe6..a51c30620f 100644 --- a/src/lib/services/state-service.ts +++ b/src/lib/services/state-service.ts @@ -50,7 +50,7 @@ import { IFeatureEnvironmentStore } from '../types/stores/feature-environment-st import { IUnleashStores } from '../types/stores'; import { DEFAULT_ENV } from '../util/constants'; import { GLOBAL_ENV } from '../types/environment'; -import { ISegmentStore } from '../types/stores/segment-store'; +import { ISegmentStore } from '../features/segment/segment-store-type'; import { PartialSome } from '../types/partial'; import EventService from '../features/events/event-service'; diff --git a/src/lib/types/services.ts b/src/lib/types/services.ts index be9933d88f..ed37265b16 100644 --- a/src/lib/types/services.ts +++ b/src/lib/types/services.ts @@ -43,7 +43,7 @@ import { IExportService, IImportService, } from '../features/export-import-toggles/export-import-service'; -import { ISegmentService } from '../segments/segment-service-interface'; +import { ISegmentService } from '../features/segment/segment-service-interface'; import ConfigurationRevisionService from '../features/feature-toggle/configuration-revision-service'; import EventAnnouncerService from '../services/event-announcer-service'; import { IPrivateProjectChecker } from '../features/private-project/privateProjectCheckerType'; diff --git a/src/lib/types/stores.ts b/src/lib/types/stores.ts index 2f635bab84..f38926066e 100644 --- a/src/lib/types/stores.ts +++ b/src/lib/types/stores.ts @@ -24,7 +24,7 @@ import { IFeatureToggleClientStore } from '../features/client-feature-toggles/ty import { IClientMetricsStoreV2 } from '../features/metrics/client-metrics/client-metrics-store-v2-type'; import { IUserSplashStore } from './stores/user-splash-store'; import { IRoleStore } from './stores/role-store'; -import { ISegmentStore } from './stores/segment-store'; +import { ISegmentStore } from '../features/segment/segment-store-type'; import { IGroupStore } from './stores/group-store'; import { IPatStore } from './stores/pat-store'; import { IPublicSignupTokenStore } from './stores/public-signup-token-store'; diff --git a/src/test/fixtures/fake-segment-store.ts b/src/test/fixtures/fake-segment-store.ts index 0d90dfa60b..329aea63c7 100644 --- a/src/test/fixtures/fake-segment-store.ts +++ b/src/test/fixtures/fake-segment-store.ts @@ -1,4 +1,4 @@ -import { ISegmentStore } from '../../lib/types/stores/segment-store'; +import { ISegmentStore } from '../../lib/features/segment/segment-store-type'; import { IFeatureStrategySegment, ISegment } from '../../lib/types/model'; export default class FakeSegmentStore implements ISegmentStore {