unleash-server 4.2.0-beta.8 → 4.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/addons/addon.d.ts +2 -1
- package/dist/lib/addons/addon.js.map +1 -1
- package/dist/lib/addons/datadog.d.ts +4 -17
- package/dist/lib/addons/datadog.js +3 -109
- package/dist/lib/addons/datadog.js.map +1 -1
- package/dist/lib/addons/datadog.test.js +3 -0
- package/dist/lib/addons/datadog.test.js.map +1 -1
- package/dist/lib/addons/feature-event-formatter-md.d.ts +25 -0
- package/dist/lib/addons/feature-event-formatter-md.js +116 -0
- package/dist/lib/addons/feature-event-formatter-md.js.map +1 -0
- package/dist/lib/addons/index.d.ts +1 -0
- package/dist/lib/addons/index.js.map +1 -1
- package/dist/lib/addons/slack.d.ts +3 -12
- package/dist/lib/addons/slack.js +5 -110
- package/dist/lib/addons/slack.js.map +1 -1
- package/dist/lib/addons/slack.test.js +8 -0
- package/dist/lib/addons/slack.test.js.map +1 -1
- package/dist/lib/addons/teams.d.ts +4 -17
- package/dist/lib/addons/teams.js +7 -109
- package/dist/lib/addons/teams.js.map +1 -1
- package/dist/lib/addons/teams.test.js +3 -0
- package/dist/lib/addons/teams.test.js.map +1 -1
- package/dist/lib/addons/webhook.d.ts +8 -2
- package/dist/lib/addons/webhook.js +0 -1
- package/dist/lib/addons/webhook.js.map +1 -1
- package/dist/lib/addons/webhook.test.js +2 -0
- package/dist/lib/addons/webhook.test.js.map +1 -1
- package/dist/lib/create-config.js +6 -5
- package/dist/lib/create-config.js.map +1 -1
- package/dist/lib/db/client-instance-store.js +2 -2
- package/dist/lib/db/client-instance-store.js.map +1 -1
- package/dist/lib/db/client-metrics-db.js +2 -2
- package/dist/lib/db/client-metrics-db.js.map +1 -1
- package/dist/lib/db/client-metrics-store-v2.js +5 -1
- package/dist/lib/db/client-metrics-store-v2.js.map +1 -1
- package/dist/lib/db/client-metrics-store.js +2 -2
- package/dist/lib/db/client-metrics-store.js.map +1 -1
- package/dist/lib/db/event-store.d.ts +10 -6
- package/dist/lib/db/event-store.js +21 -1
- package/dist/lib/db/event-store.js.map +1 -1
- package/dist/lib/db/session-store.js +2 -1
- package/dist/lib/db/session-store.js.map +1 -1
- package/dist/lib/error/minimum-one-environment-error.d.ts +5 -0
- package/dist/lib/error/minimum-one-environment-error.js +24 -0
- package/dist/lib/error/minimum-one-environment-error.js.map +1 -0
- package/dist/lib/metrics.js +20 -12
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/metrics.test.js +1 -0
- package/dist/lib/metrics.test.js.map +1 -1
- package/dist/lib/middleware/rbac-middleware.js +2 -17
- package/dist/lib/middleware/rbac-middleware.js.map +1 -1
- package/dist/lib/middleware/rbac-middleware.test.js +2 -21
- package/dist/lib/middleware/rbac-middleware.test.js.map +1 -1
- package/dist/lib/middleware/secure-headers.js +2 -1
- package/dist/lib/middleware/secure-headers.js.map +1 -1
- package/dist/lib/middleware/session-db.js +2 -3
- package/dist/lib/middleware/session-db.js.map +1 -1
- package/dist/lib/routes/admin-api/config.d.ts +5 -2
- package/dist/lib/routes/admin-api/config.js +9 -11
- package/dist/lib/routes/admin-api/config.js.map +1 -1
- package/dist/lib/routes/admin-api/event.d.ts +8 -4
- package/dist/lib/routes/admin-api/event.js +8 -10
- package/dist/lib/routes/admin-api/event.js.map +1 -1
- package/dist/lib/routes/admin-api/feature.d.ts +2 -3
- package/dist/lib/routes/admin-api/feature.js +37 -34
- package/dist/lib/routes/admin-api/feature.js.map +1 -1
- package/dist/lib/routes/admin-api/project/features.js +11 -8
- package/dist/lib/routes/admin-api/project/features.js.map +1 -1
- package/dist/lib/routes/admin-api/state.js +2 -3
- package/dist/lib/routes/admin-api/state.js.map +1 -1
- package/dist/lib/routes/admin-api/strategy.test.js +25 -38
- package/dist/lib/routes/admin-api/strategy.test.js.map +1 -1
- package/dist/lib/routes/admin-api/user-admin.d.ts +1 -0
- package/dist/lib/routes/admin-api/user-admin.js +6 -0
- package/dist/lib/routes/admin-api/user-admin.js.map +1 -1
- package/dist/lib/routes/client-api/feature.test.js +3 -2
- package/dist/lib/routes/client-api/feature.test.js.map +1 -1
- package/dist/lib/routes/health-check.test.js +1 -0
- package/dist/lib/routes/health-check.test.js.map +1 -1
- package/dist/lib/routes/util.js +2 -0
- package/dist/lib/routes/util.js.map +1 -1
- package/dist/lib/server-impl.d.ts +2 -1
- package/dist/lib/server-impl.js.map +1 -1
- package/dist/lib/services/addon-service-test-simple-addon.d.ts +1 -1
- package/dist/lib/services/addon-service-test-simple-addon.js.map +1 -1
- package/dist/lib/services/addon-service.js +2 -2
- package/dist/lib/services/addon-service.js.map +1 -1
- package/dist/lib/services/api-token-service.js +2 -2
- package/dist/lib/services/api-token-service.js.map +1 -1
- package/dist/lib/services/client-metrics/client-metrics-service-v2.js +3 -5
- package/dist/lib/services/client-metrics/client-metrics-service-v2.js.map +1 -1
- package/dist/lib/services/client-metrics/client-metrics.test.js +74 -41
- package/dist/lib/services/client-metrics/client-metrics.test.js.map +1 -1
- package/dist/lib/services/client-metrics/index.d.ts +6 -5
- package/dist/lib/services/client-metrics/index.js +13 -10
- package/dist/lib/services/client-metrics/index.js.map +1 -1
- package/dist/lib/services/client-metrics/list.d.ts +19 -16
- package/dist/lib/services/client-metrics/list.js +6 -4
- package/dist/lib/services/client-metrics/list.js.map +1 -1
- package/dist/lib/services/client-metrics/list.test.js +9 -5
- package/dist/lib/services/client-metrics/list.test.js.map +1 -1
- package/dist/lib/services/client-metrics/ttl-list.d.ts +20 -13
- package/dist/lib/services/client-metrics/ttl-list.js +26 -15
- package/dist/lib/services/client-metrics/ttl-list.js.map +1 -1
- package/dist/lib/services/client-metrics/ttl-list.test.js +33 -9
- package/dist/lib/services/client-metrics/ttl-list.test.js.map +1 -1
- package/dist/lib/services/environment-service.d.ts +2 -1
- package/dist/lib/services/environment-service.js +10 -3
- package/dist/lib/services/environment-service.js.map +1 -1
- package/dist/lib/services/event-service.d.ts +1 -1
- package/dist/lib/services/event-service.js +1 -1
- package/dist/lib/services/event-service.js.map +1 -1
- package/dist/lib/services/feature-tag-service.js +7 -11
- package/dist/lib/services/feature-tag-service.js.map +1 -1
- package/dist/lib/services/{feature-toggle-service-v2.d.ts → feature-toggle-service.d.ts} +29 -19
- package/dist/lib/services/{feature-toggle-service-v2.js → feature-toggle-service.js} +177 -145
- package/dist/lib/services/feature-toggle-service.js.map +1 -0
- package/dist/lib/services/index.js +5 -3
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/project-health-service.d.ts +2 -2
- package/dist/lib/services/project-health-service.js +3 -3
- package/dist/lib/services/project-health-service.js.map +1 -1
- package/dist/lib/services/project-service.d.ts +2 -2
- package/dist/lib/services/project-service.js +5 -3
- package/dist/lib/services/project-service.js.map +1 -1
- package/dist/lib/services/reset-token-service.js +2 -2
- package/dist/lib/services/reset-token-service.js.map +1 -1
- package/dist/lib/services/setting-service.d.ts +1 -1
- package/dist/lib/services/setting-service.js.map +1 -1
- package/dist/lib/services/state-util.js +1 -1
- package/dist/lib/services/state-util.js.map +1 -1
- package/dist/lib/services/user-service.d.ts +6 -2
- package/dist/lib/services/user-service.js +43 -21
- package/dist/lib/services/user-service.js.map +1 -1
- package/dist/lib/services/user-service.test.js +18 -0
- package/dist/lib/services/user-service.test.js.map +1 -1
- package/dist/lib/services/version-service.js +2 -2
- package/dist/lib/services/version-service.js.map +1 -1
- package/dist/lib/types/authentication-required.d.ts +3 -1
- package/dist/lib/types/authentication-required.js +2 -1
- package/dist/lib/types/authentication-required.js.map +1 -1
- package/dist/lib/types/events.d.ts +165 -2
- package/dist/lib/types/events.js +124 -4
- package/dist/lib/types/events.js.map +1 -1
- package/dist/lib/types/model.d.ts +0 -12
- package/dist/lib/types/model.js.map +1 -1
- package/dist/lib/types/services.d.ts +3 -2
- package/dist/lib/types/settings/simple-auth-settings.d.ts +4 -0
- package/dist/lib/types/settings/simple-auth-settings.js +5 -0
- package/dist/lib/types/settings/simple-auth-settings.js.map +1 -0
- package/dist/lib/types/stores/event-store.d.ts +4 -3
- package/dist/lib/types/stores/settings-store.d.ts +1 -1
- package/dist/lib/util/constants.d.ts +0 -2
- package/dist/lib/util/constants.js +1 -3
- package/dist/lib/util/constants.js.map +1 -1
- package/dist/migrations/20210928080601-add-development-and-production-environments.js +3 -3
- package/dist/migrations/20211029094324-set-sort-order-env.d.ts +2 -0
- package/dist/migrations/20211029094324-set-sort-order-env.js +11 -0
- package/dist/migrations/20211029094324-set-sort-order-env.js.map +1 -0
- package/dist/migrations/20211105104316-add-feature-name-column-to-events.d.ts +2 -0
- package/dist/migrations/20211105104316-add-feature-name-column-to-events.js +16 -0
- package/dist/migrations/20211105104316-add-feature-name-column-to-events.js.map +1 -0
- package/dist/migrations/20211105105509-add-predata-column-to-events.d.ts +2 -0
- package/dist/migrations/20211105105509-add-predata-column-to-events.js +8 -0
- package/dist/migrations/20211105105509-add-predata-column-to-events.js.map +1 -0
- package/dist/migrator.js +9 -2
- package/dist/migrator.js.map +1 -1
- package/dist/test/e2e/api/admin/client-metrics.e2e.test.js +16 -12
- package/dist/test/e2e/api/admin/client-metrics.e2e.test.js.map +1 -1
- package/dist/{lib/event-differ.test.d.ts → test/e2e/api/admin/config.e2e.test.d.ts} +0 -0
- package/dist/test/e2e/api/admin/config.e2e.test.js +36 -0
- package/dist/test/e2e/api/admin/config.e2e.test.js.map +1 -0
- package/dist/test/e2e/api/admin/feature-archive.e2e.test.js +1 -2
- package/dist/test/e2e/api/admin/feature-archive.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/feature.e2e.test.js +19 -2
- package/dist/test/e2e/api/admin/feature.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/metrics.e2e.test.js +5 -3
- package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/environments.e2e.test.js +10 -0
- package/dist/test/e2e/api/admin/project/environments.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/features.e2e.test.js +120 -8
- package/dist/test/e2e/api/admin/project/features.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/state.e2e.test.js +17 -13
- package/dist/test/e2e/api/admin/state.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/user-admin.e2e.test.js +18 -17
- package/dist/test/e2e/api/admin/user-admin.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js +4 -0
- package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js +8 -4
- package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js +4 -4
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/register.e2e.test.js +1 -1
- package/dist/test/e2e/api/client/register.e2e.test.js.map +1 -1
- package/dist/test/e2e/custom-auth.test.js +1 -1
- package/dist/test/e2e/custom-auth.test.js.map +1 -1
- package/dist/test/e2e/services/addon-service.e2e.test.js +1 -1
- package/dist/test/e2e/services/addon-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/api-token-service.e2e.test.js +5 -3
- package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/client-metrics-service.e2e.test.js +5 -2
- package/dist/test/e2e/services/client-metrics-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/environment-service.test.js +1 -1
- package/dist/test/e2e/services/environment-service.test.js.map +1 -1
- package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js +14 -11
- package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/project-health-service.e2e.test.js +2 -2
- package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/project-service.e2e.test.js +2 -2
- package/dist/test/e2e/services/project-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/reset-token-service.e2e.test.js +4 -0
- package/dist/test/e2e/services/reset-token-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/session-service.e2e.test.js +5 -4
- package/dist/test/e2e/services/session-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/user-service.e2e.test.js +18 -2
- package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.js +4 -6
- package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/event-store.e2e.test.js +1 -1
- package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/feature-toggle-store.e2e.test.js +1 -0
- package/dist/test/e2e/stores/feature-toggle-store.e2e.test.js.map +1 -1
- package/dist/test/fixtures/fake-event-store.d.ts +2 -1
- package/dist/test/fixtures/fake-event-store.js +3 -0
- package/dist/test/fixtures/fake-event-store.js.map +1 -1
- package/dist/test/fixtures/fake-setting-store.js +1 -5
- package/dist/test/fixtures/fake-setting-store.js.map +1 -1
- package/docs/api/oas/openapi.yaml +35 -55
- package/package.json +11 -12
- package/dist/lib/event-differ.d.ts +0 -1
- package/dist/lib/event-differ.js +0 -117
- package/dist/lib/event-differ.js.map +0 -1
- package/dist/lib/event-differ.test.js +0 -142
- package/dist/lib/event-differ.test.js.map +0 -1
- package/dist/lib/services/feature-toggle-service-v2.js.map +0 -1
|
@@ -12,32 +12,58 @@ const events_1 = require("../types/events");
|
|
|
12
12
|
const notfound_error_1 = __importDefault(require("../error/notfound-error"));
|
|
13
13
|
const constants_1 = require("../util/constants");
|
|
14
14
|
const fast_json_patch_1 = require("fast-json-patch");
|
|
15
|
-
class
|
|
15
|
+
class FeatureToggleService {
|
|
16
16
|
constructor({ featureStrategiesStore, featureToggleStore, featureToggleClientStore, projectStore, eventStore, featureTagStore, featureEnvironmentStore, }, { getLogger }) {
|
|
17
17
|
this.logger = getLogger('services/feature-toggle-service-v2.ts');
|
|
18
18
|
this.featureStrategiesStore = featureStrategiesStore;
|
|
19
19
|
this.featureToggleStore = featureToggleStore;
|
|
20
20
|
this.featureToggleClientStore = featureToggleClientStore;
|
|
21
|
-
this.
|
|
21
|
+
this.tagStore = featureTagStore;
|
|
22
22
|
this.projectStore = projectStore;
|
|
23
23
|
this.eventStore = eventStore;
|
|
24
24
|
this.featureEnvironmentStore = featureEnvironmentStore;
|
|
25
25
|
}
|
|
26
|
-
async
|
|
26
|
+
async validateFeatureContext({ featureName, projectId, }) {
|
|
27
|
+
const id = await this.featureToggleStore.getProjectId(featureName);
|
|
28
|
+
if (id !== projectId) {
|
|
29
|
+
throw new invalid_operation_error_1.default('You can not change the projectId for an activation strategy.');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
validateFeatureStrategyContext(strategy, { featureName, projectId }) {
|
|
33
|
+
if (strategy.projectId !== projectId) {
|
|
34
|
+
throw new invalid_operation_error_1.default('You can not change the projectId for an activation strategy.');
|
|
35
|
+
}
|
|
36
|
+
if (strategy.featureName !== featureName) {
|
|
37
|
+
throw new invalid_operation_error_1.default('You can not change the featureName for an activation strategy.');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async patchFeature(project, featureName, createdBy, operations) {
|
|
27
41
|
const featureToggle = await this.getFeatureMetadata(featureName);
|
|
28
42
|
const { newDocument } = (0, fast_json_patch_1.applyPatch)((0, fast_json_patch_1.deepClone)(featureToggle), operations);
|
|
29
|
-
const updated = await this.updateFeatureToggle(
|
|
43
|
+
const updated = await this.updateFeatureToggle(project, newDocument, createdBy);
|
|
30
44
|
if (featureToggle.stale !== newDocument.stale) {
|
|
31
|
-
await this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
project
|
|
35
|
-
|
|
36
|
-
|
|
45
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
46
|
+
await this.eventStore.store(new events_1.FeatureStaleEvent({
|
|
47
|
+
stale: newDocument.stale,
|
|
48
|
+
project,
|
|
49
|
+
featureName,
|
|
50
|
+
createdBy,
|
|
51
|
+
tags,
|
|
52
|
+
}));
|
|
37
53
|
}
|
|
38
54
|
return updated;
|
|
39
55
|
}
|
|
40
|
-
|
|
56
|
+
featureStrategyToPublic(featureStrategy) {
|
|
57
|
+
return {
|
|
58
|
+
id: featureStrategy.id,
|
|
59
|
+
name: featureStrategy.strategyName,
|
|
60
|
+
constraints: featureStrategy.constraints || [],
|
|
61
|
+
parameters: featureStrategy.parameters,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async createStrategy(strategyConfig, context, createdBy) {
|
|
65
|
+
const { featureName, projectId, environment } = context;
|
|
66
|
+
await this.validateFeatureContext(context);
|
|
41
67
|
try {
|
|
42
68
|
const newFeatureStrategy = await this.featureStrategiesStore.createStrategyFeatureEnv({
|
|
43
69
|
strategyName: strategyConfig.name,
|
|
@@ -48,24 +74,17 @@ class FeatureToggleServiceV2 {
|
|
|
48
74
|
featureName,
|
|
49
75
|
environment,
|
|
50
76
|
});
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
constraints: newFeatureStrategy.constraints,
|
|
55
|
-
parameters: newFeatureStrategy.parameters,
|
|
56
|
-
};
|
|
57
|
-
await this.eventStore.store({
|
|
58
|
-
type: events_1.FEATURE_STRATEGY_ADD,
|
|
77
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
78
|
+
const strategy = this.featureStrategyToPublic(newFeatureStrategy);
|
|
79
|
+
await this.eventStore.store(new events_1.FeatureStrategyAddEvent({
|
|
59
80
|
project: projectId,
|
|
60
|
-
|
|
81
|
+
featureName,
|
|
82
|
+
createdBy,
|
|
61
83
|
environment,
|
|
62
|
-
data:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
return data;
|
|
84
|
+
data: strategy,
|
|
85
|
+
tags,
|
|
86
|
+
}));
|
|
87
|
+
return strategy;
|
|
69
88
|
}
|
|
70
89
|
catch (e) {
|
|
71
90
|
if (e.code === db_error_1.FOREIGN_KEY_VIOLATION) {
|
|
@@ -81,49 +100,51 @@ class FeatureToggleServiceV2 {
|
|
|
81
100
|
* }
|
|
82
101
|
* @param id
|
|
83
102
|
* @param updates
|
|
103
|
+
* @param context - Which context does this strategy live in (projectId, featureName, environment)
|
|
104
|
+
* @param userName - Human readable id of the user performing the update
|
|
84
105
|
*/
|
|
85
|
-
|
|
86
|
-
|
|
106
|
+
async updateStrategy(id, updates, context, userName) {
|
|
107
|
+
const { projectId, environment, featureName } = context;
|
|
87
108
|
const existingStrategy = await this.featureStrategiesStore.get(id);
|
|
109
|
+
this.validateFeatureStrategyContext(existingStrategy, context);
|
|
88
110
|
if (existingStrategy.id === id) {
|
|
89
111
|
const strategy = await this.featureStrategiesStore.updateStrategy(id, updates);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
await this.eventStore.store({
|
|
98
|
-
type: events_1.FEATURE_STRATEGY_UPDATE,
|
|
99
|
-
project,
|
|
112
|
+
// Store event!
|
|
113
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
114
|
+
const data = this.featureStrategyToPublic(strategy);
|
|
115
|
+
const preData = this.featureStrategyToPublic(existingStrategy);
|
|
116
|
+
await this.eventStore.store(new events_1.FeatureStrategyUpdateEvent({
|
|
117
|
+
project: projectId,
|
|
118
|
+
featureName,
|
|
100
119
|
environment,
|
|
101
120
|
createdBy: userName,
|
|
102
121
|
data,
|
|
103
|
-
|
|
122
|
+
preData,
|
|
123
|
+
tags,
|
|
124
|
+
}));
|
|
104
125
|
return data;
|
|
105
126
|
}
|
|
106
127
|
throw new notfound_error_1.default(`Could not find strategy with id ${id}`);
|
|
107
128
|
}
|
|
108
|
-
|
|
109
|
-
|
|
129
|
+
async updateStrategyParameter(id, name, value, context, userName) {
|
|
130
|
+
const { projectId, environment, featureName } = context;
|
|
110
131
|
const existingStrategy = await this.featureStrategiesStore.get(id);
|
|
132
|
+
this.validateFeatureStrategyContext(existingStrategy, context);
|
|
111
133
|
if (existingStrategy.id === id) {
|
|
112
134
|
existingStrategy.parameters[name] = value;
|
|
113
135
|
const strategy = await this.featureStrategiesStore.updateStrategy(id, existingStrategy);
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
await this.eventStore.store({
|
|
121
|
-
type: events_1.FEATURE_STRATEGY_UPDATE,
|
|
122
|
-
project,
|
|
136
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
137
|
+
const data = this.featureStrategyToPublic(strategy);
|
|
138
|
+
const preData = this.featureStrategyToPublic(existingStrategy);
|
|
139
|
+
await this.eventStore.store(new events_1.FeatureStrategyUpdateEvent({
|
|
140
|
+
featureName,
|
|
141
|
+
project: projectId,
|
|
123
142
|
environment,
|
|
124
143
|
createdBy: userName,
|
|
125
144
|
data,
|
|
126
|
-
|
|
145
|
+
preData,
|
|
146
|
+
tags,
|
|
147
|
+
}));
|
|
127
148
|
return data;
|
|
128
149
|
}
|
|
129
150
|
throw new notfound_error_1.default(`Could not find strategy with id ${id}`);
|
|
@@ -134,23 +155,24 @@ class FeatureToggleServiceV2 {
|
|
|
134
155
|
*
|
|
135
156
|
* }
|
|
136
157
|
* @param id - strategy id
|
|
137
|
-
* @param
|
|
138
|
-
* @param userName - Who's doing the change
|
|
139
|
-
* @param project - Which project does this feature toggle belong to
|
|
158
|
+
* @param context - Which context does this strategy live in (projectId, featureName, environment)
|
|
140
159
|
* @param environment - Which environment does this strategy belong to
|
|
141
160
|
*/
|
|
142
|
-
async deleteStrategy(id,
|
|
161
|
+
async deleteStrategy(id, context, createdBy) {
|
|
162
|
+
const existingStrategy = await this.featureStrategiesStore.get(id);
|
|
163
|
+
const { featureName, projectId, environment } = context;
|
|
164
|
+
this.validateFeatureStrategyContext(existingStrategy, context);
|
|
143
165
|
await this.featureStrategiesStore.delete(id);
|
|
144
|
-
await this.
|
|
145
|
-
|
|
146
|
-
|
|
166
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
167
|
+
const preData = this.featureStrategyToPublic(existingStrategy);
|
|
168
|
+
await this.eventStore.store(new events_1.FeatureStrategyRemoveEvent({
|
|
169
|
+
featureName,
|
|
170
|
+
project: projectId,
|
|
147
171
|
environment,
|
|
148
|
-
createdBy
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
},
|
|
153
|
-
});
|
|
172
|
+
createdBy,
|
|
173
|
+
preData,
|
|
174
|
+
tags,
|
|
175
|
+
}));
|
|
154
176
|
// If there are no strategies left for environment disable it
|
|
155
177
|
await this.featureEnvironmentStore.disableEnvironmentIfNoStrategies(featureName, environment);
|
|
156
178
|
}
|
|
@@ -202,21 +224,23 @@ class FeatureToggleServiceV2 {
|
|
|
202
224
|
async getFeatureToggle(featureName) {
|
|
203
225
|
return this.featureStrategiesStore.getFeatureToggleWithEnvs(featureName, false);
|
|
204
226
|
}
|
|
205
|
-
async createFeatureToggle(projectId, value,
|
|
206
|
-
this.logger.info(`${
|
|
227
|
+
async createFeatureToggle(projectId, value, createdBy) {
|
|
228
|
+
this.logger.info(`${createdBy} creates feature toggle ${value.name}`);
|
|
207
229
|
await this.validateName(value.name);
|
|
208
230
|
const exists = await this.projectStore.hasProject(projectId);
|
|
209
231
|
if (exists) {
|
|
210
232
|
const featureData = await feature_schema_1.featureMetadataSchema.validateAsync(value);
|
|
233
|
+
const featureName = featureData.name;
|
|
211
234
|
const createdToggle = await this.featureToggleStore.create(projectId, featureData);
|
|
212
|
-
await this.featureEnvironmentStore.connectFeatureToEnvironmentsForProject(
|
|
213
|
-
const
|
|
214
|
-
await this.eventStore.store({
|
|
215
|
-
|
|
216
|
-
createdBy
|
|
235
|
+
await this.featureEnvironmentStore.connectFeatureToEnvironmentsForProject(featureName, projectId);
|
|
236
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
237
|
+
await this.eventStore.store(new events_1.FeatureCreatedEvent({
|
|
238
|
+
featureName,
|
|
239
|
+
createdBy,
|
|
217
240
|
project: projectId,
|
|
218
|
-
data,
|
|
219
|
-
|
|
241
|
+
data: createdToggle,
|
|
242
|
+
tags,
|
|
243
|
+
}));
|
|
220
244
|
return createdToggle;
|
|
221
245
|
}
|
|
222
246
|
throw new notfound_error_1.default(`Project with id ${projectId} does not exist`);
|
|
@@ -235,7 +259,11 @@ class FeatureToggleServiceV2 {
|
|
|
235
259
|
s.parameters.groupId = newFeatureName;
|
|
236
260
|
}
|
|
237
261
|
delete s.id;
|
|
238
|
-
createStrategies.push(this.createStrategy(s,
|
|
262
|
+
createStrategies.push(this.createStrategy(s, {
|
|
263
|
+
projectId,
|
|
264
|
+
featureName: newFeatureName,
|
|
265
|
+
environment: e.name,
|
|
266
|
+
}, userName));
|
|
239
267
|
}));
|
|
240
268
|
// Create strategies
|
|
241
269
|
await Promise.allSettled(createStrategies);
|
|
@@ -245,15 +273,17 @@ class FeatureToggleServiceV2 {
|
|
|
245
273
|
const featureName = updatedFeature.name;
|
|
246
274
|
this.logger.info(`${userName} updates feature toggle ${featureName}`);
|
|
247
275
|
const featureData = await feature_schema_1.featureMetadataSchema.validateAsync(updatedFeature);
|
|
276
|
+
const preData = await this.featureToggleStore.get(featureName);
|
|
248
277
|
const featureToggle = await this.featureToggleStore.update(projectId, featureData);
|
|
249
|
-
const tags = await this.
|
|
250
|
-
await this.eventStore.store({
|
|
251
|
-
type: events_1.FEATURE_METADATA_UPDATED,
|
|
278
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
279
|
+
await this.eventStore.store(new events_1.FeatureMetadataUpdateEvent({
|
|
252
280
|
createdBy: userName,
|
|
253
281
|
data: featureToggle,
|
|
282
|
+
preData,
|
|
283
|
+
featureName,
|
|
254
284
|
project: projectId,
|
|
255
285
|
tags,
|
|
256
|
-
});
|
|
286
|
+
}));
|
|
257
287
|
return featureToggle;
|
|
258
288
|
}
|
|
259
289
|
async getFeatureCountForProject(projectId) {
|
|
@@ -284,6 +314,7 @@ class FeatureToggleServiceV2 {
|
|
|
284
314
|
strategies,
|
|
285
315
|
};
|
|
286
316
|
}
|
|
317
|
+
// todo: store events for this change.
|
|
287
318
|
async deleteEnvironment(projectId, environment) {
|
|
288
319
|
await this.featureStrategiesStore.deleteConfigurationsForProjectAndEnvironment(projectId, environment);
|
|
289
320
|
await this.projectStore.deleteEnvironmentForProject(projectId, environment);
|
|
@@ -310,38 +341,38 @@ class FeatureToggleServiceV2 {
|
|
|
310
341
|
async hasFeature(name) {
|
|
311
342
|
return this.featureToggleStore.exists(name);
|
|
312
343
|
}
|
|
313
|
-
async updateStale(featureName, isStale,
|
|
344
|
+
async updateStale(featureName, isStale, createdBy) {
|
|
314
345
|
const feature = await this.featureToggleStore.get(featureName);
|
|
346
|
+
const { project } = feature;
|
|
315
347
|
feature.stale = isStale;
|
|
316
|
-
await this.featureToggleStore.update(
|
|
317
|
-
const tags = await this.
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
348
|
+
await this.featureToggleStore.update(project, feature);
|
|
349
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
350
|
+
await this.eventStore.store(new events_1.FeatureStaleEvent({
|
|
351
|
+
stale: isStale,
|
|
352
|
+
project,
|
|
353
|
+
featureName,
|
|
354
|
+
createdBy,
|
|
323
355
|
tags,
|
|
324
|
-
|
|
325
|
-
});
|
|
356
|
+
}));
|
|
326
357
|
return feature;
|
|
327
358
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
await this.featureToggleStore.
|
|
331
|
-
|
|
332
|
-
await this.
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
359
|
+
// todo: add projectId
|
|
360
|
+
async archiveToggle(featureName, createdBy) {
|
|
361
|
+
const feature = await this.featureToggleStore.get(featureName);
|
|
362
|
+
await this.featureToggleStore.archive(featureName);
|
|
363
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
364
|
+
await this.eventStore.store(new events_1.FeatureArchivedEvent({
|
|
365
|
+
featureName,
|
|
366
|
+
createdBy,
|
|
336
367
|
project: feature.project,
|
|
337
368
|
tags,
|
|
338
|
-
});
|
|
369
|
+
}));
|
|
339
370
|
}
|
|
340
|
-
async updateEnabled(
|
|
371
|
+
async updateEnabled(project, featureName, environment, enabled, createdBy) {
|
|
341
372
|
const hasEnvironment = await this.featureEnvironmentStore.featureHasEnvironment(environment, featureName);
|
|
342
373
|
if (hasEnvironment) {
|
|
343
374
|
if (enabled) {
|
|
344
|
-
const strategies = await this.getStrategiesForEnvironment(
|
|
375
|
+
const strategies = await this.getStrategiesForEnvironment(project, featureName, environment);
|
|
345
376
|
if (strategies.length === 0) {
|
|
346
377
|
throw new invalid_operation_error_1.default('You can not enable the environment before it has strategies');
|
|
347
378
|
}
|
|
@@ -349,28 +380,30 @@ class FeatureToggleServiceV2 {
|
|
|
349
380
|
const updatedEnvironmentStatus = await this.featureEnvironmentStore.setEnvironmentEnabledStatus(environment, featureName, enabled);
|
|
350
381
|
const feature = await this.featureToggleStore.get(featureName);
|
|
351
382
|
if (updatedEnvironmentStatus > 0) {
|
|
352
|
-
const tags = await this.
|
|
353
|
-
await this.eventStore.store({
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
createdBy: userName,
|
|
358
|
-
data: { name: featureName },
|
|
359
|
-
tags,
|
|
360
|
-
project: projectId,
|
|
383
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
384
|
+
await this.eventStore.store(new events_1.FeatureEnvironmentEvent({
|
|
385
|
+
enabled,
|
|
386
|
+
project,
|
|
387
|
+
featureName,
|
|
361
388
|
environment,
|
|
362
|
-
|
|
389
|
+
createdBy,
|
|
390
|
+
tags,
|
|
391
|
+
}));
|
|
363
392
|
}
|
|
364
393
|
return feature;
|
|
365
394
|
}
|
|
366
395
|
throw new notfound_error_1.default(`Could not find environment ${environment} for feature: ${featureName}`);
|
|
367
396
|
}
|
|
368
|
-
|
|
369
|
-
|
|
397
|
+
// @deprecated
|
|
398
|
+
async storeFeatureUpdatedEventLegacy(featureName, createdBy) {
|
|
399
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
370
400
|
const feature = await this.getFeatureToggleLegacy(featureName);
|
|
401
|
+
// Legacy event. Will not be used from v4.3.
|
|
402
|
+
// We do not include 'preData' on purpose.
|
|
371
403
|
await this.eventStore.store({
|
|
372
404
|
type: events_1.FEATURE_UPDATED,
|
|
373
|
-
createdBy
|
|
405
|
+
createdBy,
|
|
406
|
+
featureName,
|
|
374
407
|
data: feature,
|
|
375
408
|
tags,
|
|
376
409
|
project: feature.project,
|
|
@@ -383,6 +416,7 @@ class FeatureToggleServiceV2 {
|
|
|
383
416
|
const isEnabled = await this.featureEnvironmentStore.isEnvironmentEnabled(featureName, environment);
|
|
384
417
|
return this.updateEnabled(projectId, featureName, environment, !isEnabled, userName);
|
|
385
418
|
}
|
|
419
|
+
// @deprecated
|
|
386
420
|
async getFeatureToggleLegacy(featureName) {
|
|
387
421
|
const feature = await this.featureStrategiesStore.getFeatureToggleWithEnvs(featureName);
|
|
388
422
|
const { environments, ...legacyFeature } = feature;
|
|
@@ -391,47 +425,46 @@ class FeatureToggleServiceV2 {
|
|
|
391
425
|
const enabled = defaultEnv?.enabled || false;
|
|
392
426
|
return { ...legacyFeature, enabled, strategies };
|
|
393
427
|
}
|
|
394
|
-
async changeProject(featureName, newProject,
|
|
428
|
+
async changeProject(featureName, newProject, createdBy) {
|
|
395
429
|
const feature = await this.featureToggleStore.get(featureName);
|
|
396
430
|
const oldProject = feature.project;
|
|
397
431
|
feature.project = newProject;
|
|
398
432
|
await this.featureToggleStore.update(newProject, feature);
|
|
399
|
-
const tags = await this.
|
|
400
|
-
await this.eventStore.store({
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
oldProject,
|
|
406
|
-
newProject,
|
|
407
|
-
},
|
|
408
|
-
project: newProject,
|
|
433
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
434
|
+
await this.eventStore.store(new events_1.FeatureChangeProjectEvent({
|
|
435
|
+
createdBy,
|
|
436
|
+
oldProject,
|
|
437
|
+
newProject,
|
|
438
|
+
featureName,
|
|
409
439
|
tags,
|
|
410
|
-
});
|
|
440
|
+
}));
|
|
411
441
|
}
|
|
412
442
|
async getArchivedFeatures() {
|
|
413
443
|
return this.getFeatureToggles({}, true);
|
|
414
444
|
}
|
|
415
|
-
|
|
445
|
+
// TODO: add project id.
|
|
446
|
+
async deleteFeature(featureName, createdBy) {
|
|
447
|
+
const toggle = await this.featureToggleStore.get(featureName);
|
|
448
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
416
449
|
await this.featureToggleStore.delete(featureName);
|
|
417
|
-
await this.eventStore.store({
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
});
|
|
450
|
+
await this.eventStore.store(new events_1.FeatureDeletedEvent({
|
|
451
|
+
featureName,
|
|
452
|
+
project: toggle.project,
|
|
453
|
+
createdBy,
|
|
454
|
+
preData: toggle,
|
|
455
|
+
tags,
|
|
456
|
+
}));
|
|
424
457
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
const
|
|
428
|
-
await this.
|
|
429
|
-
|
|
430
|
-
createdBy
|
|
431
|
-
|
|
432
|
-
project:
|
|
458
|
+
// TODO: add project id.
|
|
459
|
+
async reviveToggle(featureName, createdBy) {
|
|
460
|
+
const toggle = await this.featureToggleStore.revive(featureName);
|
|
461
|
+
const tags = await this.tagStore.getAllTagsForFeature(featureName);
|
|
462
|
+
await this.eventStore.store(new events_1.FeatureRevivedEvent({
|
|
463
|
+
createdBy,
|
|
464
|
+
featureName,
|
|
465
|
+
project: toggle.project,
|
|
433
466
|
tags,
|
|
434
|
-
});
|
|
467
|
+
}));
|
|
435
468
|
}
|
|
436
469
|
async getMetadataForAllFeatures(archived) {
|
|
437
470
|
return this.featureToggleStore.getAll({ archived });
|
|
@@ -443,6 +476,5 @@ class FeatureToggleServiceV2 {
|
|
|
443
476
|
await this.featureStrategiesStore.setProjectForStrategiesBelongingToFeature(featureName, newProjectId);
|
|
444
477
|
}
|
|
445
478
|
}
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
//# sourceMappingURL=feature-toggle-service-v2.js.map
|
|
479
|
+
exports.default = FeatureToggleService;
|
|
480
|
+
//# sourceMappingURL=feature-toggle-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-toggle-service.js","sourceRoot":"","sources":["../../../src/lib/services/feature-toggle-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ const reset_token_service_1 = __importDefault(require("./reset-token-service"));
|
|
|
25
25
|
const setting_service_1 = __importDefault(require("./setting-service"));
|
|
26
26
|
const session_service_1 = __importDefault(require("./session-service"));
|
|
27
27
|
const user_feedback_service_1 = __importDefault(require("./user-feedback-service"));
|
|
28
|
-
const
|
|
28
|
+
const feature_toggle_service_1 = __importDefault(require("./feature-toggle-service"));
|
|
29
29
|
const environment_service_1 = __importDefault(require("./environment-service"));
|
|
30
30
|
const feature_tag_service_1 = __importDefault(require("./feature-tag-service"));
|
|
31
31
|
const project_health_service_1 = __importDefault(require("./project-health-service"));
|
|
@@ -45,17 +45,18 @@ const createServices = (stores, config) => {
|
|
|
45
45
|
const tagTypeService = new tag_type_service_1.default(stores, config);
|
|
46
46
|
const addonService = new addon_service_1.default(stores, config, tagTypeService);
|
|
47
47
|
const sessionService = new session_service_1.default(stores, config);
|
|
48
|
+
const settingService = new setting_service_1.default(stores, config);
|
|
48
49
|
const userService = new user_service_1.default(stores, config, {
|
|
49
50
|
accessService,
|
|
50
51
|
resetTokenService,
|
|
51
52
|
emailService,
|
|
52
53
|
sessionService,
|
|
54
|
+
settingService,
|
|
53
55
|
});
|
|
54
56
|
const versionService = new version_service_1.default(stores, config);
|
|
55
57
|
const healthService = new health_service_1.default(stores, config);
|
|
56
|
-
const settingService = new setting_service_1.default(stores, config);
|
|
57
58
|
const userFeedbackService = new user_feedback_service_1.default(stores, config);
|
|
58
|
-
const featureToggleServiceV2 = new
|
|
59
|
+
const featureToggleServiceV2 = new feature_toggle_service_1.default(stores, config);
|
|
59
60
|
const environmentService = new environment_service_1.default(stores, config);
|
|
60
61
|
const featureTagService = new feature_tag_service_1.default(stores, config);
|
|
61
62
|
const projectHealthService = new project_health_service_1.default(stores, config, featureToggleServiceV2);
|
|
@@ -63,6 +64,7 @@ const createServices = (stores, config) => {
|
|
|
63
64
|
return {
|
|
64
65
|
accessService,
|
|
65
66
|
addonService,
|
|
67
|
+
featureToggleService: featureToggleServiceV2,
|
|
66
68
|
featureToggleServiceV2,
|
|
67
69
|
featureTypeService,
|
|
68
70
|
healthService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":";;;;;;AAGA,kFAAwD;AACxD,oEAA2C;AAC3C,sEAA6C;AAE7C,wEAA+C;AAC/C,oEAA2C;AAC3C,sEAAoD;AACpD,2GAAgF;AAChF,0EAAgD;AAChD,gEAAuC;AACvC,0EAAiD;AACjD,oEAA2C;AAC3C,wEAA+C;AAC/C,wEAA+C;AAC/C,mDAA+C;AAC/C,qDAAiD;AACjD,2DAAsD;AACtD,kEAAyC;AACzC,gFAAsD;AACtD,wEAA+C;AAC/C,wEAA+C;AAC/C,oFAA0D;AAC1D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IUnleashStores } from '../types/stores';
|
|
2
2
|
import { IUnleashConfig } from '../types/option';
|
|
3
3
|
import { IProject, IProjectHealthReport, IProjectOverview } from '../types/model';
|
|
4
|
-
import
|
|
4
|
+
import FeatureToggleService from './feature-toggle-service';
|
|
5
5
|
export default class ProjectHealthService {
|
|
6
6
|
private logger;
|
|
7
7
|
private projectStore;
|
|
@@ -10,7 +10,7 @@ export default class ProjectHealthService {
|
|
|
10
10
|
private featureTypes;
|
|
11
11
|
private healthRatingTimer;
|
|
12
12
|
private featureToggleService;
|
|
13
|
-
constructor({ projectStore, featureTypeStore, featureToggleStore, }: Pick<IUnleashStores, 'projectStore' | 'featureTypeStore' | 'featureToggleStore'>, { getLogger }: Pick<IUnleashConfig, 'getLogger'>, featureToggleService:
|
|
13
|
+
constructor({ projectStore, featureTypeStore, featureToggleStore, }: Pick<IUnleashStores, 'projectStore' | 'featureTypeStore' | 'featureToggleStore'>, { getLogger }: Pick<IUnleashConfig, 'getLogger'>, featureToggleService: FeatureToggleService);
|
|
14
14
|
getProjectOverview(projectId: string, archived?: boolean): Promise<IProjectOverview>;
|
|
15
15
|
getProjectHealthReport(projectId: string): Promise<IProjectHealthReport>;
|
|
16
16
|
private potentiallyStaleCount;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const date_fns_1 = require("date-fns");
|
|
4
4
|
class ProjectHealthService {
|
|
5
5
|
constructor({ projectStore, featureTypeStore, featureToggleStore, }, { getLogger }, featureToggleService) {
|
|
6
6
|
this.logger = getLogger('services/project-health-service.ts');
|
|
@@ -8,7 +8,7 @@ class ProjectHealthService {
|
|
|
8
8
|
this.featureTypeStore = featureTypeStore;
|
|
9
9
|
this.featureToggleStore = featureToggleStore;
|
|
10
10
|
this.featureTypes = new Map();
|
|
11
|
-
this.healthRatingTimer = setInterval(() => this.setHealthRating(),
|
|
11
|
+
this.healthRatingTimer = setInterval(() => this.setHealthRating(), (0, date_fns_1.hoursToMilliseconds)(1)).unref();
|
|
12
12
|
this.featureToggleService = featureToggleService;
|
|
13
13
|
}
|
|
14
14
|
// TODO: duplicate from project-service.
|
|
@@ -48,7 +48,7 @@ class ProjectHealthService {
|
|
|
48
48
|
const diff = today - feature.createdAt.valueOf();
|
|
49
49
|
const featureTypeExpectedLifetime = this.featureTypes.get(feature.type);
|
|
50
50
|
return (!feature.stale &&
|
|
51
|
-
diff >= featureTypeExpectedLifetime *
|
|
51
|
+
diff >= featureTypeExpectedLifetime * (0, date_fns_1.hoursToMilliseconds)(24));
|
|
52
52
|
}).length;
|
|
53
53
|
}
|
|
54
54
|
activeCount(features) {
|