From 598d022a5afbc9fcf2f79a1c1a9f68269a85d4d6 Mon Sep 17 00:00:00 2001 From: Jaanus Sellin Date: Wed, 1 Nov 2023 11:01:23 +0200 Subject: [PATCH] fix: do not allow segment deletion when used in private projects (#5236) --- src/lib/features/segment/segment-controller.ts | 8 +++++--- src/lib/segments/segment-service-interface.ts | 12 +++++++++++- src/lib/services/segment-service.ts | 13 ++++++++----- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/lib/features/segment/segment-controller.ts b/src/lib/features/segment/segment-controller.ts index ef9d2599955b..345ef6643948 100644 --- a/src/lib/features/segment/segment-controller.ts +++ b/src/lib/features/segment/segment-controller.ts @@ -348,7 +348,10 @@ export class SegmentsController extends Controller { ): Promise { const { id } = req.params; const { user } = req; - const strategies = await this.segmentService.getStrategies(id, user.id); + const strategies = await this.segmentService.getVisibleStrategies( + id, + user.id, + ); // Remove unnecessary IFeatureStrategy fields from the response. const segmentStrategies = strategies.map((strategy) => ({ @@ -369,8 +372,7 @@ export class SegmentsController extends Controller { res: Response, ): Promise { const id = Number(req.params.id); - const { user } = req; - const strategies = await this.segmentService.getStrategies(id, user.id); + const strategies = await this.segmentService.getAllStrategies(id); if (strategies.length > 0) { res.status(409).send(); diff --git a/src/lib/segments/segment-service-interface.ts b/src/lib/segments/segment-service-interface.ts index 3d469d0bd0ca..a64fd865b194 100644 --- a/src/lib/segments/segment-service-interface.ts +++ b/src/lib/segments/segment-service-interface.ts @@ -13,7 +13,17 @@ export interface ISegmentService { get(id: number): Promise; - getStrategies(id: number, userId: number): Promise; + /** + * Gets all strategies for a segment + * This is NOT considering the private projects + * For most use cases, use `getVisibleStrategies` + */ + getAllStrategies(id: number): Promise; + + getVisibleStrategies( + id: number, + userId: number, + ): Promise; validateName(name: string): Promise; diff --git a/src/lib/services/segment-service.ts b/src/lib/services/segment-service.ts index a5fd7a52d575..b5105a75201e 100644 --- a/src/lib/services/segment-service.ts +++ b/src/lib/services/segment-service.ts @@ -77,18 +77,15 @@ export class SegmentService implements ISegmentService { return this.segmentStore.getActiveForClient(); } - // Used by unleash-enterprise. async getByStrategy(strategyId: string): Promise { return this.segmentStore.getByStrategy(strategyId); } - // Used by unleash-enterprise. - async getStrategies( + async getVisibleStrategies( id: number, userId: number, ): Promise { - const strategies = - await this.featureStrategiesStore.getStrategiesBySegment(id); + const strategies = await this.getAllStrategies(id); if (this.flagResolver.isEnabled('privateProjects')) { const accessibleProjects = await this.privateProjectChecker.getUserAccessibleProjects( @@ -105,6 +102,12 @@ export class SegmentService implements ISegmentService { return strategies; } + async getAllStrategies(id: number): Promise { + const strategies = + await this.featureStrategiesStore.getStrategiesBySegment(id); + return strategies; + } + async create( data: unknown, user: Partial>,