unleash-server 4.2.0 → 4.3.0-beta.2

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.
Files changed (263) hide show
  1. package/README.md +1 -0
  2. package/dist/lib/addons/addon.d.ts +2 -1
  3. package/dist/lib/addons/addon.js.map +1 -1
  4. package/dist/lib/addons/datadog.d.ts +2 -1
  5. package/dist/lib/addons/datadog.js.map +1 -1
  6. package/dist/lib/addons/datadog.test.js +3 -0
  7. package/dist/lib/addons/datadog.test.js.map +1 -1
  8. package/dist/lib/addons/feature-event-formatter-md.d.ts +1 -1
  9. package/dist/lib/addons/feature-event-formatter-md.js +13 -14
  10. package/dist/lib/addons/feature-event-formatter-md.js.map +1 -1
  11. package/dist/lib/addons/slack.d.ts +2 -1
  12. package/dist/lib/addons/slack.js.map +1 -1
  13. package/dist/lib/addons/slack.test.js +6 -0
  14. package/dist/lib/addons/slack.test.js.map +1 -1
  15. package/dist/lib/addons/teams.d.ts +2 -1
  16. package/dist/lib/addons/teams.js.map +1 -1
  17. package/dist/lib/addons/teams.test.js +3 -0
  18. package/dist/lib/addons/teams.test.js.map +1 -1
  19. package/dist/lib/addons/webhook.d.ts +8 -2
  20. package/dist/lib/addons/webhook.js +0 -1
  21. package/dist/lib/addons/webhook.js.map +1 -1
  22. package/dist/lib/addons/webhook.test.js +2 -0
  23. package/dist/lib/addons/webhook.test.js.map +1 -1
  24. package/dist/lib/create-config.js +11 -20
  25. package/dist/lib/create-config.js.map +1 -1
  26. package/dist/lib/create-config.test.js +0 -37
  27. package/dist/lib/create-config.test.js.map +1 -1
  28. package/dist/lib/db/client-instance-store.js +2 -2
  29. package/dist/lib/db/client-instance-store.js.map +1 -1
  30. package/dist/lib/db/client-metrics-db.js +2 -2
  31. package/dist/lib/db/client-metrics-db.js.map +1 -1
  32. package/dist/lib/db/client-metrics-store-v2.js +5 -1
  33. package/dist/lib/db/client-metrics-store-v2.js.map +1 -1
  34. package/dist/lib/db/client-metrics-store.js +2 -2
  35. package/dist/lib/db/client-metrics-store.js.map +1 -1
  36. package/dist/lib/db/event-store.d.ts +10 -6
  37. package/dist/lib/db/event-store.js +21 -1
  38. package/dist/lib/db/event-store.js.map +1 -1
  39. package/dist/lib/db/feature-strategy-store.js +1 -0
  40. package/dist/lib/db/feature-strategy-store.js.map +1 -1
  41. package/dist/lib/db/feature-toggle-store.d.ts +4 -1
  42. package/dist/lib/db/feature-toggle-store.js +27 -2
  43. package/dist/lib/db/feature-toggle-store.js.map +1 -1
  44. package/dist/lib/db/index.js +2 -0
  45. package/dist/lib/db/index.js.map +1 -1
  46. package/dist/lib/db/session-store.js +2 -1
  47. package/dist/lib/db/session-store.js.map +1 -1
  48. package/dist/lib/db/user-splash-store.d.ts +19 -0
  49. package/dist/lib/db/user-splash-store.js +70 -0
  50. package/dist/lib/db/user-splash-store.js.map +1 -0
  51. package/dist/lib/error/minimum-one-environment-error.d.ts +5 -0
  52. package/dist/lib/error/minimum-one-environment-error.js +24 -0
  53. package/dist/lib/error/minimum-one-environment-error.js.map +1 -0
  54. package/dist/lib/error/operation-denied-error.d.ts +4 -0
  55. package/dist/lib/error/operation-denied-error.js +24 -0
  56. package/dist/lib/error/operation-denied-error.js.map +1 -0
  57. package/dist/lib/metrics.js +20 -12
  58. package/dist/lib/metrics.js.map +1 -1
  59. package/dist/lib/metrics.test.js +1 -0
  60. package/dist/lib/metrics.test.js.map +1 -1
  61. package/dist/lib/middleware/rbac-middleware.js +2 -17
  62. package/dist/lib/middleware/rbac-middleware.js.map +1 -1
  63. package/dist/lib/middleware/rbac-middleware.test.js +0 -21
  64. package/dist/lib/middleware/rbac-middleware.test.js.map +1 -1
  65. package/dist/lib/middleware/secure-headers.js +2 -1
  66. package/dist/lib/middleware/secure-headers.js.map +1 -1
  67. package/dist/lib/middleware/session-db.js +2 -3
  68. package/dist/lib/middleware/session-db.js.map +1 -1
  69. package/dist/lib/routes/admin-api/event.d.ts +8 -4
  70. package/dist/lib/routes/admin-api/event.js +8 -10
  71. package/dist/lib/routes/admin-api/event.js.map +1 -1
  72. package/dist/lib/routes/admin-api/feature.js +7 -3
  73. package/dist/lib/routes/admin-api/feature.js.map +1 -1
  74. package/dist/lib/routes/admin-api/index.js +2 -0
  75. package/dist/lib/routes/admin-api/index.js.map +1 -1
  76. package/dist/lib/routes/admin-api/project/features.js +11 -8
  77. package/dist/lib/routes/admin-api/project/features.js.map +1 -1
  78. package/dist/lib/routes/admin-api/project/index.js +2 -0
  79. package/dist/lib/routes/admin-api/project/index.js.map +1 -1
  80. package/dist/lib/routes/admin-api/project/variants.d.ts +21 -0
  81. package/dist/lib/routes/admin-api/project/variants.js +41 -0
  82. package/dist/lib/routes/admin-api/project/variants.js.map +1 -0
  83. package/dist/lib/routes/admin-api/state.js +2 -3
  84. package/dist/lib/routes/admin-api/state.js.map +1 -1
  85. package/dist/lib/routes/admin-api/user-splash-controller.d.ts +10 -0
  86. package/dist/lib/routes/admin-api/user-splash-controller.js +28 -0
  87. package/dist/lib/routes/admin-api/user-splash-controller.js.map +1 -0
  88. package/dist/lib/routes/admin-api/user.d.ts +2 -1
  89. package/dist/lib/routes/admin-api/user.js +7 -2
  90. package/dist/lib/routes/admin-api/user.js.map +1 -1
  91. package/dist/lib/routes/client-api/feature.test.js +3 -2
  92. package/dist/lib/routes/client-api/feature.test.js.map +1 -1
  93. package/dist/lib/routes/client-api/metrics.d.ts +0 -1
  94. package/dist/lib/routes/client-api/metrics.js +2 -10
  95. package/dist/lib/routes/client-api/metrics.js.map +1 -1
  96. package/dist/lib/routes/util.js +18 -14
  97. package/dist/lib/routes/util.js.map +1 -1
  98. package/dist/lib/schema/feature-schema.d.ts +1 -0
  99. package/dist/lib/schema/feature-schema.js +6 -7
  100. package/dist/lib/schema/feature-schema.js.map +1 -1
  101. package/dist/lib/services/addon-service-test-simple-addon.d.ts +1 -1
  102. package/dist/lib/services/addon-service-test-simple-addon.js.map +1 -1
  103. package/dist/lib/services/addon-service.js +2 -2
  104. package/dist/lib/services/addon-service.js.map +1 -1
  105. package/dist/lib/services/api-token-service.js +2 -2
  106. package/dist/lib/services/api-token-service.js.map +1 -1
  107. package/dist/lib/services/client-metrics/client-metrics-service-v2.js +5 -6
  108. package/dist/lib/services/client-metrics/client-metrics-service-v2.js.map +1 -1
  109. package/dist/lib/services/client-metrics/client-metrics.test.js +74 -41
  110. package/dist/lib/services/client-metrics/client-metrics.test.js.map +1 -1
  111. package/dist/lib/services/client-metrics/index.d.ts +6 -5
  112. package/dist/lib/services/client-metrics/index.js +13 -10
  113. package/dist/lib/services/client-metrics/index.js.map +1 -1
  114. package/dist/lib/services/client-metrics/list.d.ts +19 -16
  115. package/dist/lib/services/client-metrics/list.js +6 -4
  116. package/dist/lib/services/client-metrics/list.js.map +1 -1
  117. package/dist/lib/services/client-metrics/list.test.js +9 -5
  118. package/dist/lib/services/client-metrics/list.test.js.map +1 -1
  119. package/dist/lib/services/client-metrics/ttl-list.d.ts +20 -13
  120. package/dist/lib/services/client-metrics/ttl-list.js +26 -15
  121. package/dist/lib/services/client-metrics/ttl-list.js.map +1 -1
  122. package/dist/lib/services/client-metrics/ttl-list.test.js +33 -9
  123. package/dist/lib/services/client-metrics/ttl-list.test.js.map +1 -1
  124. package/dist/lib/services/environment-service.d.ts +2 -1
  125. package/dist/lib/services/environment-service.js +10 -3
  126. package/dist/lib/services/environment-service.js.map +1 -1
  127. package/dist/lib/services/event-service.d.ts +1 -1
  128. package/dist/lib/services/event-service.js +1 -1
  129. package/dist/lib/services/event-service.js.map +1 -1
  130. package/dist/lib/services/feature-tag-service.js +7 -11
  131. package/dist/lib/services/feature-tag-service.js.map +1 -1
  132. package/dist/lib/services/{feature-toggle-service-v2.d.ts → feature-toggle-service.d.ts} +39 -20
  133. package/dist/lib/services/{feature-toggle-service-v2.js → feature-toggle-service.js} +233 -146
  134. package/dist/lib/services/feature-toggle-service.js.map +1 -0
  135. package/dist/lib/services/index.js +6 -2
  136. package/dist/lib/services/index.js.map +1 -1
  137. package/dist/lib/services/project-health-service.d.ts +2 -2
  138. package/dist/lib/services/project-health-service.js +4 -3
  139. package/dist/lib/services/project-health-service.js.map +1 -1
  140. package/dist/lib/services/project-service.d.ts +2 -3
  141. package/dist/lib/services/project-service.js +12 -18
  142. package/dist/lib/services/project-service.js.map +1 -1
  143. package/dist/lib/services/reset-token-service.js +2 -2
  144. package/dist/lib/services/reset-token-service.js.map +1 -1
  145. package/dist/lib/services/state-util.js +1 -1
  146. package/dist/lib/services/state-util.js.map +1 -1
  147. package/dist/lib/services/user-service.d.ts +3 -2
  148. package/dist/lib/services/user-service.js +37 -21
  149. package/dist/lib/services/user-service.js.map +1 -1
  150. package/dist/lib/services/user-splash-service.d.ts +12 -0
  151. package/dist/lib/services/user-splash-service.js +33 -0
  152. package/dist/lib/services/user-splash-service.js.map +1 -0
  153. package/dist/lib/services/version-service.js +2 -2
  154. package/dist/lib/services/version-service.js.map +1 -1
  155. package/dist/lib/types/events.d.ts +165 -2
  156. package/dist/lib/types/events.js +124 -4
  157. package/dist/lib/types/events.js.map +1 -1
  158. package/dist/lib/types/model.d.ts +4 -12
  159. package/dist/lib/types/model.js +6 -1
  160. package/dist/lib/types/model.js.map +1 -1
  161. package/dist/lib/types/services.d.ts +5 -2
  162. package/dist/lib/types/stores/event-store.d.ts +4 -3
  163. package/dist/lib/types/stores/feature-toggle-store.d.ts +3 -1
  164. package/dist/lib/types/stores/user-splash-store.d.ts +15 -0
  165. package/dist/lib/types/stores/user-splash-store.js +3 -0
  166. package/dist/lib/types/stores/user-splash-store.js.map +1 -0
  167. package/dist/lib/types/stores.d.ts +2 -0
  168. package/dist/lib/util/constants.d.ts +0 -2
  169. package/dist/lib/util/constants.js +1 -3
  170. package/dist/lib/util/constants.js.map +1 -1
  171. package/dist/migrations/20211105104316-add-feature-name-column-to-events.d.ts +2 -0
  172. package/dist/migrations/20211105104316-add-feature-name-column-to-events.js +16 -0
  173. package/dist/migrations/20211105104316-add-feature-name-column-to-events.js.map +1 -0
  174. package/dist/migrations/20211105105509-add-predata-column-to-events.d.ts +2 -0
  175. package/dist/migrations/20211105105509-add-predata-column-to-events.js +8 -0
  176. package/dist/migrations/20211105105509-add-predata-column-to-events.js.map +1 -0
  177. package/dist/migrations/20211108130333-create-user-splash-table.d.ts +2 -0
  178. package/dist/migrations/20211108130333-create-user-splash-table.js +18 -0
  179. package/dist/migrations/20211108130333-create-user-splash-table.js.map +1 -0
  180. package/dist/migrations/20211109103930-add-splash-entry-for-users.d.ts +2 -0
  181. package/dist/migrations/20211109103930-add-splash-entry-for-users.js +7 -0
  182. package/dist/migrations/20211109103930-add-splash-entry-for-users.js.map +1 -0
  183. package/dist/migrations/20211126112551-disable-default-environment.d.ts +2 -0
  184. package/dist/migrations/20211126112551-disable-default-environment.js +24 -0
  185. package/dist/migrations/20211126112551-disable-default-environment.js.map +1 -0
  186. package/dist/migrator.js +9 -2
  187. package/dist/migrator.js.map +1 -1
  188. package/dist/test/e2e/api/admin/client-metrics.e2e.test.js +18 -14
  189. package/dist/test/e2e/api/admin/client-metrics.e2e.test.js.map +1 -1
  190. package/dist/test/e2e/api/admin/feature-archive.e2e.test.js +1 -2
  191. package/dist/test/e2e/api/admin/feature-archive.e2e.test.js.map +1 -1
  192. package/dist/test/e2e/api/admin/feature.e2e.test.js +43 -20
  193. package/dist/test/e2e/api/admin/feature.e2e.test.js.map +1 -1
  194. package/dist/test/e2e/api/admin/metrics.e2e.test.js +5 -3
  195. package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
  196. package/dist/test/e2e/api/admin/project/environments.e2e.test.js +10 -0
  197. package/dist/test/e2e/api/admin/project/environments.e2e.test.js.map +1 -1
  198. package/dist/test/e2e/api/admin/project/features.e2e.test.js +145 -8
  199. package/dist/test/e2e/api/admin/project/features.e2e.test.js.map +1 -1
  200. package/dist/test/e2e/api/admin/project/project.health.e2e.test.js +60 -0
  201. package/dist/test/e2e/api/admin/project/project.health.e2e.test.js.map +1 -1
  202. package/dist/{lib/event-differ.test.d.ts → test/e2e/api/admin/project/variants.e2e.test.d.ts} +0 -0
  203. package/dist/test/e2e/api/admin/project/variants.e2e.test.js +727 -0
  204. package/dist/test/e2e/api/admin/project/variants.e2e.test.js.map +1 -0
  205. package/dist/test/e2e/api/admin/splash.e2e.test.d.ts +1 -0
  206. package/dist/test/e2e/api/admin/splash.e2e.test.js +51 -0
  207. package/dist/test/e2e/api/admin/splash.e2e.test.js.map +1 -0
  208. package/dist/test/e2e/api/admin/state.e2e.test.js +17 -13
  209. package/dist/test/e2e/api/admin/state.e2e.test.js.map +1 -1
  210. package/dist/test/e2e/api/admin/user-admin.e2e.test.js +2 -16
  211. package/dist/test/e2e/api/admin/user-admin.e2e.test.js.map +1 -1
  212. package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js +8 -4
  213. package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js.map +1 -1
  214. package/dist/test/e2e/api/client/feature.token.access.e2e.test.js +4 -4
  215. package/dist/test/e2e/api/client/feature.token.access.e2e.test.js.map +1 -1
  216. package/dist/test/e2e/api/client/register.e2e.test.js +1 -1
  217. package/dist/test/e2e/api/client/register.e2e.test.js.map +1 -1
  218. package/dist/test/e2e/services/addon-service.e2e.test.js +1 -1
  219. package/dist/test/e2e/services/addon-service.e2e.test.js.map +1 -1
  220. package/dist/test/e2e/services/api-token-service.e2e.test.js +5 -3
  221. package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
  222. package/dist/test/e2e/services/client-metrics-service.e2e.test.js +5 -2
  223. package/dist/test/e2e/services/client-metrics-service.e2e.test.js.map +1 -1
  224. package/dist/test/e2e/services/environment-service.test.js +1 -1
  225. package/dist/test/e2e/services/environment-service.test.js.map +1 -1
  226. package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js +14 -11
  227. package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js.map +1 -1
  228. package/dist/test/e2e/services/project-health-service.e2e.test.js +2 -2
  229. package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
  230. package/dist/test/e2e/services/project-service.e2e.test.js +2 -32
  231. package/dist/test/e2e/services/project-service.e2e.test.js.map +1 -1
  232. package/dist/test/e2e/services/session-service.e2e.test.js +5 -4
  233. package/dist/test/e2e/services/session-service.e2e.test.js.map +1 -1
  234. package/dist/test/e2e/services/user-service.e2e.test.js +3 -2
  235. package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
  236. package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.js +4 -6
  237. package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.js.map +1 -1
  238. package/dist/test/e2e/stores/event-store.e2e.test.js +1 -1
  239. package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
  240. package/dist/test/e2e/stores/feature-toggle-store.e2e.test.js +1 -1
  241. package/dist/test/e2e/stores/feature-toggle-store.e2e.test.js.map +1 -1
  242. package/dist/test/e2e/stores/user-splash-store.e2e.test.d.ts +1 -0
  243. package/dist/test/e2e/stores/user-splash-store.e2e.test.js +74 -0
  244. package/dist/test/e2e/stores/user-splash-store.e2e.test.js.map +1 -0
  245. package/dist/test/fixtures/fake-event-store.d.ts +2 -1
  246. package/dist/test/fixtures/fake-event-store.js +3 -0
  247. package/dist/test/fixtures/fake-event-store.js.map +1 -1
  248. package/dist/test/fixtures/fake-feature-toggle-store.d.ts +3 -1
  249. package/dist/test/fixtures/fake-feature-toggle-store.js +9 -0
  250. package/dist/test/fixtures/fake-feature-toggle-store.js.map +1 -1
  251. package/dist/test/fixtures/fake-user-splash-store.d.ts +12 -0
  252. package/dist/test/fixtures/fake-user-splash-store.js +40 -0
  253. package/dist/test/fixtures/fake-user-splash-store.js.map +1 -0
  254. package/dist/test/fixtures/store.js +2 -0
  255. package/dist/test/fixtures/store.js.map +1 -1
  256. package/docs/api/oas/openapi.yaml +35 -55
  257. package/package.json +17 -18
  258. package/dist/lib/event-differ.d.ts +0 -1
  259. package/dist/lib/event-differ.js +0 -117
  260. package/dist/lib/event-differ.js.map +0 -1
  261. package/dist/lib/event-differ.test.js +0 -142
  262. package/dist/lib/event-differ.test.js.map +0 -1
  263. package/dist/lib/services/feature-toggle-service-v2.js.map +0 -1
