diff --git a/src/lib/db/segment-store.ts b/src/lib/db/segment-store.ts index a2fc24ce4c..5a895b5e6a 100644 --- a/src/lib/db/segment-store.ts +++ b/src/lib/db/segment-store.ts @@ -135,6 +135,16 @@ export default class SegmentStore implements ISegmentStore { return rows.map(this.mapRow); } + async getProjectSpecificSegments(project: string): Promise { + const rows: ISegmentRow[] = await this.db + .select(this.prefixColumns()) + .from(T.segments) + .where({ segment_project_id: project }) + .orderBy('name', 'asc'); + + return rows.map(this.mapRow); + } + deleteAll(): Promise { return this.db(T.segments).del(); } diff --git a/src/lib/features/feature-toggle/createFeatureToggleService.ts b/src/lib/features/feature-toggle/createFeatureToggleService.ts index c1eabb586b..e3c6d94db2 100644 --- a/src/lib/features/feature-toggle/createFeatureToggleService.ts +++ b/src/lib/features/feature-toggle/createFeatureToggleService.ts @@ -82,7 +82,7 @@ export const createFeatureToggleService = ( groupService, ); const segmentService = new SegmentService( - { segmentStore, featureStrategiesStore, eventStore }, + { segmentStore, featureStrategiesStore, eventStore, projectStore }, config, ); const featureToggleService = new FeatureToggleService( @@ -131,7 +131,7 @@ export const createFakeFeatureToggleService = ( groupService, ); const segmentService = new SegmentService( - { segmentStore, featureStrategiesStore, eventStore }, + { segmentStore, featureStrategiesStore, eventStore, projectStore }, config, ); const featureToggleService = new FeatureToggleService( diff --git a/src/lib/services/segment-service.ts b/src/lib/services/segment-service.ts index bb6819f4d7..e026659051 100644 --- a/src/lib/services/segment-service.ts +++ b/src/lib/services/segment-service.ts @@ -1,6 +1,6 @@ import { IUnleashConfig } from '../types/option'; import { IEventStore } from '../types/stores/event-store'; -import { IUnleashStores } from '../types'; +import { IProjectStore, IUnleashStores } from '../types'; import { Logger } from '../logger'; import NameExistsError from '../error/name-exists-error'; import { ISegmentStore } from '../types/stores/segment-store'; @@ -14,6 +14,7 @@ import { import User from '../types/user'; import { IFeatureStrategiesStore } from '../types/stores/feature-strategies-store'; import BadDataError from '../error/bad-data-error'; +import NotFoundError from '../error/notfound-error'; export class SegmentService { private logger: Logger; @@ -24,22 +25,29 @@ export class SegmentService { private eventStore: IEventStore; + private projectStore: IProjectStore; + private config: IUnleashConfig; constructor( { segmentStore, featureStrategiesStore, + projectStore, eventStore, }: Pick< IUnleashStores, - 'segmentStore' | 'featureStrategiesStore' | 'eventStore' + | 'segmentStore' + | 'featureStrategiesStore' + | 'eventStore' + | 'projectStore' >, config: IUnleashConfig, ) { this.segmentStore = segmentStore; this.featureStrategiesStore = featureStrategiesStore; this.eventStore = eventStore; + this.projectStore = projectStore; this.logger = config.getLogger('services/segment-service.ts'); this.config = config; } @@ -66,6 +74,13 @@ export class SegmentService { return this.featureStrategiesStore.getStrategiesBySegment(id); } + async getProjectSpecificSegments(projectId: string): Promise { + if (!this.projectStore.hasProject(projectId)) { + throw new NotFoundError(`Project "${projectId}" does not exist`); + } + return this.segmentStore.getProjectSpecificSegments(projectId); + } + async create( data: unknown, user: Partial>, diff --git a/src/lib/types/stores/segment-store.ts b/src/lib/types/stores/segment-store.ts index c28185140d..30b476abd3 100644 --- a/src/lib/types/stores/segment-store.ts +++ b/src/lib/types/stores/segment-store.ts @@ -9,6 +9,8 @@ export interface ISegmentStore extends Store { getByStrategy(strategyId: string): Promise; + getProjectSpecificSegments(projectId: string): Promise; + create( segment: Omit, user: Partial>, diff --git a/src/test/fixtures/fake-segment-store.ts b/src/test/fixtures/fake-segment-store.ts index 620c767ca3..2303469cf6 100644 --- a/src/test/fixtures/fake-segment-store.ts +++ b/src/test/fixtures/fake-segment-store.ts @@ -58,5 +58,10 @@ export default class FakeSegmentStore implements ISegmentStore { throw new Error('Method not implemented.'); } + /*eslint-disable @typescript-eslint/no-unused-vars*/ + getProjectSpecificSegments(projectId: string): Promise { + throw new Error('Method not implemented.'); + } + destroy(): void {} }