1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-05 17:53:12 +02:00

feat: add support for project specific segments endpoint

This commit is contained in:
sighphyre 2023-03-09 15:24:43 +02:00
parent 068c55a925
commit 43df603ba6
No known key found for this signature in database
GPG Key ID: 272209E090ED6733
5 changed files with 36 additions and 4 deletions

View File

@ -135,6 +135,16 @@ export default class SegmentStore implements ISegmentStore {
return rows.map(this.mapRow); return rows.map(this.mapRow);
} }
async getProjectSpecificSegments(project: string): Promise<ISegment[]> {
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<void> { deleteAll(): Promise<void> {
return this.db(T.segments).del(); return this.db(T.segments).del();
} }

View File

@ -82,7 +82,7 @@ export const createFeatureToggleService = (
groupService, groupService,
); );
const segmentService = new SegmentService( const segmentService = new SegmentService(
{ segmentStore, featureStrategiesStore, eventStore }, { segmentStore, featureStrategiesStore, eventStore, projectStore },
config, config,
); );
const featureToggleService = new FeatureToggleService( const featureToggleService = new FeatureToggleService(
@ -131,7 +131,7 @@ export const createFakeFeatureToggleService = (
groupService, groupService,
); );
const segmentService = new SegmentService( const segmentService = new SegmentService(
{ segmentStore, featureStrategiesStore, eventStore }, { segmentStore, featureStrategiesStore, eventStore, projectStore },
config, config,
); );
const featureToggleService = new FeatureToggleService( const featureToggleService = new FeatureToggleService(

View File

@ -1,6 +1,6 @@
import { IUnleashConfig } from '../types/option'; import { IUnleashConfig } from '../types/option';
import { IEventStore } from '../types/stores/event-store'; import { IEventStore } from '../types/stores/event-store';
import { IUnleashStores } from '../types'; import { IProjectStore, IUnleashStores } from '../types';
import { Logger } from '../logger'; import { Logger } from '../logger';
import NameExistsError from '../error/name-exists-error'; import NameExistsError from '../error/name-exists-error';
import { ISegmentStore } from '../types/stores/segment-store'; import { ISegmentStore } from '../types/stores/segment-store';
@ -14,6 +14,7 @@ import {
import User from '../types/user'; import User from '../types/user';
import { IFeatureStrategiesStore } from '../types/stores/feature-strategies-store'; import { IFeatureStrategiesStore } from '../types/stores/feature-strategies-store';
import BadDataError from '../error/bad-data-error'; import BadDataError from '../error/bad-data-error';
import NotFoundError from '../error/notfound-error';
export class SegmentService { export class SegmentService {
private logger: Logger; private logger: Logger;
@ -24,22 +25,29 @@ export class SegmentService {
private eventStore: IEventStore; private eventStore: IEventStore;
private projectStore: IProjectStore;
private config: IUnleashConfig; private config: IUnleashConfig;
constructor( constructor(
{ {
segmentStore, segmentStore,
featureStrategiesStore, featureStrategiesStore,
projectStore,
eventStore, eventStore,
}: Pick< }: Pick<
IUnleashStores, IUnleashStores,
'segmentStore' | 'featureStrategiesStore' | 'eventStore' | 'segmentStore'
| 'featureStrategiesStore'
| 'eventStore'
| 'projectStore'
>, >,
config: IUnleashConfig, config: IUnleashConfig,
) { ) {
this.segmentStore = segmentStore; this.segmentStore = segmentStore;
this.featureStrategiesStore = featureStrategiesStore; this.featureStrategiesStore = featureStrategiesStore;
this.eventStore = eventStore; this.eventStore = eventStore;
this.projectStore = projectStore;
this.logger = config.getLogger('services/segment-service.ts'); this.logger = config.getLogger('services/segment-service.ts');
this.config = config; this.config = config;
} }
@ -66,6 +74,13 @@ export class SegmentService {
return this.featureStrategiesStore.getStrategiesBySegment(id); return this.featureStrategiesStore.getStrategiesBySegment(id);
} }
async getProjectSpecificSegments(projectId: string): Promise<ISegment[]> {
if (!this.projectStore.hasProject(projectId)) {
throw new NotFoundError(`Project "${projectId}" does not exist`);
}
return this.segmentStore.getProjectSpecificSegments(projectId);
}
async create( async create(
data: unknown, data: unknown,
user: Partial<Pick<User, 'username' | 'email'>>, user: Partial<Pick<User, 'username' | 'email'>>,

View File

@ -9,6 +9,8 @@ export interface ISegmentStore extends Store<ISegment, number> {
getByStrategy(strategyId: string): Promise<ISegment[]>; getByStrategy(strategyId: string): Promise<ISegment[]>;
getProjectSpecificSegments(projectId: string): Promise<ISegment[]>;
create( create(
segment: Omit<ISegment, 'id'>, segment: Omit<ISegment, 'id'>,
user: Partial<Pick<User, 'username' | 'email'>>, user: Partial<Pick<User, 'username' | 'email'>>,

View File

@ -58,5 +58,10 @@ export default class FakeSegmentStore implements ISegmentStore {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
} }
/*eslint-disable @typescript-eslint/no-unused-vars*/
getProjectSpecificSegments(projectId: string): Promise<ISegment[]> {
throw new Error('Method not implemented.');
}
destroy(): void {} destroy(): void {}
} }