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);
}
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> {
return this.db(T.segments).del();
}

View File

@ -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(

View File

@ -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<ISegment[]> {
if (!this.projectStore.hasProject(projectId)) {
throw new NotFoundError(`Project "${projectId}" does not exist`);
}
return this.segmentStore.getProjectSpecificSegments(projectId);
}
async create(
data: unknown,
user: Partial<Pick<User, 'username' | 'email'>>,

View File

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

View File

@ -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<ISegment[]> {
throw new Error('Method not implemented.');
}
destroy(): void {}
}