@@ -10,34 +10,65 @@ const db_error_1 = require("../error/db-error");
10
10
  const feature_schema_1 = require("../schema/feature-schema");
11
11
  const events_1 = require("../types/events");
12
12
  const notfound_error_1 = __importDefault(require("../error/notfound-error"));
13
+ const model_1 = require("../types/model");
13
14
  const constants_1 = require("../util/constants");
14
15
  const fast_json_patch_1 = require("fast-json-patch");
15
- class FeatureToggleServiceV2 {
16
+ const operation_denied_error_1 = require("../error/operation-denied-error");
17
+ class FeatureToggleService {
16
18
  constructor({ featureStrategiesStore, featureToggleStore, featureToggleClientStore, projectStore, eventStore, featureTagStore, featureEnvironmentStore, }, { getLogger }) {
17
19
  this.logger = getLogger('services/feature-toggle-service-v2.ts');
18
20
  this.featureStrategiesStore = featureStrategiesStore;
19
21
  this.featureToggleStore = featureToggleStore;
20
22
  this.featureToggleClientStore = featureToggleClientStore;
21
- this.featureTagStore = featureTagStore;
23
+ this.tagStore = featureTagStore;
22
24
  this.projectStore = projectStore;
23
25
  this.eventStore = eventStore;
24
26
  this.featureEnvironmentStore = featureEnvironmentStore;
25
27
  }
26
- async patchFeature(projectId, featureName, userName, operations) {
28
+ async validateFeatureContext({ featureName, projectId, }) {
29
+ const id = await this.featureToggleStore.getProjectId(featureName);
30
+ if (id !== projectId) {
31
+ throw new invalid_operation_error_1.default('You can not change the projectId for an activation strategy.');
32
+ }
33
+ }
34
+ validateFeatureStrategyContext(strategy, { featureName, projectId }) {
35
+ if (strategy.projectId !== projectId) {
36
+ throw new invalid_operation_error_1.default('You can not change the projectId for an activation strategy.');
37
+ }
38
+ if (strategy.featureName !== featureName) {
39
+ throw new invalid_operation_error_1.default('You can not change the featureName for an activation strategy.');
40
+ }
41
+ }
42
+ async patchFeature(project, featureName, createdBy, operations) {
27
43
  const featureToggle = await this.getFeatureMetadata(featureName);
44
+ if (operations.some((op) => op.path.indexOf('/variants') >= 0)) {
45
+ throw new operation_denied_error_1.OperationDeniedError(`Changing variants is done via PATCH operation to /api/admin/projects/:project/features/:feature/variants`);
46
+ }
28
47
  const { newDocument } = (0, fast_json_patch_1.applyPatch)((0, fast_json_patch_1.deepClone)(featureToggle), operations);
29
- const updated = await this.updateFeatureToggle(projectId, newDocument, userName);
48
+ const updated = await this.updateFeatureToggle(project, newDocument, createdBy);
30
49
  if (featureToggle.stale !== newDocument.stale) {
31
- await this.eventStore.store({
32
- type: newDocument.stale ? events_1.FEATURE_STALE_ON : events_1.FEATURE_STALE_OFF,
33
- data: updated,
34
- project: projectId,
35
- createdBy: userName,
36
- });
50
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
51
+ await this.eventStore.store(new events_1.FeatureStaleEvent({
52
+ stale: newDocument.stale,
53
+ project,
54
+ featureName,
55
+ createdBy,
56
+ tags,
57
+ }));
37
58
  }
38
59
  return updated;
39
60
  }
40
- async createStrategy(strategyConfig, projectId, featureName, userName, environment = constants_1.DEFAULT_ENV) {
61
+ featureStrategyToPublic(featureStrategy) {
62
+ return {
63
+ id: featureStrategy.id,
64
+ name: featureStrategy.strategyName,
65
+ constraints: featureStrategy.constraints || [],
66
+ parameters: featureStrategy.parameters,
67
+ };
68
+ }
69
+ async createStrategy(strategyConfig, context, createdBy) {
70
+ const { featureName, projectId, environment } = context;
71
+ await this.validateFeatureContext(context);
41
72
  try {
42
73
  const newFeatureStrategy = await this.featureStrategiesStore.createStrategyFeatureEnv({
43
74
  strategyName: strategyConfig.name,
@@ -48,24 +79,17 @@ class FeatureToggleServiceV2 {
48
79
  featureName,
49
80
  environment,
50
81
  });
51
- const data = {
52
- id: newFeatureStrategy.id,
53
- name: newFeatureStrategy.strategyName,
54
- constraints: newFeatureStrategy.constraints,
55
- parameters: newFeatureStrategy.parameters,
56
- };
57
- await this.eventStore.store({
58
- type: events_1.FEATURE_STRATEGY_ADD,
82
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
83
+ const strategy = this.featureStrategyToPublic(newFeatureStrategy);
84
+ await this.eventStore.store(new events_1.FeatureStrategyAddEvent({
59
85
  project: projectId,
60
- createdBy: userName,
86
+ featureName,
87
+ createdBy,
61
88
  environment,
62
- data: {
63
- ...data,
64
- name: featureName,
65
- strategyName: newFeatureStrategy.strategyName,
66
- },
67
- });
68
- return data;
89
+ data: strategy,
90
+ tags,
91
+ }));
92
+ return strategy;
69
93
  }
70
94
  catch (e) {
71
95
  if (e.code === db_error_1.FOREIGN_KEY_VIOLATION) {
@@ -81,49 +105,51 @@ class FeatureToggleServiceV2 {
81
105
  * }
82
106
  * @param id
83
107
  * @param updates
108
+ * @param context - Which context does this strategy live in (projectId, featureName, environment)
109
+ * @param userName - Human readable id of the user performing the update
84
110
  */
85
- // TODO: verify projectId is not changed from URL!
86
- async updateStrategy(id, environment, project, userName, updates) {
111
+ async updateStrategy(id, updates, context, userName) {
112
+ const { projectId, environment, featureName } = context;
87
113
  const existingStrategy = await this.featureStrategiesStore.get(id);
114
+ this.validateFeatureStrategyContext(existingStrategy, context);
88
115
  if (existingStrategy.id === id) {
89
116
  const strategy = await this.featureStrategiesStore.updateStrategy(id, updates);
90
- const data = {
91
- id: strategy.id,
92
- name: strategy.strategyName,
93
- featureName: strategy.featureName,
94
- constraints: strategy.constraints || [],
95
- parameters: strategy.parameters,
96
- };
97
- await this.eventStore.store({
98
- type: events_1.FEATURE_STRATEGY_UPDATE,
99
- project,
117
+ // Store event!
118
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
119
+ const data = this.featureStrategyToPublic(strategy);
120
+ const preData = this.featureStrategyToPublic(existingStrategy);
121
+ await this.eventStore.store(new events_1.FeatureStrategyUpdateEvent({
122
+ project: projectId,
123
+ featureName,
100
124
  environment,
101
125
  createdBy: userName,
102
126
  data,
103
- });
127
+ preData,
128
+ tags,
129
+ }));
104
130
  return data;
105
131
  }
106
132
  throw new notfound_error_1.default(`Could not find strategy with id ${id}`);
107
133
  }
108
- // TODO: verify projectId is not changed from URL!
109
- async updateStrategyParameter(id, name, value, userName, project, environment) {
134
+ async updateStrategyParameter(id, name, value, context, userName) {
135
+ const { projectId, environment, featureName } = context;
110
136
  const existingStrategy = await this.featureStrategiesStore.get(id);
137
+ this.validateFeatureStrategyContext(existingStrategy, context);
111
138
  if (existingStrategy.id === id) {
112
139
  existingStrategy.parameters[name] = value;
113
140
  const strategy = await this.featureStrategiesStore.updateStrategy(id, existingStrategy);
114
- const data = {
115
- id: strategy.id,
116
- name: strategy.strategyName,
117
- constraints: strategy.constraints || [],
118
- parameters: strategy.parameters,
119
- };
120
- await this.eventStore.store({
121
- type: events_1.FEATURE_STRATEGY_UPDATE,
122
- project,
141
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
142
+ const data = this.featureStrategyToPublic(strategy);
143
+ const preData = this.featureStrategyToPublic(existingStrategy);
144
+ await this.eventStore.store(new events_1.FeatureStrategyUpdateEvent({
145
+ featureName,
146
+ project: projectId,
123
147
  environment,
124
148
  createdBy: userName,
125
149
  data,
126
- });
150
+ preData,
151
+ tags,
152
+ }));
127
153
  return data;
128
154
  }
129
155
  throw new notfound_error_1.default(`Could not find strategy with id ${id}`);
@@ -134,23 +160,24 @@ class FeatureToggleServiceV2 {
134
160
  *
135
161
  * }
136
162
  * @param id - strategy id
137
- * @param featureName - Name of the feature the strategy belongs to
138
- * @param userName - Who's doing the change
139
- * @param project - Which project does this feature toggle belong to
163
+ * @param context - Which context does this strategy live in (projectId, featureName, environment)
140
164
  * @param environment - Which environment does this strategy belong to
141
165
  */
142
- async deleteStrategy(id, featureName, userName, project = 'default', environment = constants_1.DEFAULT_ENV) {
166
+ async deleteStrategy(id, context, createdBy) {
167
+ const existingStrategy = await this.featureStrategiesStore.get(id);
168
+ const { featureName, projectId, environment } = context;
169
+ this.validateFeatureStrategyContext(existingStrategy, context);
143
170
  await this.featureStrategiesStore.delete(id);
144
- await this.eventStore.store({
145
- type: events_1.FEATURE_STRATEGY_REMOVE,
146
- project,
171
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
172
+ const preData = this.featureStrategyToPublic(existingStrategy);
173
+ await this.eventStore.store(new events_1.FeatureStrategyRemoveEvent({
174
+ featureName,
175
+ project: projectId,
147
176
  environment,
148
- createdBy: userName,
149
- data: {
150
- id,
151
- name: featureName,
152
- },
153
- });
177
+ createdBy,
178
+ preData,
179
+ tags,
180
+ }));
154
181
  // If there are no strategies left for environment disable it
155
182
  await this.featureEnvironmentStore.disableEnvironmentIfNoStrategies(featureName, environment);
156
183
  }
@@ -176,6 +203,14 @@ class FeatureToggleServiceV2 {
176
203
  async getFeature(featureName, archived = false) {
177
204
  return this.featureStrategiesStore.getFeatureToggleWithEnvs(featureName, archived);
178
205
  }
206
+ /**
207
+ * GET /api/admin/projects/:project/features/:featureName/variants
208
+ * @param featureName
209
+ * @return The list of variants
210
+ */
211
+ async getVariants(featureName) {
212
+ return this.featureToggleStore.getVariants(featureName);
213
+ }
179
214
  async getFeatureMetadata(featureName) {
180
215
  return this.featureToggleStore.get(featureName);
181
216
  }
@@ -202,21 +237,29 @@ class FeatureToggleServiceV2 {
202
237
  async getFeatureToggle(featureName) {
203
238
  return this.featureStrategiesStore.getFeatureToggleWithEnvs(featureName, false);
204
239
  }
205
- async createFeatureToggle(projectId, value, userName) {
206
- this.logger.info(`${userName} creates feature toggle ${value.name}`);
240
+ async createFeatureToggle(projectId, value, createdBy, isValidated = false) {
241
+ this.logger.info(`${createdBy} creates feature toggle ${value.name}`);
207
242
  await this.validateName(value.name);
208
243
  const exists = await this.projectStore.hasProject(projectId);
209
244
  if (exists) {
210
- const featureData = await feature_schema_1.featureMetadataSchema.validateAsync(value);
245
+ let featureData;
246
+ if (isValidated) {
247
+ featureData = value;
248
+ }
249
+ else {
250
+ featureData = await feature_schema_1.featureMetadataSchema.validateAsync(value);
251
+ }
252
+ const featureName = featureData.name;
211
253
  const createdToggle = await this.featureToggleStore.create(projectId, featureData);
212
- await this.featureEnvironmentStore.connectFeatureToEnvironmentsForProject(featureData.name, projectId);
213
- const data = { ...featureData, project: projectId };
214
- await this.eventStore.store({
215
- type: events_1.FEATURE_CREATED,
216
- createdBy: userName,
254
+ await this.featureEnvironmentStore.connectFeatureToEnvironmentsForProject(featureName, projectId);
255
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
256
+ await this.eventStore.store(new events_1.FeatureCreatedEvent({
257
+ featureName,
258
+ createdBy,
217
259
  project: projectId,
218
- data,
219
- });
260
+ data: createdToggle,
261
+ tags,
262
+ }));
220
263
  return createdToggle;
221
264
  }
222
265
  throw new notfound_error_1.default(`Project with id ${projectId} does not exist`);
@@ -235,7 +278,11 @@ class FeatureToggleServiceV2 {
235
278
  s.parameters.groupId = newFeatureName;
236
279
  }
237
280
  delete s.id;
238
- createStrategies.push(this.createStrategy(s, projectId, newFeatureName, userName, e.name));
281
+ createStrategies.push(this.createStrategy(s, {
282
+ projectId,
283
+ featureName: newFeatureName,
284
+ environment: e.name,
285
+ }, userName));
239
286
  }));
240
287
  // Create strategies
241
288
  await Promise.allSettled(createStrategies);
@@ -245,15 +292,17 @@ class FeatureToggleServiceV2 {
245
292
  const featureName = updatedFeature.name;
246
293
  this.logger.info(`${userName} updates feature toggle ${featureName}`);
247
294
  const featureData = await feature_schema_1.featureMetadataSchema.validateAsync(updatedFeature);
295
+ const preData = await this.featureToggleStore.get(featureName);
248
296
  const featureToggle = await this.featureToggleStore.update(projectId, featureData);
249
- const tags = await this.featureTagStore.getAllTagsForFeature(featureName);
250
- await this.eventStore.store({
251
- type: events_1.FEATURE_METADATA_UPDATED,
297
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
298
+ await this.eventStore.store(new events_1.FeatureMetadataUpdateEvent({
252
299
  createdBy: userName,
253
300
  data: featureToggle,
301
+ preData,
302
+ featureName,
254
303
  project: projectId,
255
304
  tags,
256
- });
305
+ }));
257
306
  return featureToggle;
258
307
  }
259
308
  async getFeatureCountForProject(projectId) {
@@ -284,6 +333,7 @@ class FeatureToggleServiceV2 {
284
333
  strategies,
285
334
  };
286
335
  }
336
+ // todo: store events for this change.
287
337
  async deleteEnvironment(projectId, environment) {
288
338
  await this.featureStrategiesStore.deleteConfigurationsForProjectAndEnvironment(projectId, environment);
289
339
  await this.projectStore.deleteEnvironmentForProject(projectId, environment);
@@ -310,38 +360,38 @@ class FeatureToggleServiceV2 {
310
360
  async hasFeature(name) {
311
361
  return this.featureToggleStore.exists(name);
312
362
  }
313
- async updateStale(featureName, isStale, userName) {
363
+ async updateStale(featureName, isStale, createdBy) {
314
364
  const feature = await this.featureToggleStore.get(featureName);
365
+ const { project } = feature;
315
366
  feature.stale = isStale;
316
- await this.featureToggleStore.update(feature.project, feature);
317
- const tags = await this.featureTagStore.getAllTagsForFeature(featureName);
318
- const data = await this.getFeatureToggleLegacy(featureName);
319
- await this.eventStore.store({
320
- type: isStale ? events_1.FEATURE_STALE_ON : events_1.FEATURE_STALE_OFF,
321
- createdBy: userName,
322
- data,
367
+ await this.featureToggleStore.update(project, feature);
368
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
369
+ await this.eventStore.store(new events_1.FeatureStaleEvent({
370
+ stale: isStale,
371
+ project,
372
+ featureName,
373
+ createdBy,
323
374
  tags,
324
- project: feature.project,
325
- });
375
+ }));
326
376
  return feature;
327
377
  }
328
- async archiveToggle(name, userName) {
329
- const feature = await this.featureToggleStore.get(name);
330
- await this.featureToggleStore.archive(name);
331
- const tags = (await this.featureTagStore.getAllTagsForFeature(name)) || [];
332
- await this.eventStore.store({
333
- type: events_1.FEATURE_ARCHIVED,
334
- createdBy: userName,
335
- data: { name },
378
+ // todo: add projectId
379
+ async archiveToggle(featureName, createdBy) {
380
+ const feature = await this.featureToggleStore.get(featureName);
381
+ await this.featureToggleStore.archive(featureName);
382
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
383
+ await this.eventStore.store(new events_1.FeatureArchivedEvent({
384
+ featureName,
385
+ createdBy,
336
386
  project: feature.project,
337
387
  tags,
338
- });
388
+ }));
339
389
  }
340
- async updateEnabled(projectId, featureName, environment, enabled, userName) {
390
+ async updateEnabled(project, featureName, environment, enabled, createdBy) {
341
391
  const hasEnvironment = await this.featureEnvironmentStore.featureHasEnvironment(environment, featureName);
342
392
  if (hasEnvironment) {
343
393
  if (enabled) {
344
- const strategies = await this.getStrategiesForEnvironment(projectId, featureName, environment);
394
+ const strategies = await this.getStrategiesForEnvironment(project, featureName, environment);
345
395
  if (strategies.length === 0) {
346
396
  throw new invalid_operation_error_1.default('You can not enable the environment before it has strategies');
347
397
  }
@@ -349,28 +399,30 @@ class FeatureToggleServiceV2 {
349
399
  const updatedEnvironmentStatus = await this.featureEnvironmentStore.setEnvironmentEnabledStatus(environment, featureName, enabled);
350
400
  const feature = await this.featureToggleStore.get(featureName);
351
401
  if (updatedEnvironmentStatus > 0) {
352
- const tags = await this.featureTagStore.getAllTagsForFeature(featureName);
353
- await this.eventStore.store({
354
- type: enabled
355
- ? events_1.FEATURE_ENVIRONMENT_ENABLED
356
- : events_1.FEATURE_ENVIRONMENT_DISABLED,
357
- createdBy: userName,
358
- data: { name: featureName },
359
- tags,
360
- project: projectId,
402
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
403
+ await this.eventStore.store(new events_1.FeatureEnvironmentEvent({
404
+ enabled,
405
+ project,
406
+ featureName,
361
407
  environment,
362
- });
408
+ createdBy,
409
+ tags,
410
+ }));
363
411
  }
364
412
  return feature;
365
413
  }
366
414
  throw new notfound_error_1.default(`Could not find environment ${environment} for feature: ${featureName}`);
367
415
  }
368
- async storeFeatureUpdatedEventLegacy(featureName, userName) {
369
- const tags = await this.featureTagStore.getAllTagsForFeature(featureName);
416
+ // @deprecated
417
+ async storeFeatureUpdatedEventLegacy(featureName, createdBy) {
418
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
370
419
  const feature = await this.getFeatureToggleLegacy(featureName);
420
+ // Legacy event. Will not be used from v4.3.
421
+ // We do not include 'preData' on purpose.
371
422
  await this.eventStore.store({
372
423
  type: events_1.FEATURE_UPDATED,
373
- createdBy: userName,
424
+ createdBy,
425
+ featureName,
374
426
  data: feature,
375
427
  tags,
376
428
  project: feature.project,
@@ -383,6 +435,7 @@ class FeatureToggleServiceV2 {
383
435
  const isEnabled = await this.featureEnvironmentStore.isEnvironmentEnabled(featureName, environment);
384
436
  return this.updateEnabled(projectId, featureName, environment, !isEnabled, userName);
385
437
  }
438
+ // @deprecated
386
439
  async getFeatureToggleLegacy(featureName) {
387
440
  const feature = await this.featureStrategiesStore.getFeatureToggleWithEnvs(featureName);
388
441
  const { environments, ...legacyFeature } = feature;
@@ -391,47 +444,46 @@ class FeatureToggleServiceV2 {
391
444
  const enabled = defaultEnv?.enabled || false;
392
445
  return { ...legacyFeature, enabled, strategies };
393
446
  }
394
- async changeProject(featureName, newProject, userName) {
447
+ async changeProject(featureName, newProject, createdBy) {
395
448
  const feature = await this.featureToggleStore.get(featureName);
396
449
  const oldProject = feature.project;
397
450
  feature.project = newProject;
398
451
  await this.featureToggleStore.update(newProject, feature);
399
- const tags = await this.featureTagStore.getAllTagsForFeature(featureName);
400
- await this.eventStore.store({
401
- type: events_1.FEATURE_PROJECT_CHANGE,
402
- createdBy: userName,
403
- data: {
404
- name: feature.name,
405
- oldProject,
406
- newProject,
407
- },
408
- project: newProject,
452
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
453
+ await this.eventStore.store(new events_1.FeatureChangeProjectEvent({
454
+ createdBy,
455
+ oldProject,
456
+ newProject,
457
+ featureName,
409
458
  tags,
410
- });
459
+ }));
411
460
  }
412
461
  async getArchivedFeatures() {
413
462
  return this.getFeatureToggles({}, true);
414
463
  }
415
- async deleteFeature(featureName, userName) {
464
+ // TODO: add project id.
465
+ async deleteFeature(featureName, createdBy) {
466
+ const toggle = await this.featureToggleStore.get(featureName);
467
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
416
468
  await this.featureToggleStore.delete(featureName);
417
- await this.eventStore.store({
418
- type: events_1.FEATURE_DELETED,
419
- createdBy: userName,
420
- data: {
421
- featureName,
422
- },
423
- });
469
+ await this.eventStore.store(new events_1.FeatureDeletedEvent({
470
+ featureName,
471
+ project: toggle.project,
472
+ createdBy,
473
+ preData: toggle,
474
+ tags,
475
+ }));
424
476
  }
425
- async reviveToggle(featureName, userName) {
426
- const data = await this.featureToggleStore.revive(featureName);
427
- const tags = await this.featureTagStore.getAllTagsForFeature(featureName);
428
- await this.eventStore.store({
429
- type: events_1.FEATURE_REVIVED,
430
- createdBy: userName,
431
- data,
432
- project: data.project,
477
+ // TODO: add project id.
478
+ async reviveToggle(featureName, createdBy) {
479
+ const toggle = await this.featureToggleStore.revive(featureName);
480
+ const tags = await this.tagStore.getAllTagsForFeature(featureName);
481
+ await this.eventStore.store(new events_1.FeatureRevivedEvent({
482
+ createdBy,
483
+ featureName,
484
+ project: toggle.project,
433
485
  tags,
434
- });
486
+ }));
435
487
  }
436
488
  async getMetadataForAllFeatures(archived) {
437
489
  return this.featureToggleStore.getAll({ archived });
@@ -442,7 +494,42 @@ class FeatureToggleServiceV2 {
442
494
  async updateFeatureStrategyProject(featureName, newProjectId) {
443
495
  await this.featureStrategiesStore.setProjectForStrategiesBelongingToFeature(featureName, newProjectId);
444
496
  }
497
+ async updateVariants(featureName, newVariants) {
498
+ const oldVariants = await this.getVariants(featureName);
499
+ const { newDocument } = await (0, fast_json_patch_1.applyPatch)(oldVariants, newVariants);
500
+ return this.saveVariants(featureName, newDocument);
501
+ }
502
+ async saveVariants(featureName, newVariants) {
503
+ await feature_schema_1.variantsArraySchema.validateAsync(newVariants);
504
+ const fixedVariants = this.fixVariantWeights(newVariants);
505
+ return this.featureToggleStore.saveVariants(featureName, fixedVariants);
506
+ }
507
+ fixVariantWeights(variants) {
508
+ let variableVariants = variants.filter((x) => {
509
+ return x.weightType === model_1.WeightType.VARIABLE;
510
+ });
511
+ if (variants.length > 0 && variableVariants.length === 0) {
512
+ throw new bad_data_error_1.default('There must be at least one "variable" variant');
513
+ }
514
+ let fixedVariants = variants.filter((x) => {
515
+ return x.weightType === model_1.WeightType.FIX;
516
+ });
517
+ let fixedWeights = fixedVariants.reduce((a, v) => a + v.weight, 0);
518
+ if (fixedWeights > 1000) {
519
+ throw new bad_data_error_1.default('The traffic distribution total must equal 100%');
520
+ }
521
+ let averageWeight = Math.floor((1000 - fixedWeights) / variableVariants.length);
522
+ let remainder = (1000 - fixedWeights) % variableVariants.length;
523
+ variableVariants = variableVariants.map((x) => {
524
+ x.weight = averageWeight;
525
+ if (remainder > 0) {
526
+ x.weight += 1;
527
+ remainder--;
528
+ }
529
+ return x;
530
+ });
531
+ return variableVariants.concat(fixedVariants);
532
+ }
445
533
  }
446
- module.exports = FeatureToggleServiceV2;
447
- exports.default = FeatureToggleServiceV2;
448
- //# sourceMappingURL=feature-toggle-service-v2.js.map
534
+ exports.default = FeatureToggleService;
535
+ //# 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,10 +25,11 @@ 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 feature_toggle_service_v2_1 = __importDefault(require("./feature-toggle-service-v2"));
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"));
32
+ const user_splash_service_1 = __importDefault(require("./user-splash-service"));
32
33
  const createServices = (stores, config) => {
33
34
  const accessService = new access_service_1.AccessService(stores, config);
34
35
  const apiTokenService = new api_token_service_1.ApiTokenService(stores, config);
@@ -56,14 +57,16 @@ const createServices = (stores, config) => {
56
57
  const versionService = new version_service_1.default(stores, config);
57
58
  const healthService = new health_service_1.default(stores, config);
58
59
  const userFeedbackService = new user_feedback_service_1.default(stores, config);
59
- const featureToggleServiceV2 = new feature_toggle_service_v2_1.default(stores, config);
60
+ const featureToggleServiceV2 = new feature_toggle_service_1.default(stores, config);
60
61
  const environmentService = new environment_service_1.default(stores, config);
61
62
  const featureTagService = new feature_tag_service_1.default(stores, config);
62
63
  const projectHealthService = new project_health_service_1.default(stores, config, featureToggleServiceV2);
63
64
  const projectService = new project_service_1.default(stores, config, accessService, featureToggleServiceV2);
65
+ const userSplashService = new user_splash_service_1.default(stores, config);
64
66
  return {
65
67
  accessService,
66
68
  addonService,
69
+ featureToggleService: featureToggleServiceV2,
67
70
  featureToggleServiceV2,
68
71
  featureTypeService,
69
72
  healthService,
@@ -87,6 +90,7 @@ const createServices = (stores, config) => {
87
90
  userFeedbackService,
88
91
  featureTagService,
89
92
  projectHealthService,
93
+ userSplashService,
90
94
  };
91
95
  };
92
96
  exports.createServices = createServices;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":"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"}