Skip to content

Commit 303918d

Browse files
committed
Add ids to UI and search for segments, flags, and experiments
1 parent 1fa577a commit 303918d

File tree

14 files changed

+53
-5
lines changed

14 files changed

+53
-5
lines changed

backend/packages/Upgrade/src/api/controllers/validators/FeatureFlagsPaginatedParamsValidator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export enum FLAG_SEARCH_KEY {
2626
STATUS = 'status',
2727
TAG = 'tag',
2828
CONTEXT = 'context',
29+
ID = 'id',
2930
}
3031

3132
class IFeatureFlagSortParamsValidator {

backend/packages/Upgrade/src/api/controllers/validators/SegmentPaginatedParamsValidator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export enum SEGMENT_SEARCH_KEY {
2222
NAME = 'name',
2323
TAG = 'tag',
2424
CONTEXT = 'context',
25+
ID = 'id',
2526
}
2627

2728
class ISegmentSortParamsValidator {

backend/packages/Upgrade/src/api/services/ExperimentService.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ import { CacheService } from './CacheService';
8282
import { QueryService } from './QueryService';
8383
import { ArchivedStats } from '../models/ArchivedStats';
8484
import { ArchivedStatsRepository } from '../repositories/ArchivedStatsRepository';
85-
import { validate } from 'class-validator';
85+
import { isUUID, validate } from 'class-validator';
8686
import { plainToClass } from 'class-transformer';
8787
import { StratificationFactorRepository } from '../repositories/StratificationFactorRepository';
8888
import { ExperimentDetailsForCSVData } from '../repositories/AnalyticsRepository';
@@ -1798,6 +1798,10 @@ export class ExperimentService {
17981798
const type = params.key;
17991799
// escape % and ' characters
18001800
const serachString = params.string.replace(/%/g, '\\$&').replace(/'/g, "''");
1801+
if (type === EXPERIMENT_SEARCH_KEY.ID && !isUUID(serachString)) {
1802+
return '';
1803+
}
1804+
18011805
const likeString = `ILIKE '%${serachString}%'`;
18021806
const searchString: string[] = [];
18031807
switch (type) {
@@ -1813,13 +1817,19 @@ export class ExperimentService {
18131817
case EXPERIMENT_SEARCH_KEY.TAG:
18141818
searchString.push(`ARRAY_TO_STRING(tags, ',') ${likeString}`);
18151819
break;
1820+
case EXPERIMENT_SEARCH_KEY.ID:
1821+
searchString.push(`experiment.id = '${serachString}'`);
1822+
break;
18161823
default:
18171824
searchString.push(`name ${likeString}`);
18181825
searchString.push(`state::TEXT ${likeString}`);
18191826
searchString.push(`ARRAY_TO_STRING(context, ',') ${likeString}`);
18201827
searchString.push(`ARRAY_TO_STRING(tags, ',') ${likeString}`);
18211828
searchString.push(`partitions.site ${likeString}`);
18221829
searchString.push(`partitions.target ${likeString}`);
1830+
if (isUUID(serachString)) {
1831+
searchString.push(`experiment.id = '${serachString}'`);
1832+
}
18231833
break;
18241834
}
18251835

backend/packages/Upgrade/src/api/services/FeatureFlagService.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import { ExperimentAssignmentService } from './ExperimentAssignmentService';
4343
import { SegmentService } from './SegmentService';
4444
import { ErrorWithType } from '../errors/ErrorWithType';
4545
import { RequestedExperimentUser } from '../controllers/validators/ExperimentUserValidator';
46-
import { validate } from 'class-validator';
46+
import { isUUID, validate } from 'class-validator';
4747
import { plainToClass } from 'class-transformer';
4848
import {
4949
FeatureFlagImportDataValidation,
@@ -805,6 +805,9 @@ export class FeatureFlagService {
805805
const type = params.key;
806806
// escape % and ' characters
807807
const serachString = params.string.replace(/%/g, '\\$&').replace(/'/g, "''");
808+
if (type === FLAG_SEARCH_KEY.ID && !isUUID(serachString)) {
809+
return '';
810+
}
808811
const likeString = `ILIKE '%${serachString}%'`;
809812
const searchString: string[] = [];
810813
switch (type) {
@@ -820,11 +823,17 @@ export class FeatureFlagService {
820823
case FLAG_SEARCH_KEY.TAG:
821824
searchString.push(`ARRAY_TO_STRING(tags, ',') ${likeString}`);
822825
break;
826+
case FLAG_SEARCH_KEY.ID:
827+
searchString.push(`feature_flag.id = '${serachString}'`);
828+
break;
823829
default:
824830
searchString.push(`name ${likeString}`);
825831
searchString.push(`status::TEXT ${likeString}`);
826832
searchString.push(`ARRAY_TO_STRING(context, ',') ${likeString}`);
827833
searchString.push(`ARRAY_TO_STRING(tags, ',') ${likeString}`);
834+
if (isUUID(serachString)) {
835+
searchString.push(`feature_flag.id = '${serachString}'`);
836+
}
828837
break;
829838
}
830839

backend/packages/Upgrade/src/api/services/SegmentService.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import { FeatureFlagSegmentExclusionRepository } from '../repositories/FeatureFl
3838
import { FeatureFlagSegmentInclusionRepository } from '../repositories/FeatureFlagSegmentInclusionRepository';
3939
import { getSegmentData, getSegmentsData } from '../controllers/SegmentController';
4040
import { CacheService } from './CacheService';
41-
import { validate } from 'class-validator';
41+
import { isUUID, validate } from 'class-validator';
4242
import { plainToClass } from 'class-transformer';
4343
import path from 'path';
4444
import { GroupEnrollmentRepository } from '../repositories/GroupEnrollmentRepository';
@@ -222,7 +222,9 @@ export class SegmentService {
222222

223223
if (searchParams) {
224224
const whereClause = this.paginatedSearchString(searchParams);
225-
paginatedParentSubQuery = paginatedParentSubQuery.andWhere(whereClause);
225+
if (whereClause) {
226+
paginatedParentSubQuery = paginatedParentSubQuery.andWhere(whereClause);
227+
}
226228
}
227229
const countQuery = paginatedParentSubQuery.clone().andWhere('segment.type=:type', { type: SEGMENT_TYPE.PUBLIC });
228230
paginatedParentSubQuery = paginatedParentSubQuery.andWhere('segment.type = :type').offset(skip).limit(take);
@@ -246,6 +248,9 @@ export class SegmentService {
246248
const type = params.key;
247249
// escape % and ' characters
248250
const serachString = params.string.replace(/%/g, '\\$&').replace(/'/g, "''");
251+
if (type === SEGMENT_SEARCH_KEY.ID && !isUUID(serachString)) {
252+
return null;
253+
}
249254
const likeString = `ILIKE '%${serachString}%'`;
250255
const searchString: string[] = [];
251256
switch (type) {
@@ -255,10 +260,16 @@ export class SegmentService {
255260
case SEGMENT_SEARCH_KEY.TAG:
256261
searchString.push(`ARRAY_TO_STRING(tags, ',') ${likeString}`);
257262
break;
263+
case SEGMENT_SEARCH_KEY.ID:
264+
searchString.push(`segment.id = '${serachString}'`);
265+
break;
258266
default:
259267
searchString.push(`${SEGMENT_SEARCH_KEY.NAME} ${likeString}`);
260268
searchString.push(`${SEGMENT_SEARCH_KEY.CONTEXT} ${likeString}`);
261269
searchString.push(`ARRAY_TO_STRING(tags, ',') ${likeString}`);
270+
if (isUUID(serachString)) {
271+
searchString.push(`segment.id = '${serachString}'`);
272+
}
262273
break;
263274
}
264275

frontend/projects/upgrade/src/app/features/dashboard/feature-flags/pages/feature-flag-details-page/feature-flag-details-page-content/feature-flag-overview-details-section-card/feature-flag-overview-details-section-card.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
[versionNumber]="flag.versionNumber"
99
[chipClass]="flag.status"
1010
[showWarning]="shouldShowWarning$ | async"
11+
[id]="flag.id"
1112
></app-common-section-card-title-header>
1213

1314
<!-- header-right -->

frontend/projects/upgrade/src/app/features/dashboard/feature-flags/pages/feature-flag-root-page/feature-flag-root-page-content/feature-flag-root-section-card/feature-flag-root-section-card.component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export class FeatureFlagRootSectionCardComponent {
5959
featureFlagFilterOption = [
6060
FLAG_SEARCH_KEY.ALL,
6161
FLAG_SEARCH_KEY.NAME,
62+
FLAG_SEARCH_KEY.ID,
6263
FLAG_SEARCH_KEY.STATUS,
6364
FLAG_SEARCH_KEY.CONTEXT,
6465
FLAG_SEARCH_KEY.TAG,

frontend/projects/upgrade/src/app/features/dashboard/home/components/experiment-list/experiment-list.component.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export class ExperimentListComponent implements OnInit, OnDestroy, AfterViewInit
3333
experimentFilterOptions = [
3434
EXPERIMENT_SEARCH_KEY.ALL,
3535
EXPERIMENT_SEARCH_KEY.NAME,
36+
EXPERIMENT_SEARCH_KEY.ID,
3637
EXPERIMENT_SEARCH_KEY.STATUS,
3738
EXPERIMENT_SEARCH_KEY.TAG,
3839
EXPERIMENT_SEARCH_KEY.CONTEXT,
@@ -126,14 +127,17 @@ export class ExperimentListComponent implements OnInit, OnDestroy, AfterViewInit
126127
data.state.toLocaleLowerCase().includes(filter) ||
127128
!!data.tags.filter((tags) => tags.toLocaleLowerCase().includes(filter)).length ||
128129
this.isPartitionFound(data, filter) ||
129-
!!data.context.filter((context) => context.toLocaleLowerCase().includes(filter)).length
130+
!!data.context.filter((context) => context.toLocaleLowerCase().includes(filter)).length ||
131+
data.id.includes(filter)
130132
);
131133
case EXPERIMENT_SEARCH_KEY.NAME:
132134
return data.name.toLocaleLowerCase().includes(filter);
133135
case EXPERIMENT_SEARCH_KEY.TAG:
134136
return !!data.tags.filter((tags) => tags.toLocaleLowerCase().includes(filter)).length;
135137
case EXPERIMENT_SEARCH_KEY.CONTEXT:
136138
return !!data.context.filter((context) => context.toLocaleLowerCase().includes(filter)).length;
139+
case EXPERIMENT_SEARCH_KEY.ID:
140+
return data.id.includes(filter);
137141
}
138142
};
139143
}

frontend/projects/upgrade/src/app/features/dashboard/home/pages/view-experiment/view-experiment.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
('home.view-experiment.updated-at.text' | translate) + (experiment.updatedAt | date : 'MMM d, y, h:mm a')
6767
}}
6868
</span>
69+
<span class="ft-14-700">ID: {{ experiment.id }}</span>
6970
</span>
7071

7172
<!-- <div class="action-buttons">

frontend/projects/upgrade/src/app/features/dashboard/segments/pages/segment-details-page/segment-details-page-content/segment-overview-details-section-card/segment-overview-details-section-card.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
[updatedAt]="segment.updatedAt"
88
[versionNumber]="segment.versionNumber"
99
[chipClass]="segment.status.toLowerCase()"
10+
[id]="segment.id"
1011
></app-common-section-card-title-header>
1112
<!-- TODO: Update the SEGMENT_STATUS enum to lowercase and remove toLowerCase() once the legacy Segments code is removed -->
1213

0 commit comments

Comments
 (0)