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:
parent
068c55a925
commit
43df603ba6
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
@ -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'>>,
|
||||||
|
@ -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'>>,
|
||||||
|
5
src/test/fixtures/fake-segment-store.ts
vendored
5
src/test/fixtures/fake-segment-store.ts
vendored
@ -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 {}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user