1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-18 13:48:58 +02:00

feat: add hasStrategies and hasEnabledStrategies on feature environments

This commit is contained in:
Tymoteusz Czech 2023-10-12 13:53:10 +02:00
parent 7b7a2a706c
commit 16575c4f4b
No known key found for this signature in database
GPG Key ID: 133555230D88D75F
5 changed files with 42 additions and 2 deletions

View File

@ -374,6 +374,10 @@ export const ProjectFeatureToggles = ({
enabled: thisEnv?.enabled || false, enabled: thisEnv?.enabled || false,
variantCount: thisEnv?.variantCount || 0, variantCount: thisEnv?.variantCount || 0,
lastSeenAt: thisEnv?.lastSeenAt, lastSeenAt: thisEnv?.lastSeenAt,
type: thisEnv?.type,
hasStrategies: thisEnv?.hasStrategies,
hasEnabledStrategies:
thisEnv?.hasEnabledStrategies,
}, },
]; ];
}), }),

View File

@ -17,6 +17,9 @@ export interface IEnvironments {
enabled: boolean; enabled: boolean;
variantCount: number; variantCount: number;
lastSeenAt?: string | null; lastSeenAt?: string | null;
type?: string;
hasStrategies?: boolean;
hasEnabledStrategies?: boolean;
} }
export interface IFeatureToggle { export interface IFeatureToggle {

View File

@ -479,6 +479,8 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
sortOrder: r.environment_sort_order, sortOrder: r.environment_sort_order,
variantCount: r.variants?.length || 0, variantCount: r.variants?.length || 0,
lastSeenAt: r.env_last_seen_at, lastSeenAt: r.env_last_seen_at,
hasStrategies: r.has_strategies,
hasEnabledStrategies: r.has_enabled_strategies,
}; };
} }
@ -546,7 +548,18 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
'feature_environments.environment', 'feature_environments.environment',
'environments.name', 'environments.name',
) )
.leftJoin('feature_tag as ft', 'ft.feature_name', 'features.name'); .leftJoin('feature_tag as ft', 'ft.feature_name', 'features.name')
.leftJoin('feature_strategies', function () {
this.on(
'feature_strategies.feature_name',
'=',
'features.name',
).andOn(
'feature_strategies.environment',
'=',
'feature_environments.environment',
);
});
if (this.flagResolver.isEnabled('useLastSeenRefactor')) { if (this.flagResolver.isEnabled('useLastSeenRefactor')) {
query.leftJoin( query.leftJoin(
@ -599,12 +612,21 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
]; ];
} }
selectColumns = [
...selectColumns,
this.db.raw(
'EXISTS (SELECT 1 FROM feature_strategies WHERE feature_strategies.feature_name = features.name AND feature_strategies.environment = feature_environments.environment) as has_strategies',
),
this.db.raw(
'EXISTS (SELECT 1 FROM feature_strategies WHERE feature_strategies.feature_name = features.name AND feature_strategies.environment = feature_environments.environment AND (feature_strategies.disabled IS NULL OR feature_strategies.disabled = false)) as has_enabled_strategies',
),
];
query = query.select(selectColumns); query = query.select(selectColumns);
const rows = await query; const rows = await query;
if (rows.length > 0) { if (rows.length > 0) {
const overview = this.getFeatureOverviewData(getUniqueRows(rows)); const overview = this.getFeatureOverviewData(getUniqueRows(rows));
return sortEnvironments(overview); return sortEnvironments(overview);
} }
return []; return [];

View File

@ -71,6 +71,15 @@ export const featureEnvironmentSchema = {
description: description:
'The date when metrics where last collected for the feature environment', 'The date when metrics where last collected for the feature environment',
}, },
hasStrategies: {
type: 'boolean',
description: 'Whether the feature has any strategies defined.',
},
hasEnabledStrategies: {
type: 'boolean',
description:
'Whether the feature has any enabled strategies defined.',
},
}, },
components: { components: {
schemas: { schemas: {

View File

@ -194,6 +194,8 @@ export interface IEnvironmentBase {
export interface IEnvironmentOverview extends IEnvironmentBase { export interface IEnvironmentOverview extends IEnvironmentBase {
variantCount: number; variantCount: number;
hasStrategies: boolean;
hasEnabledStrategies: boolean;
} }
export interface IFeatureOverview { export interface IFeatureOverview {