unleash-server 5.4.3 → 5.5.0

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 (586) hide show
  1. package/README.md +5 -3
  2. package/dist/lib/addons/addon-schema.js +2 -1
  3. package/dist/lib/addons/addon-schema.js.map +1 -1
  4. package/dist/lib/addons/datadog-definition.js +22 -7
  5. package/dist/lib/addons/datadog-definition.js.map +1 -1
  6. package/dist/lib/addons/datadog.d.ts +7 -1
  7. package/dist/lib/addons/datadog.js +16 -3
  8. package/dist/lib/addons/datadog.js.map +1 -1
  9. package/dist/lib/addons/datadog.test.js +62 -0
  10. package/dist/lib/addons/datadog.test.js.map +1 -1
  11. package/dist/lib/addons/index.js +3 -11
  12. package/dist/lib/addons/index.js.map +1 -1
  13. package/dist/lib/addons/slack-app-definition.js +5 -24
  14. package/dist/lib/addons/slack-app-definition.js.map +1 -1
  15. package/dist/lib/addons/slack-app.d.ts +0 -1
  16. package/dist/lib/addons/slack-app.js +5 -17
  17. package/dist/lib/addons/slack-app.js.map +1 -1
  18. package/dist/lib/addons/slack-app.test.js +39 -25
  19. package/dist/lib/addons/slack-app.test.js.map +1 -1
  20. package/dist/lib/addons/slack-definition.js +11 -4
  21. package/dist/lib/addons/slack-definition.js.map +1 -1
  22. package/dist/lib/addons/teams-definition.js +5 -4
  23. package/dist/lib/addons/teams-definition.js.map +1 -1
  24. package/dist/lib/addons/webhook-definition.js +10 -12
  25. package/dist/lib/addons/webhook-definition.js.map +1 -1
  26. package/dist/lib/create-config.js +13 -1
  27. package/dist/lib/create-config.js.map +1 -1
  28. package/dist/lib/create-config.test.js +14 -0
  29. package/dist/lib/create-config.test.js.map +1 -1
  30. package/dist/lib/db/access-store.d.ts +23 -5
  31. package/dist/lib/db/access-store.js +263 -17
  32. package/dist/lib/db/access-store.js.map +1 -1
  33. package/dist/lib/db/access-store.test.js +83 -0
  34. package/dist/lib/db/access-store.test.js.map +1 -0
  35. package/dist/lib/db/client-applications-store.d.ts +1 -3
  36. package/dist/lib/db/client-applications-store.js +13 -24
  37. package/dist/lib/db/client-applications-store.js.map +1 -1
  38. package/dist/lib/db/event-store.js +1 -0
  39. package/dist/lib/db/event-store.js.map +1 -1
  40. package/dist/lib/db/feature-toggle-client-store.js +17 -4
  41. package/dist/lib/db/feature-toggle-client-store.js.map +1 -1
  42. package/dist/lib/db/feature-toggle-store.js +1 -1
  43. package/dist/lib/db/feature-toggle-store.js.map +1 -1
  44. package/dist/lib/db/group-store.d.ts +4 -2
  45. package/dist/lib/db/group-store.js +24 -0
  46. package/dist/lib/db/group-store.js.map +1 -1
  47. package/dist/lib/db/index.d.ts +1 -2
  48. package/dist/lib/db/index.js +5 -1
  49. package/dist/lib/db/index.js.map +1 -1
  50. package/dist/lib/db/project-stats-store.d.ts +2 -0
  51. package/dist/lib/db/project-stats-store.js +27 -0
  52. package/dist/lib/db/project-stats-store.js.map +1 -1
  53. package/dist/lib/db/project-store.d.ts +7 -1
  54. package/dist/lib/db/project-store.js +34 -1
  55. package/dist/lib/db/project-store.js.map +1 -1
  56. package/dist/lib/error/bad-data-error.d.ts +1 -1
  57. package/dist/lib/error/index.d.ts +2 -1
  58. package/dist/lib/error/index.js +3 -1
  59. package/dist/lib/error/index.js.map +1 -1
  60. package/dist/lib/error/pattern-error.d.ts +10 -0
  61. package/dist/lib/error/pattern-error.js +20 -0
  62. package/dist/lib/error/pattern-error.js.map +1 -0
  63. package/dist/lib/features/dependent-features/createDependentFeaturesService.d.ts +3 -0
  64. package/dist/lib/features/dependent-features/createDependentFeaturesService.js +11 -0
  65. package/dist/lib/features/dependent-features/createDependentFeaturesService.js.map +1 -0
  66. package/dist/lib/features/dependent-features/dependent-features-controller.d.ts +28 -0
  67. package/dist/lib/features/dependent-features/dependent-features-controller.js +151 -0
  68. package/dist/lib/features/dependent-features/dependent-features-controller.js.map +1 -0
  69. package/dist/lib/features/dependent-features/dependent-features-service.d.ts +11 -0
  70. package/dist/lib/features/dependent-features/dependent-features-service.js +40 -0
  71. package/dist/lib/features/dependent-features/dependent-features-service.js.map +1 -0
  72. package/dist/lib/features/dependent-features/dependent-features-store-type.d.ts +8 -0
  73. package/dist/lib/features/dependent-features/dependent-features-store-type.js +3 -0
  74. package/dist/lib/features/dependent-features/dependent-features-store-type.js.map +1 -0
  75. package/dist/lib/features/dependent-features/dependent-features-store.d.ts +12 -0
  76. package/dist/lib/features/dependent-features/dependent-features-store.js +56 -0
  77. package/dist/lib/features/dependent-features/dependent-features-store.js.map +1 -0
  78. package/dist/lib/features/dependent-features/dependent-features.d.ts +14 -0
  79. package/dist/lib/features/dependent-features/dependent-features.js +3 -0
  80. package/dist/lib/features/dependent-features/dependent-features.js.map +1 -0
  81. package/dist/lib/features/dependent-features/dependent.features.e2e.test.d.ts +1 -0
  82. package/dist/lib/features/dependent-features/dependent.features.e2e.test.js +82 -0
  83. package/dist/lib/features/dependent-features/dependent.features.e2e.test.js.map +1 -0
  84. package/dist/lib/features/dependent-features/fake-dependent-features-store.d.ts +8 -0
  85. package/dist/lib/features/dependent-features/fake-dependent-features-store.js +22 -0
  86. package/dist/lib/features/dependent-features/fake-dependent-features-store.js.map +1 -0
  87. package/dist/lib/features/export-import-toggles/createExportImportService.js +6 -3
  88. package/dist/lib/features/export-import-toggles/createExportImportService.js.map +1 -1
  89. package/dist/lib/features/export-import-toggles/export-import-service.d.ts +9 -3
  90. package/dist/lib/features/export-import-toggles/export-import-service.js +51 -21
  91. package/dist/lib/features/export-import-toggles/export-import-service.js.map +1 -1
  92. package/dist/lib/features/export-import-toggles/export-import.e2e.test.js +120 -50
  93. package/dist/lib/features/export-import-toggles/export-import.e2e.test.js.map +1 -1
  94. package/dist/lib/features/export-import-toggles/import-permissions-service.d.ts +1 -2
  95. package/dist/lib/features/export-import-toggles/import-toggles-store-type.d.ts +6 -0
  96. package/dist/lib/features/export-import-toggles/import-toggles-store.d.ts +2 -1
  97. package/dist/lib/features/export-import-toggles/import-toggles-store.js +25 -0
  98. package/dist/lib/features/export-import-toggles/import-toggles-store.js.map +1 -1
  99. package/dist/lib/features/export-import-toggles/import-validation-messages.d.ts +18 -2
  100. package/dist/lib/features/export-import-toggles/import-validation-messages.js +27 -11
  101. package/dist/lib/features/export-import-toggles/import-validation-messages.js.map +1 -1
  102. package/dist/lib/features/feature-naming-pattern/feature-naming-validation.d.ts +14 -0
  103. package/dist/lib/features/feature-naming-pattern/feature-naming-validation.js +46 -0
  104. package/dist/lib/features/feature-naming-pattern/feature-naming-validation.js.map +1 -0
  105. package/dist/lib/features/feature-naming-pattern/feature-naming-validation.test.d.ts +1 -0
  106. package/dist/lib/features/feature-naming-pattern/feature-naming-validation.test.js +116 -0
  107. package/dist/lib/features/feature-naming-pattern/feature-naming-validation.test.js.map +1 -0
  108. package/dist/lib/features/feature-toggle/createFeatureToggleService.js +11 -2
  109. package/dist/lib/features/feature-toggle/createFeatureToggleService.js.map +1 -1
  110. package/dist/lib/features/instance-stats/getActiveUsers.d.ts +9 -0
  111. package/dist/lib/features/instance-stats/getActiveUsers.e2e.test.d.ts +1 -0
  112. package/dist/lib/features/instance-stats/getActiveUsers.e2e.test.js +141 -0
  113. package/dist/lib/features/instance-stats/getActiveUsers.e2e.test.js.map +1 -0
  114. package/dist/lib/features/instance-stats/getActiveUsers.js +33 -0
  115. package/dist/lib/features/instance-stats/getActiveUsers.js.map +1 -0
  116. package/dist/lib/{services → features/instance-stats}/instance-stats-service.d.ts +13 -7
  117. package/dist/lib/{services → features/instance-stats}/instance-stats-service.js +16 -7
  118. package/dist/lib/features/instance-stats/instance-stats-service.js.map +1 -0
  119. package/dist/lib/features/instance-stats/instance-stats-service.test.d.ts +1 -0
  120. package/dist/lib/{services → features/instance-stats}/instance-stats-service.test.js +6 -5
  121. package/dist/lib/features/instance-stats/instance-stats-service.test.js.map +1 -0
  122. package/dist/lib/features/playground/advanced-playground.test.js +2 -3
  123. package/dist/lib/features/playground/advanced-playground.test.js.map +1 -1
  124. package/dist/lib/features/playground/feature-evaluator/variant.d.ts +1 -1
  125. package/dist/lib/features/playground/generateObjectCombinations.d.ts +1 -1
  126. package/dist/lib/features/playground/generateObjectCombinations.js +14 -4
  127. package/dist/lib/features/playground/generateObjectCombinations.js.map +1 -1
  128. package/dist/lib/features/playground/generateObjectCombinations.test.js +21 -0
  129. package/dist/lib/features/playground/generateObjectCombinations.test.js.map +1 -1
  130. package/dist/lib/features/playground/playground-service.d.ts +5 -3
  131. package/dist/lib/features/playground/playground-service.js +18 -3
  132. package/dist/lib/features/playground/playground-service.js.map +1 -1
  133. package/dist/lib/features/playground/playground.d.ts +2 -1
  134. package/dist/lib/features/playground/playground.js +2 -1
  135. package/dist/lib/features/playground/playground.js.map +1 -1
  136. package/dist/lib/features/private-project/createPrivateProjectChecker.d.ts +5 -0
  137. package/dist/lib/features/private-project/createPrivateProjectChecker.js +22 -0
  138. package/dist/lib/features/private-project/createPrivateProjectChecker.js.map +1 -0
  139. package/dist/lib/features/private-project/fakePrivateProjectChecker.d.ts +7 -0
  140. package/dist/lib/features/private-project/fakePrivateProjectChecker.js +15 -0
  141. package/dist/lib/features/private-project/fakePrivateProjectChecker.js.map +1 -0
  142. package/dist/lib/features/private-project/privateProjectChecker.d.ts +10 -0
  143. package/dist/lib/features/private-project/privateProjectChecker.js +22 -0
  144. package/dist/lib/features/private-project/privateProjectChecker.js.map +1 -0
  145. package/dist/lib/features/private-project/privateProjectCheckerType.d.ts +5 -0
  146. package/dist/lib/features/private-project/privateProjectCheckerType.js +3 -0
  147. package/dist/lib/features/private-project/privateProjectCheckerType.js.map +1 -0
  148. package/dist/lib/features/private-project/privateProjectStore.d.ts +18 -0
  149. package/dist/lib/features/private-project/privateProjectStore.js +70 -0
  150. package/dist/lib/features/private-project/privateProjectStore.js.map +1 -0
  151. package/dist/lib/features/private-project/privateProjectStoreType.d.ts +4 -0
  152. package/dist/lib/features/private-project/privateProjectStoreType.js +3 -0
  153. package/dist/lib/features/private-project/privateProjectStoreType.js.map +1 -0
  154. package/dist/lib/features/project/createProjectService.js +5 -8
  155. package/dist/lib/features/project/createProjectService.js.map +1 -1
  156. package/dist/lib/features/segment/createSegmentService.js +5 -2
  157. package/dist/lib/features/segment/createSegmentService.js.map +1 -1
  158. package/dist/lib/features/segment/segment-controller.d.ts +39 -0
  159. package/dist/lib/features/segment/segment-controller.js +291 -0
  160. package/dist/lib/features/segment/segment-controller.js.map +1 -0
  161. package/dist/lib/metrics.d.ts +1 -1
  162. package/dist/lib/metrics.js +30 -1
  163. package/dist/lib/metrics.js.map +1 -1
  164. package/dist/lib/metrics.test.js +3 -2
  165. package/dist/lib/metrics.test.js.map +1 -1
  166. package/dist/lib/middleware/rbac-middleware.d.ts +2 -0
  167. package/dist/lib/middleware/rbac-middleware.js +2 -0
  168. package/dist/lib/middleware/rbac-middleware.js.map +1 -1
  169. package/dist/lib/middleware/secure-headers.js +18 -0
  170. package/dist/lib/middleware/secure-headers.js.map +1 -1
  171. package/dist/lib/openapi/index.js +13 -0
  172. package/dist/lib/openapi/index.js.map +1 -1
  173. package/dist/lib/openapi/meta-schema-rules.test.js +14 -4
  174. package/dist/lib/openapi/meta-schema-rules.test.js.map +1 -1
  175. package/dist/lib/openapi/spec/addon-type-schema.d.ts +6 -1
  176. package/dist/lib/openapi/spec/addon-type-schema.js +6 -1
  177. package/dist/lib/openapi/spec/addon-type-schema.js.map +1 -1
  178. package/dist/lib/openapi/spec/addons-schema.d.ts +8 -3
  179. package/dist/lib/openapi/spec/addons-schema.js +8 -3
  180. package/dist/lib/openapi/spec/addons-schema.js.map +1 -1
  181. package/dist/lib/openapi/spec/admin-segment-schema.d.ts +115 -0
  182. package/dist/lib/openapi/spec/admin-segment-schema.js +75 -0
  183. package/dist/lib/openapi/spec/admin-segment-schema.js.map +1 -0
  184. package/dist/lib/openapi/spec/admin-segment-schema.test.d.ts +1 -0
  185. package/dist/lib/openapi/spec/admin-segment-schema.test.js +39 -0
  186. package/dist/lib/openapi/spec/admin-segment-schema.test.js.map +1 -0
  187. package/dist/lib/openapi/spec/admin-strategies-schema.d.ts +46 -0
  188. package/dist/lib/openapi/spec/admin-strategies-schema.js +54 -0
  189. package/dist/lib/openapi/spec/admin-strategies-schema.js.map +1 -0
  190. package/dist/lib/openapi/spec/admin-strategies-schema.test.d.ts +1 -0
  191. package/dist/lib/openapi/spec/admin-strategies-schema.test.js +40 -0
  192. package/dist/lib/openapi/spec/admin-strategies-schema.test.js.map +1 -0
  193. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.d.ts +51 -6
  194. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.js +3 -1
  195. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.js.map +1 -1
  196. package/dist/lib/openapi/spec/advanced-playground-feature-schema.d.ts +101 -11
  197. package/dist/lib/openapi/spec/advanced-playground-feature-schema.js +2 -0
  198. package/dist/lib/openapi/spec/advanced-playground-feature-schema.js.map +1 -1
  199. package/dist/lib/openapi/spec/advanced-playground-request-schema.d.ts +1 -0
  200. package/dist/lib/openapi/spec/advanced-playground-response-schema.d.ts +203 -22
  201. package/dist/lib/openapi/spec/advanced-playground-response-schema.js +2 -0
  202. package/dist/lib/openapi/spec/advanced-playground-response-schema.js.map +1 -1
  203. package/dist/lib/openapi/spec/client-feature-schema.d.ts +41 -6
  204. package/dist/lib/openapi/spec/client-feature-schema.js +9 -0
  205. package/dist/lib/openapi/spec/client-feature-schema.js.map +1 -1
  206. package/dist/lib/openapi/spec/client-features-schema.d.ts +75 -12
  207. package/dist/lib/openapi/spec/client-features-schema.js +2 -0
  208. package/dist/lib/openapi/spec/client-features-schema.js.map +1 -1
  209. package/dist/lib/openapi/spec/context-field-strategies-schema.d.ts +1 -1
  210. package/dist/lib/openapi/spec/context-field-strategies-schema.js +1 -1
  211. package/dist/lib/openapi/spec/context-field-strategies-schema.js.map +1 -1
  212. package/dist/lib/openapi/spec/create-api-token-schema.d.ts +1 -139
  213. package/dist/lib/openapi/spec/create-api-token-schema.js +16 -20
  214. package/dist/lib/openapi/spec/create-api-token-schema.js.map +1 -1
  215. package/dist/lib/openapi/spec/create-dependent-feature-schema.d.ts +29 -0
  216. package/dist/lib/openapi/spec/create-dependent-feature-schema.js +31 -0
  217. package/dist/lib/openapi/spec/create-dependent-feature-schema.js.map +1 -0
  218. package/dist/lib/openapi/spec/create-feature-naming-pattern-schema.d.ts +29 -0
  219. package/dist/lib/openapi/spec/create-feature-naming-pattern-schema.js +33 -0
  220. package/dist/lib/openapi/spec/create-feature-naming-pattern-schema.js.map +1 -0
  221. package/dist/lib/openapi/spec/create-feature-strategy-schema.d.ts +2 -2
  222. package/dist/lib/openapi/spec/create-strategy-schema.d.ts +15 -0
  223. package/dist/lib/openapi/spec/create-strategy-schema.js +15 -0
  224. package/dist/lib/openapi/spec/create-strategy-schema.js.map +1 -1
  225. package/dist/lib/openapi/spec/create-strategy-variant-schema.d.ts +2 -2
  226. package/dist/lib/openapi/spec/create-strategy-variant-schema.js +2 -2
  227. package/dist/lib/openapi/spec/create-strategy-variant-schema.js.map +1 -1
  228. package/dist/lib/openapi/spec/dependent-feature-schema.d.ts +30 -0
  229. package/dist/lib/openapi/spec/dependent-feature-schema.js +14 -0
  230. package/dist/lib/openapi/spec/dependent-feature-schema.js.map +1 -0
  231. package/dist/lib/openapi/spec/dora-features-schema.d.ts +20 -0
  232. package/dist/lib/openapi/spec/dora-features-schema.js +22 -0
  233. package/dist/lib/openapi/spec/dora-features-schema.js.map +1 -0
  234. package/dist/lib/openapi/spec/environment-project-schema.d.ts +4 -4
  235. package/dist/lib/openapi/spec/environments-project-schema.d.ts +4 -4
  236. package/dist/lib/openapi/spec/event-schema.d.ts +3 -3
  237. package/dist/lib/openapi/spec/events-schema.d.ts +3 -3
  238. package/dist/lib/openapi/spec/export-query-schema.d.ts +22 -15
  239. package/dist/lib/openapi/spec/export-query-schema.js +16 -15
  240. package/dist/lib/openapi/spec/export-query-schema.js.map +1 -1
  241. package/dist/lib/openapi/spec/export-result-schema.d.ts +26 -26
  242. package/dist/lib/openapi/spec/feature-environment-schema.d.ts +6 -6
  243. package/dist/lib/openapi/spec/feature-events-schema.d.ts +3 -3
  244. package/dist/lib/openapi/spec/feature-schema.d.ts +12 -12
  245. package/dist/lib/openapi/spec/feature-strategy-schema.d.ts +2 -2
  246. package/dist/lib/openapi/spec/feature-variants-schema.d.ts +2 -2
  247. package/dist/lib/openapi/spec/features-schema.d.ts +24 -24
  248. package/dist/lib/openapi/spec/health-overview-schema.d.ts +63 -33
  249. package/dist/lib/openapi/spec/health-overview-schema.js +6 -1
  250. package/dist/lib/openapi/spec/health-overview-schema.js.map +1 -1
  251. package/dist/lib/openapi/spec/health-report-schema.d.ts +63 -33
  252. package/dist/lib/openapi/spec/import-toggles-schema.d.ts +52 -52
  253. package/dist/lib/openapi/spec/index.d.ts +9 -0
  254. package/dist/lib/openapi/spec/index.js +9 -0
  255. package/dist/lib/openapi/spec/index.js.map +1 -1
  256. package/dist/lib/openapi/spec/instance-admin-stats-schema.d.ts +42 -0
  257. package/dist/lib/openapi/spec/instance-admin-stats-schema.js +42 -0
  258. package/dist/lib/openapi/spec/instance-admin-stats-schema.js.map +1 -1
  259. package/dist/lib/openapi/spec/parent-feature-options-schema.d.ts +11 -0
  260. package/dist/lib/openapi/spec/parent-feature-options-schema.js +13 -0
  261. package/dist/lib/openapi/spec/parent-feature-options-schema.js.map +1 -0
  262. package/dist/lib/openapi/spec/playground-feature-schema.d.ts +5 -5
  263. package/dist/lib/openapi/spec/playground-request-schema.d.ts +1 -0
  264. package/dist/lib/openapi/spec/playground-response-schema.d.ts +12 -10
  265. package/dist/lib/openapi/spec/playground-strategy-schema.d.ts +4 -4
  266. package/dist/lib/openapi/spec/playground-strategy-schema.js +1 -1
  267. package/dist/lib/openapi/spec/playground-strategy-schema.js.map +1 -1
  268. package/dist/lib/openapi/spec/profile-schema.d.ts +12 -12
  269. package/dist/lib/openapi/spec/project-dora-metrics-schema.d.ts +44 -0
  270. package/dist/lib/openapi/spec/project-dora-metrics-schema.js +28 -0
  271. package/dist/lib/openapi/spec/project-dora-metrics-schema.js.map +1 -0
  272. package/dist/lib/openapi/spec/project-environment-schema.d.ts +4 -4
  273. package/dist/lib/openapi/spec/project-overview-schema.d.ts +63 -33
  274. package/dist/lib/openapi/spec/project-overview-schema.js +6 -1
  275. package/dist/lib/openapi/spec/project-overview-schema.js.map +1 -1
  276. package/dist/lib/openapi/spec/project-schema.d.ts +1 -1
  277. package/dist/lib/openapi/spec/project-schema.js +1 -1
  278. package/dist/lib/openapi/spec/project-schema.js.map +1 -1
  279. package/dist/lib/openapi/spec/projects-schema.d.ts +1 -1
  280. package/dist/lib/openapi/spec/push-variants-schema.d.ts +2 -2
  281. package/dist/lib/openapi/spec/sdk-context-schema.d.ts +1 -0
  282. package/dist/lib/openapi/spec/sdk-context-schema.js +1 -0
  283. package/dist/lib/openapi/spec/sdk-context-schema.js.map +1 -1
  284. package/dist/lib/openapi/spec/sdk-flat-context-schema.d.ts +46 -0
  285. package/dist/lib/openapi/spec/sdk-flat-context-schema.js +15 -0
  286. package/dist/lib/openapi/spec/sdk-flat-context-schema.js.map +1 -0
  287. package/dist/lib/openapi/spec/search-events-schema.d.ts +1 -1
  288. package/dist/lib/openapi/spec/segments-schema.d.ts +177 -0
  289. package/dist/lib/openapi/spec/segments-schema.js +26 -0
  290. package/dist/lib/openapi/spec/segments-schema.js.map +1 -0
  291. package/dist/lib/openapi/spec/segments-schema.test.d.ts +1 -0
  292. package/dist/lib/openapi/spec/segments-schema.test.js +16 -0
  293. package/dist/lib/openapi/spec/segments-schema.test.js.map +1 -0
  294. package/dist/lib/openapi/spec/state-schema.d.ts +23 -23
  295. package/dist/lib/openapi/spec/strategy-variant-schema.d.ts +2 -2
  296. package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.d.ts +35 -0
  297. package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.js +37 -0
  298. package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.js.map +1 -0
  299. package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.test.d.ts +1 -0
  300. package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.test.js +19 -0
  301. package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.test.js.map +1 -0
  302. package/dist/lib/openapi/spec/upsert-segment-schema.d.ts +8 -15
  303. package/dist/lib/openapi/spec/upsert-segment-schema.js +8 -17
  304. package/dist/lib/openapi/spec/upsert-segment-schema.js.map +1 -1
  305. package/dist/lib/openapi/spec/upsert-segment-schema.test.d.ts +1 -0
  306. package/dist/lib/openapi/spec/upsert-segment-schema.test.js +35 -0
  307. package/dist/lib/openapi/spec/upsert-segment-schema.test.js.map +1 -0
  308. package/dist/lib/openapi/spec/validate-feature-schema.d.ts +6 -0
  309. package/dist/lib/openapi/spec/validate-feature-schema.js +6 -0
  310. package/dist/lib/openapi/spec/validate-feature-schema.js.map +1 -1
  311. package/dist/lib/openapi/spec/variant-schema.d.ts +2 -2
  312. package/dist/lib/openapi/spec/variant-schema.js +2 -2
  313. package/dist/lib/openapi/spec/variant-schema.js.map +1 -1
  314. package/dist/lib/openapi/spec/variants-schema.d.ts +2 -2
  315. package/dist/lib/openapi/util/all-of.d.ts +3 -0
  316. package/dist/lib/openapi/util/all-of.js +34 -0
  317. package/dist/lib/openapi/util/all-of.js.map +1 -0
  318. package/dist/lib/openapi/util/openapi-tags.d.ts +46 -58
  319. package/dist/lib/openapi/util/openapi-tags.js +27 -34
  320. package/dist/lib/openapi/util/openapi-tags.js.map +1 -1
  321. package/dist/lib/openapi/util/openapi-tags.test.d.ts +1 -0
  322. package/dist/lib/openapi/util/openapi-tags.test.js +15 -0
  323. package/dist/lib/openapi/util/openapi-tags.test.js.map +1 -0
  324. package/dist/lib/openapi/validate.js +0 -1
  325. package/dist/lib/openapi/validate.js.map +1 -1
  326. package/dist/lib/routes/admin-api/archive.d.ts +1 -1
  327. package/dist/lib/routes/admin-api/archive.js +3 -2
  328. package/dist/lib/routes/admin-api/archive.js.map +1 -1
  329. package/dist/lib/routes/admin-api/context.js +2 -1
  330. package/dist/lib/routes/admin-api/context.js.map +1 -1
  331. package/dist/lib/routes/admin-api/feature.js +2 -1
  332. package/dist/lib/routes/admin-api/feature.js.map +1 -1
  333. package/dist/lib/routes/admin-api/index.js +2 -0
  334. package/dist/lib/routes/admin-api/index.js.map +1 -1
  335. package/dist/lib/routes/admin-api/instance-admin.d.ts +2 -2
  336. package/dist/lib/routes/admin-api/instance-admin.js +7 -1
  337. package/dist/lib/routes/admin-api/instance-admin.js.map +1 -1
  338. package/dist/lib/routes/admin-api/metrics.d.ts +2 -1
  339. package/dist/lib/routes/admin-api/metrics.js +2 -1
  340. package/dist/lib/routes/admin-api/metrics.js.map +1 -1
  341. package/dist/lib/routes/admin-api/project/api-token.d.ts +2 -1
  342. package/dist/lib/routes/admin-api/project/api-token.js +12 -3
  343. package/dist/lib/routes/admin-api/project/api-token.js.map +1 -1
  344. package/dist/lib/routes/admin-api/project/environments.d.ts +2 -1
  345. package/dist/lib/routes/admin-api/project/environments.js +3 -1
  346. package/dist/lib/routes/admin-api/project/environments.js.map +1 -1
  347. package/dist/lib/routes/admin-api/project/index.d.ts +2 -1
  348. package/dist/lib/routes/admin-api/project/index.js +31 -0
  349. package/dist/lib/routes/admin-api/project/index.js.map +1 -1
  350. package/dist/lib/routes/admin-api/strategy.d.ts +1 -1
  351. package/dist/lib/routes/admin-api/strategy.js.map +1 -1
  352. package/dist/lib/routes/client-api/metrics.js +14 -8
  353. package/dist/lib/routes/client-api/metrics.js.map +1 -1
  354. package/dist/lib/routes/client-api/metrics.test.js +27 -0
  355. package/dist/lib/routes/client-api/metrics.test.js.map +1 -1
  356. package/dist/lib/routes/controller.d.ts +1 -1
  357. package/dist/lib/routes/controller.js +17 -10
  358. package/dist/lib/routes/controller.js.map +1 -1
  359. package/dist/lib/routes/proxy-api/index.js +5 -0
  360. package/dist/lib/routes/proxy-api/index.js.map +1 -1
  361. package/dist/lib/schema/role-schema.js +3 -1
  362. package/dist/lib/schema/role-schema.js.map +1 -1
  363. package/dist/lib/schema/role-schema.test.js +1 -1
  364. package/dist/lib/schema/role-schema.test.js.map +1 -1
  365. package/dist/lib/segments/segment-service-interface.d.ts +1 -1
  366. package/dist/lib/services/access-service.d.ts +29 -11
  367. package/dist/lib/services/access-service.js +53 -10
  368. package/dist/lib/services/access-service.js.map +1 -1
  369. package/dist/lib/services/access-service.test.js +2 -1
  370. package/dist/lib/services/access-service.test.js.map +1 -1
  371. package/dist/lib/services/addon-service.js +4 -2
  372. package/dist/lib/services/addon-service.js.map +1 -1
  373. package/dist/lib/services/addon-service.test.js +65 -0
  374. package/dist/lib/services/addon-service.test.js.map +1 -1
  375. package/dist/lib/services/client-metrics/instance-service.d.ts +5 -2
  376. package/dist/lib/services/client-metrics/instance-service.js +22 -3
  377. package/dist/lib/services/client-metrics/instance-service.js.map +1 -1
  378. package/dist/lib/services/client-metrics/instance-service.test.js +5 -4
  379. package/dist/lib/services/client-metrics/instance-service.test.js.map +1 -1
  380. package/dist/lib/services/context-service.d.ts +6 -2
  381. package/dist/lib/services/context-service.js +16 -2
  382. package/dist/lib/services/context-service.js.map +1 -1
  383. package/dist/lib/services/feature-service-potentially-stale.test.js +1 -1
  384. package/dist/lib/services/feature-service-potentially-stale.test.js.map +1 -1
  385. package/dist/lib/services/feature-toggle-service.d.ts +20 -7
  386. package/dist/lib/services/feature-toggle-service.js +109 -41
  387. package/dist/lib/services/feature-toggle-service.js.map +1 -1
  388. package/dist/lib/services/group-service.d.ts +4 -4
  389. package/dist/lib/services/group-service.js +17 -16
  390. package/dist/lib/services/group-service.js.map +1 -1
  391. package/dist/lib/services/index.d.ts +3 -2
  392. package/dist/lib/services/index.js +31 -17
  393. package/dist/lib/services/index.js.map +1 -1
  394. package/dist/lib/services/project-schema.js +9 -1
  395. package/dist/lib/services/project-schema.js.map +1 -1
  396. package/dist/lib/services/project-service.d.ts +16 -12
  397. package/dist/lib/services/project-service.js +127 -17
  398. package/dist/lib/services/project-service.js.map +1 -1
  399. package/dist/lib/services/scheduler-service.d.ts +1 -1
  400. package/dist/lib/services/scheduler-service.js +3 -3
  401. package/dist/lib/services/scheduler-service.js.map +1 -1
  402. package/dist/lib/services/scheduler-service.test.js +15 -15
  403. package/dist/lib/services/scheduler-service.test.js.map +1 -1
  404. package/dist/lib/services/segment-service.d.ts +4 -2
  405. package/dist/lib/services/segment-service.js +17 -10
  406. package/dist/lib/services/segment-service.js.map +1 -1
  407. package/dist/lib/services/state-service.test.js +13 -3
  408. package/dist/lib/services/state-service.test.js.map +1 -1
  409. package/dist/lib/services/version-service.test.js +3 -0
  410. package/dist/lib/services/version-service.test.js.map +1 -1
  411. package/dist/lib/types/events.d.ts +61 -1
  412. package/dist/lib/types/events.js +66 -4
  413. package/dist/lib/types/events.js.map +1 -1
  414. package/dist/lib/types/experimental.d.ts +1 -1
  415. package/dist/lib/types/experimental.js +9 -5
  416. package/dist/lib/types/experimental.js.map +1 -1
  417. package/dist/lib/types/group.d.ts +2 -2
  418. package/dist/lib/types/model.d.ts +31 -2
  419. package/dist/lib/types/model.js.map +1 -1
  420. package/dist/lib/types/no-auth-user.d.ts +1 -0
  421. package/dist/lib/types/no-auth-user.js +3 -1
  422. package/dist/lib/types/no-auth-user.js.map +1 -1
  423. package/dist/lib/types/option.d.ts +7 -0
  424. package/dist/lib/types/services.d.ts +6 -1
  425. package/dist/lib/types/stores/access-store.d.ts +23 -4
  426. package/dist/lib/types/stores/feature-strategies-store.d.ts +2 -1
  427. package/dist/lib/types/stores/group-store.d.ts +4 -2
  428. package/dist/lib/types/stores/project-stats-store-type.d.ts +2 -0
  429. package/dist/lib/types/stores/project-store.d.ts +7 -14
  430. package/dist/lib/types/stores/strategy-store.d.ts +3 -17
  431. package/dist/lib/types/stores.d.ts +5 -1
  432. package/dist/lib/util/findDuplicates.d.ts +1 -0
  433. package/dist/lib/util/findDuplicates.js +18 -0
  434. package/dist/lib/util/findDuplicates.js.map +1 -0
  435. package/dist/lib/util/findDuplicates.test.d.ts +1 -0
  436. package/dist/lib/util/findDuplicates.test.js +23 -0
  437. package/dist/lib/util/findDuplicates.test.js.map +1 -0
  438. package/dist/migrations/20230830121352-update-client-applications-usage-table.d.ts +2 -0
  439. package/dist/migrations/20230830121352-update-client-applications-usage-table.js +16 -0
  440. package/dist/migrations/20230830121352-update-client-applications-usage-table.js.map +1 -0
  441. package/dist/migrations/20230905122605-add-feature-naming-description.d.ts +2 -0
  442. package/dist/migrations/20230905122605-add-feature-naming-description.js +13 -0
  443. package/dist/migrations/20230905122605-add-feature-naming-description.js.map +1 -0
  444. package/dist/migrations/20230919104006-dependent-features.d.ts +2 -0
  445. package/dist/migrations/20230919104006-dependent-features.js +21 -0
  446. package/dist/migrations/20230919104006-dependent-features.js.map +1 -0
  447. package/dist/migrations/20230927071830-reset-pnps-feedback.d.ts +2 -0
  448. package/dist/migrations/20230927071830-reset-pnps-feedback.js +10 -0
  449. package/dist/migrations/20230927071830-reset-pnps-feedback.js.map +1 -0
  450. package/dist/server-dev.js +7 -4
  451. package/dist/server-dev.js.map +1 -1
  452. package/dist/test/e2e/api/admin/addon.e2e.test.js +0 -1
  453. package/dist/test/e2e/api/admin/addon.e2e.test.js.map +1 -1
  454. package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js +8 -12
  455. package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js.map +1 -1
  456. package/dist/test/e2e/api/admin/event.e2e.test.js +9 -2
  457. package/dist/test/e2e/api/admin/event.e2e.test.js.map +1 -1
  458. package/dist/test/e2e/api/admin/metrics.e2e.test.js +2 -10
  459. package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
  460. package/dist/test/e2e/api/admin/project/environments.e2e.test.js +8 -0
  461. package/dist/test/e2e/api/admin/project/environments.e2e.test.js.map +1 -1
  462. package/dist/test/e2e/api/admin/project/features.e2e.test.js +41 -15
  463. package/dist/test/e2e/api/admin/project/features.e2e.test.js.map +1 -1
  464. package/dist/test/e2e/api/admin/project/project.api.tokens.e2e.test.js +30 -3
  465. package/dist/test/e2e/api/admin/project/project.api.tokens.e2e.test.js.map +1 -1
  466. package/dist/test/e2e/api/admin/segment.e2e.test.d.ts +1 -0
  467. package/dist/test/e2e/api/admin/segment.e2e.test.js +272 -0
  468. package/dist/test/e2e/api/admin/segment.e2e.test.js.map +1 -0
  469. package/dist/test/e2e/api/admin/state.e2e.test.js +0 -11
  470. package/dist/test/e2e/api/admin/state.e2e.test.js.map +1 -1
  471. package/dist/test/e2e/api/admin/strategy.e2e.test.js +1 -1
  472. package/dist/test/e2e/api/client/feature.e2e.test.js +27 -3
  473. package/dist/test/e2e/api/client/feature.e2e.test.js.map +1 -1
  474. package/dist/test/e2e/api/client/feature.token.access.e2e.test.js +2 -2
  475. package/dist/test/e2e/api/client/feature.token.access.e2e.test.js.map +1 -1
  476. package/dist/test/e2e/api/client/segment.e2e.test.js +1 -1
  477. package/dist/test/e2e/api/client/segment.e2e.test.js.map +1 -1
  478. package/dist/test/e2e/api/proxy/proxy.e2e.test.js +34 -9
  479. package/dist/test/e2e/api/proxy/proxy.e2e.test.js.map +1 -1
  480. package/dist/test/e2e/helpers/app.utils.d.ts +6 -0
  481. package/dist/test/e2e/helpers/app.utils.js +16 -0
  482. package/dist/test/e2e/helpers/app.utils.js.map +1 -0
  483. package/dist/test/e2e/helpers/database.json +24 -0
  484. package/dist/test/e2e/services/access-service.e2e.test.js +549 -135
  485. package/dist/test/e2e/services/access-service.e2e.test.js.map +1 -1
  486. package/dist/test/e2e/services/api-token-service.e2e.test.js +4 -2
  487. package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
  488. package/dist/test/e2e/services/client-metrics-service.e2e.test.js +2 -1
  489. package/dist/test/e2e/services/client-metrics-service.e2e.test.js.map +1 -1
  490. package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js +38 -5
  491. package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js.map +1 -1
  492. package/dist/test/e2e/services/group-service.e2e.test.js +16 -11
  493. package/dist/test/e2e/services/group-service.e2e.test.js.map +1 -1
  494. package/dist/test/e2e/services/playground-service.test.js +5 -2
  495. package/dist/test/e2e/services/playground-service.test.js.map +1 -1
  496. package/dist/test/e2e/services/project-health-service.e2e.test.js +4 -2
  497. package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
  498. package/dist/test/e2e/services/project-service.e2e.test.js +242 -60
  499. package/dist/test/e2e/services/project-service.e2e.test.js.map +1 -1
  500. package/dist/test/fixtures/access-service-mock.d.ts +3 -4
  501. package/dist/test/fixtures/access-service-mock.js.map +1 -1
  502. package/dist/test/fixtures/fake-access-store.d.ts +15 -5
  503. package/dist/test/fixtures/fake-access-store.js +30 -3
  504. package/dist/test/fixtures/fake-access-store.js.map +1 -1
  505. package/dist/test/fixtures/fake-group-store.d.ts +4 -2
  506. package/dist/test/fixtures/fake-group-store.js +3 -0
  507. package/dist/test/fixtures/fake-group-store.js.map +1 -1
  508. package/dist/test/fixtures/fake-project-stats-store.d.ts +1 -0
  509. package/dist/test/fixtures/fake-project-stats-store.js +3 -0
  510. package/dist/test/fixtures/fake-project-stats-store.js.map +1 -1
  511. package/dist/test/fixtures/fake-project-store.d.ts +2 -1
  512. package/dist/test/fixtures/fake-project-store.js +3 -0
  513. package/dist/test/fixtures/fake-project-store.js.map +1 -1
  514. package/dist/test/fixtures/no-logger.d.ts +2 -1
  515. package/dist/test/fixtures/no-logger.js +8 -4
  516. package/dist/test/fixtures/no-logger.js.map +1 -1
  517. package/dist/test/fixtures/store.js +3 -0
  518. package/dist/test/fixtures/store.js.map +1 -1
  519. package/frontend/README.md +7 -1
  520. package/frontend/build/index.html +2 -2
  521. package/frontend/build/static/{AdvancedPlayground-1748fcdd.js → AdvancedPlayground-20059178.js} +11 -11
  522. package/frontend/build/static/CreateProject-6955728f.js +4 -0
  523. package/frontend/build/static/{Error-cbce6b64.js → Error-f56339ab.js} +1 -1
  524. package/frontend/build/static/FeatureArchiveDialog-33dc3a5b.js +10 -0
  525. package/frontend/build/static/{FeatureMetricsChart-8fd8a304.js → FeatureMetricsChart-5ad514bc.js} +2 -2
  526. package/frontend/build/static/FeatureViewLazyExport-85a68ed0.js +7 -0
  527. package/frontend/build/static/LazyAdminExport-e2677758.js +35 -0
  528. package/frontend/build/static/LazyProjectExport-969bb54e.js +24 -0
  529. package/frontend/build/static/Logo-android-218bddbb.svg +1 -0
  530. package/frontend/build/static/Logo-flutter-cc3c706f.svg +1 -0
  531. package/frontend/build/static/Logo-go-02475b3d.svg +1 -0
  532. package/frontend/build/static/Logo-java-6e556b26.svg +1 -0
  533. package/frontend/build/static/Logo-javascript-caebc06e.svg +1 -0
  534. package/frontend/build/static/Logo-net-0a33abee.svg +1 -0
  535. package/frontend/build/static/Logo-node-318ed025.svg +1 -0
  536. package/frontend/build/static/Logo-php-201f18c3.svg +1 -0
  537. package/frontend/build/static/Logo-python-4305760e.svg +1 -0
  538. package/frontend/build/static/Logo-react-18e98687.svg +1 -0
  539. package/frontend/build/static/Logo-ruby-58f46832.svg +1 -0
  540. package/frontend/build/static/Logo-rust-c83a80f9.svg +1 -0
  541. package/frontend/build/static/Logo-svelte-97dcb624.svg +1 -0
  542. package/frontend/build/static/Logo-swift-315f842b.svg +5 -0
  543. package/frontend/build/static/Logo-vue-0de73099.svg +1 -0
  544. package/frontend/build/static/{NetworkOverview-349a7bdd.js → NetworkOverview-894877e6.js} +2 -2
  545. package/frontend/build/static/{NetworkTraffic-60478e50.js → NetworkTraffic-81eff1ae.js} +1 -1
  546. package/frontend/build/static/ReactJSONEditor-59c8a094.js +129 -0
  547. package/frontend/build/static/RoleCell-35857d41.js +1 -0
  548. package/frontend/build/static/{StrategyItemContainer-a4caeace.js → StrategyItemContainer-b250f2d4.js} +1 -1
  549. package/frontend/build/static/{chartjs-adapter-date-fns.esm-03d2fbea.js → chartjs-adapter-date-fns.esm-c51fe022.js} +1 -1
  550. package/frontend/build/static/cr-db7653ac.png +0 -0
  551. package/frontend/build/static/datadog-543762b6.svg +5 -0
  552. package/frontend/build/static/edge-daisy-chaining-012bfdef.svg +48 -0
  553. package/frontend/build/static/edge-mode-5d25949b.svg +22 -0
  554. package/frontend/build/static/edge-offline-f6a0f761.svg +19 -0
  555. package/frontend/build/static/{flowchart-elk-definition-170a3958-fc100c77.js → flowchart-elk-definition-170a3958-a8c4a86a.js} +1 -1
  556. package/frontend/build/static/{index-866f9bf9.js → index-0515f416.js} +1 -1
  557. package/frontend/build/static/index-942e9eeb.js +463 -0
  558. package/frontend/build/static/{index-3c63138f.js → index-a59b2d65.js} +1 -1
  559. package/frontend/build/static/{is_dark-31c253e9.js → is_dark-464961a8.js} +1 -1
  560. package/frontend/build/static/jira-1abe7cbf.svg +17 -0
  561. package/frontend/build/static/{mindmap-definition-44684416-398682f9.js → mindmap-definition-44684416-3a71a9a5.js} +1 -1
  562. package/frontend/build/static/slack-36ce798a.svg +18 -0
  563. package/frontend/build/static/style-97d3ef98.css +1 -0
  564. package/frontend/build/static/teams-4e30b51f.svg +45 -0
  565. package/frontend/build/static/{timeline-definition-8e5a9bc6-04a0ae08.js → timeline-definition-8e5a9bc6-da4ebc88.js} +1 -1
  566. package/frontend/build/static/{unknownify-b8618d88.js → unknownify-3563456b.js} +1 -1
  567. package/frontend/build/static/unleash-integration-949d8966.svg +1 -0
  568. package/frontend/build/static/webhooks-b1b44207.svg +16 -0
  569. package/frontend/package.json +20 -18
  570. package/package.json +23 -23
  571. package/dist/lib/services/instance-stats-service.js.map +0 -1
  572. package/dist/lib/services/instance-stats-service.test.js.map +0 -1
  573. package/frontend/build/static/CreateProject-972fa820.js +0 -4
  574. package/frontend/build/static/FeatureArchiveDialog-8a281845.js +0 -10
  575. package/frontend/build/static/FeatureViewLazyExport-a215d53b.js +0 -7
  576. package/frontend/build/static/LazyAdminExport-ba7d55ca.js +0 -35
  577. package/frontend/build/static/LazyProjectExport-12bccd40.js +0 -17
  578. package/frontend/build/static/RoleCell-144e7eca.js +0 -1
  579. package/frontend/build/static/datadog-591b6a73.svg +0 -1
  580. package/frontend/build/static/index-17d74ac9.js +0 -454
  581. package/frontend/build/static/slack-c0af31c6.svg +0 -1
  582. package/frontend/build/static/style-770afaee.css +0 -1
  583. package/frontend/build/static/teams-62e72076.svg +0 -26
  584. package/frontend/build/static/webhooks-ffa904ac.svg +0 -1
  585. /package/dist/lib/{services/instance-stats-service.test.d.ts → db/access-store.test.d.ts} +0 -0
  586. /package/frontend/build/static/{jira-d9eb9af9.svg → jira-comment-d9eb9af9.svg} +0 -0
@@ -28,7 +28,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const database_init_1 = __importDefault(require("../helpers/database-init"));
30
30
  const no_logger_1 = __importDefault(require("../../fixtures/no-logger"));
31
- // eslint-disable-next-line import/no-unresolved
32
31
  const access_service_1 = require("../../../lib/services/access-service");
33
32
  const permissions = __importStar(require("../../../lib/types/permissions"));
34
33
  const model_1 = require("../../../lib/types/model");
@@ -41,6 +40,7 @@ const segment_service_1 = require("../../../lib/services/segment-service");
41
40
  const group_service_1 = require("../../../lib/services/group-service");
42
41
  const services_1 = require("../../../lib/services");
43
42
  const sql_change_request_access_read_model_1 = require("../../../lib/features/change-request-access-service/sql-change-request-access-read-model");
43
+ const createPrivateProjectChecker_1 = require("../../../lib/features/private-project/createPrivateProjectChecker");
44
44
  let db;
45
45
  let stores;
46
46
  let accessService;
@@ -49,27 +49,38 @@ let featureToggleService;
49
49
  let favoritesService;
50
50
  let projectService;
51
51
  let editorUser;
52
- let superUser;
53
52
  let editorRole;
54
53
  let adminRole;
55
54
  let readRole;
56
- const createUserEditorAccess = async (name, email) => {
55
+ let userIndex = 0;
56
+ const createUser = async (role) => {
57
+ const name = `User ${userIndex}`;
58
+ const email = `user-${userIndex}@getunleash.io`;
59
+ userIndex++;
57
60
  const { userStore } = stores;
58
61
  const user = await userStore.insert({ name, email });
59
- await accessService.addUserToRole(user.id, editorRole.id, 'default');
62
+ if (role)
63
+ await accessService.addUserToRole(user.id, role, role === readRole.id ? constants_1.ALL_PROJECTS : project_1.DEFAULT_PROJECT);
60
64
  return user;
61
65
  };
62
- const createUserViewerAccess = async (name, email) => {
63
- const { userStore } = stores;
64
- const user = await userStore.insert({ name, email });
65
- await accessService.addUserToRole(user.id, readRole.id, constants_1.ALL_PROJECTS);
66
- return user;
66
+ let groupIndex = 0;
67
+ const createGroup = async ({ users, role, }) => {
68
+ const { groupStore } = stores;
69
+ const group = await stores.groupStore.create({
70
+ name: `Group ${groupIndex}`,
71
+ rootRole: role,
72
+ });
73
+ if (users)
74
+ await groupStore.addUsersToGroup(group.id, users, 'Admin');
75
+ return group;
67
76
  };
68
- const createUserAdminAccess = async (name, email) => {
69
- const { userStore } = stores;
70
- const user = await userStore.insert({ name, email });
71
- await accessService.addUserToRole(user.id, adminRole.id, 'default');
72
- return user;
77
+ let roleIndex = 0;
78
+ const createRole = async (rolePermissions) => {
79
+ return accessService.createRole({
80
+ name: `Role ${roleIndex}`,
81
+ description: `Role ${roleIndex++} description`,
82
+ permissions: rolePermissions,
83
+ });
73
84
  };
74
85
  const hasCommonProjectAccess = async (user, projectName, condition) => {
75
86
  const defaultEnv = 'default';
@@ -100,15 +111,6 @@ const hasFullProjectAccess = async (user, projectName, condition) => {
100
111
  expect(await accessService.hasPermission(user, MOVE_FEATURE_TOGGLE, projectName));
101
112
  await hasCommonProjectAccess(user, projectName, condition);
102
113
  };
103
- const createSuperUser = async () => {
104
- const { userStore } = stores;
105
- const user = await userStore.insert({
106
- name: 'Alice Admin',
107
- email: 'admin@getunleash.io',
108
- });
109
- await accessService.addUserToRole(user.id, adminRole.id, constants_1.ALL_PROJECTS);
110
- return user;
111
- };
112
114
  beforeAll(async () => {
113
115
  db = await (0, database_init_1.default)('access_service_serial', no_logger_1.default);
114
116
  stores = db.stores;
@@ -125,11 +127,22 @@ beforeAll(async () => {
125
127
  adminRole = roles.find((r) => r.name === model_1.RoleName.ADMIN);
126
128
  readRole = roles.find((r) => r.name === model_1.RoleName.VIEWER);
127
129
  const changeRequestAccessReadModel = new sql_change_request_access_read_model_1.ChangeRequestAccessReadModel(db.rawDatabase, accessService);
128
- featureToggleService = new feature_toggle_service_1.default(stores, config, new segment_service_1.SegmentService(stores, changeRequestAccessReadModel, config), accessService, changeRequestAccessReadModel);
130
+ const privateProjectChecker = (0, createPrivateProjectChecker_1.createPrivateProjectChecker)(db.rawDatabase, config);
131
+ featureToggleService = new feature_toggle_service_1.default(stores, config, new segment_service_1.SegmentService(stores, changeRequestAccessReadModel, config, privateProjectChecker), accessService, changeRequestAccessReadModel, privateProjectChecker);
129
132
  favoritesService = new services_1.FavoritesService(stores, config);
130
- projectService = new project_service_1.default(stores, config, accessService, featureToggleService, groupService, favoritesService);
131
- editorUser = await createUserEditorAccess('Bob Test', 'bob@getunleash.io');
132
- superUser = await createSuperUser();
133
+ projectService = new project_service_1.default(stores, config, accessService, featureToggleService, groupService, favoritesService, privateProjectChecker);
134
+ editorUser = await createUser(editorRole.id);
135
+ const testAdmin = await createUser(adminRole.id);
136
+ await projectService.createProject({
137
+ id: 'some-project',
138
+ name: 'Some project',
139
+ description: 'Used in the test',
140
+ }, testAdmin);
141
+ await projectService.createProject({
142
+ id: 'unusedprojectname',
143
+ name: 'Another project not used',
144
+ description: 'Also used in the test',
145
+ }, testAdmin);
133
146
  });
134
147
  afterAll(async () => {
135
148
  await db.destroy();
@@ -195,12 +208,17 @@ test('should remove CREATE_FEATURE on default environment', async () => {
195
208
  const user = editorUser;
196
209
  const editRole = await accessService.getRoleByName(model_1.RoleName.EDITOR);
197
210
  await accessService.addPermissionToRole(editRole.id, permissions.CREATE_FEATURE, '*');
211
+ // TODO: to validate the remove works, we should make sure that we had permission before removing it
212
+ // this currently does not work, just keeping the comment here for future reference
213
+ // expect(
214
+ // await accessService.hasPermission(user, CREATE_FEATURE, 'some-project'),
215
+ // ).toBe(true);
198
216
  await accessService.removePermissionFromRole(editRole.id, permissions.CREATE_FEATURE, '*');
199
217
  expect(await accessService.hasPermission(user, CREATE_FEATURE, 'some-project')).toBe(false);
200
218
  });
201
219
  test('admin should be admin', async () => {
202
220
  const { DELETE_PROJECT, UPDATE_PROJECT, CREATE_FEATURE, UPDATE_FEATURE, DELETE_FEATURE, ADMIN, } = permissions;
203
- const user = superUser;
221
+ const user = await createUser(adminRole.id);
204
222
  expect(await accessService.hasPermission(user, DELETE_PROJECT, 'default')).toBe(true);
205
223
  expect(await accessService.hasPermission(user, UPDATE_PROJECT, 'default')).toBe(true);
206
224
  expect(await accessService.hasPermission(user, CREATE_FEATURE, 'default')).toBe(true);
@@ -224,7 +242,7 @@ test('should grant user access to project', async () => {
224
242
  const { DELETE_PROJECT, UPDATE_PROJECT } = permissions;
225
243
  const project = 'another-project';
226
244
  const user = editorUser;
227
- const sUser = await createUserViewerAccess('Some Random', 'random@getunleash.io');
245
+ const sUser = await createUser(readRole.id);
228
246
  await accessService.createDefaultProjectRoles(user, project);
229
247
  const projectRole = await accessService.getRoleByName(model_1.RoleName.MEMBER);
230
248
  await accessService.addUserToRole(sUser.id, projectRole.id, project);
@@ -237,7 +255,7 @@ test('should grant user access to project', async () => {
237
255
  test('should not get access if not specifying project', async () => {
238
256
  const project = 'another-project-2';
239
257
  const user = editorUser;
240
- const sUser = await createUserViewerAccess('Some Random', 'random22@getunleash.io');
258
+ const sUser = await createUser(readRole.id);
241
259
  await accessService.createDefaultProjectRoles(user, project);
242
260
  const projectRole = await accessService.getRoleByName(model_1.RoleName.MEMBER);
243
261
  await accessService.addUserToRole(sUser.id, projectRole.id, project);
@@ -355,7 +373,7 @@ test('should support permission with "ALL" environment requirement', async () =>
355
373
  description: 'Grants access to modify all environments',
356
374
  });
357
375
  const { CREATE_FEATURE_STRATEGY } = permissions;
358
- await accessStore.addPermissionsToRole(customRole.id, [CREATE_FEATURE_STRATEGY], 'production');
376
+ await accessStore.addPermissionsToRole(customRole.id, [{ name: CREATE_FEATURE_STRATEGY }], 'production');
359
377
  await accessStore.addUserToRole(user.id, customRole.id, constants_1.ALL_PROJECTS);
360
378
  const hasAccess = await accessService.hasPermission(user, CREATE_FEATURE_STRATEGY, 'default', 'production');
361
379
  expect(hasAccess).toBe(true);
@@ -399,26 +417,16 @@ test('Should be denied access to delete a role that is in use', async () => {
399
417
  name: 'CustomProjectMember',
400
418
  email: 'custom@getunleash.io',
401
419
  });
402
- const customRole = await accessService.createRole({
403
- name: 'RoleInUse',
404
- description: '',
405
- permissions: [
406
- {
407
- id: 2,
408
- name: 'CREATE_FEATURE',
409
- environment: undefined,
410
- displayName: 'Create Feature Toggles',
411
- type: 'project',
412
- },
413
- {
414
- id: 8,
415
- name: 'DELETE_FEATURE',
416
- environment: undefined,
417
- displayName: 'Delete Feature Toggles',
418
- type: 'project',
419
- },
420
- ],
421
- });
420
+ const customRole = await createRole([
421
+ {
422
+ id: 2,
423
+ name: 'CREATE_FEATURE',
424
+ },
425
+ {
426
+ id: 8,
427
+ name: 'DELETE_FEATURE',
428
+ },
429
+ ]);
422
430
  await projectService.addUser(project.id, customRole.id, projectMember.id);
423
431
  try {
424
432
  await accessService.deleteRole(customRole.id);
@@ -429,7 +437,7 @@ test('Should be denied access to delete a role that is in use', async () => {
429
437
  });
430
438
  test('Should be denied move feature toggle to project where the user does not have access', async () => {
431
439
  const user = editorUser;
432
- const editorUser2 = await createUserEditorAccess('seconduser', 'bob2@gmail.com');
440
+ const editorUser2 = await createUser(editorRole.id);
433
441
  const projectOrigin = {
434
442
  id: 'projectOrigin',
435
443
  name: 'New project',
@@ -526,14 +534,11 @@ test('Should be allowed move feature toggle to project when given access through
526
534
  id: 'yet-another-project1',
527
535
  name: 'yet-another-project1',
528
536
  };
529
- const groupStore = stores.groupStore;
530
- const viewerUser = await createUserViewerAccess('Victoria Viewer', 'vickyv@getunleash.io');
537
+ const viewerUser = await createUser(readRole.id);
531
538
  await projectService.createProject(project, editorUser);
532
- const groupWithProjectAccess = await groupStore.create({
533
- name: 'Project Editors',
534
- description: '',
539
+ const groupWithProjectAccess = await createGroup({
540
+ users: [{ user: viewerUser }],
535
541
  });
536
- await groupStore.addUsersToGroup(groupWithProjectAccess.id, [{ user: viewerUser }], 'Admin');
537
542
  const projectRole = await accessService.getRoleByName(model_1.RoleName.MEMBER);
538
543
  await hasCommonProjectAccess(viewerUser, project.id, false);
539
544
  await accessService.addGroupToRole(groupWithProjectAccess.id, projectRole.id, 'SomeAdminUser', project.id);
@@ -545,14 +550,10 @@ test('Should not lose user role access when given permissions from a group', asy
545
550
  name: 'yet-another-project-lose',
546
551
  };
547
552
  const user = editorUser;
548
- const groupStore = stores.groupStore;
549
553
  await projectService.createProject(project, user);
550
- // await accessService.createDefaultProjectRoles(user, project.id);
551
- const groupWithNoAccess = await groupStore.create({
552
- name: 'ViewersOnly',
553
- description: '',
554
+ const groupWithNoAccess = await createGroup({
555
+ users: [{ user }],
554
556
  });
555
- await groupStore.addUsersToGroup(groupWithNoAccess.id, [{ user: user }], 'Admin');
556
557
  const viewerRole = await accessService.getRoleByName(model_1.RoleName.VIEWER);
557
558
  await accessService.addGroupToRole(groupWithNoAccess.id, viewerRole.id, 'SomeAdminUser', project.id);
558
559
  await hasFullProjectAccess(user, project.id, true);
@@ -568,46 +569,27 @@ test('Should allow user to take multiple group roles and have expected permissio
568
569
  name: 'project-that-should-have-delete-toggle-permission',
569
570
  description: 'Blah',
570
571
  };
571
- const groupStore = stores.groupStore;
572
- const viewerUser = await createUserViewerAccess('Victor Viewer', 'victore@getunleash.io');
572
+ const viewerUser = await createUser(readRole.id);
573
573
  await projectService.createProject(projectForCreate, editorUser);
574
574
  await projectService.createProject(projectForDelete, editorUser);
575
- const groupWithCreateAccess = await groupStore.create({
576
- name: 'ViewersOnly',
577
- description: '',
578
- });
579
- const groupWithDeleteAccess = await groupStore.create({
580
- name: 'ViewersOnly',
581
- description: '',
582
- });
583
- await groupStore.addUsersToGroup(groupWithCreateAccess.id, [{ user: viewerUser }], 'Admin');
584
- await groupStore.addUsersToGroup(groupWithDeleteAccess.id, [{ user: viewerUser }], 'Admin');
585
- const createFeatureRole = await accessService.createRole({
586
- name: 'CreateRole',
587
- description: '',
588
- permissions: [
589
- {
590
- id: 2,
591
- name: 'CREATE_FEATURE',
592
- environment: undefined,
593
- displayName: 'Create Feature Toggles',
594
- type: 'project',
595
- },
596
- ],
575
+ const groupWithCreateAccess = await createGroup({
576
+ users: [{ user: viewerUser }],
597
577
  });
598
- const deleteFeatureRole = await accessService.createRole({
599
- name: 'DeleteRole',
600
- description: '',
601
- permissions: [
602
- {
603
- id: 8,
604
- name: 'DELETE_FEATURE',
605
- environment: undefined,
606
- displayName: 'Delete Feature Toggles',
607
- type: 'project',
608
- },
609
- ],
578
+ const groupWithDeleteAccess = await createGroup({
579
+ users: [{ user: viewerUser }],
610
580
  });
581
+ const createFeatureRole = await createRole([
582
+ {
583
+ id: 2,
584
+ name: 'CREATE_FEATURE',
585
+ },
586
+ ]);
587
+ const deleteFeatureRole = await createRole([
588
+ {
589
+ id: 8,
590
+ name: 'DELETE_FEATURE',
591
+ },
592
+ ]);
611
593
  await accessService.addGroupToRole(groupWithCreateAccess.id, deleteFeatureRole.id, 'SomeAdminUser', projectForDelete.id);
612
594
  await accessService.addGroupToRole(groupWithDeleteAccess.id, createFeatureRole.id, 'SomeAdminUser', projectForCreate.id);
613
595
  expect(await accessService.hasPermission(viewerUser, permissions.CREATE_FEATURE, projectForCreate.id)).toBe(true);
@@ -616,43 +598,34 @@ test('Should allow user to take multiple group roles and have expected permissio
616
598
  expect(await accessService.hasPermission(viewerUser, permissions.DELETE_FEATURE, projectForDelete.id)).toBe(true);
617
599
  });
618
600
  test('Should allow user to take on root role through a group that has a root role defined', async () => {
619
- const groupStore = stores.groupStore;
620
- const viewerUser = await createUserViewerAccess('Vincent Viewer', 'vincent@getunleash.io');
621
- const groupWithRootAdminRole = await groupStore.create({
622
- name: 'GroupThatGrantsAdminRights',
623
- description: '',
624
- rootRole: adminRole.id,
601
+ const viewerUser = await createUser(readRole.id);
602
+ await createGroup({
603
+ role: adminRole.id,
604
+ users: [{ user: viewerUser }],
625
605
  });
626
- await groupStore.addUsersToGroup(groupWithRootAdminRole.id, [{ user: viewerUser }], 'Admin');
627
606
  expect(await accessService.hasPermission(viewerUser, permissions.ADMIN)).toBe(true);
628
607
  });
629
608
  test('Should not elevate permissions for a user that is not present in a root role group', async () => {
630
- const groupStore = stores.groupStore;
631
- const viewerUser = await createUserViewerAccess('Violet Viewer', 'violet@getunleash.io');
632
- const viewerUserNotInGroup = await createUserViewerAccess('Veronica Viewer', 'veronica@getunleash.io');
633
- const groupWithRootAdminRole = await groupStore.create({
634
- name: 'GroupThatGrantsAdminRights',
635
- description: '',
636
- rootRole: adminRole.id,
609
+ const viewerUser = await createUser(readRole.id);
610
+ const viewerUserNotInGroup = await createUser(readRole.id);
611
+ await createGroup({
612
+ role: adminRole.id,
613
+ users: [{ user: viewerUser }],
637
614
  });
638
- await groupStore.addUsersToGroup(groupWithRootAdminRole.id, [{ user: viewerUser }], 'Admin');
639
615
  expect(await accessService.hasPermission(viewerUser, permissions.ADMIN)).toBe(true);
640
616
  expect(await accessService.hasPermission(viewerUserNotInGroup, permissions.ADMIN)).toBe(false);
641
617
  });
642
618
  test('Should not reduce permissions for an admin user that enters an editor group', async () => {
643
- const groupStore = stores.groupStore;
644
- const adminUser = await createUserAdminAccess('Austin Admin', 'austin@getunleash.io');
645
- const groupWithRootEditorRole = await groupStore.create({
646
- name: 'GroupThatGrantsEditorRights',
647
- description: '',
648
- rootRole: editorRole.id,
619
+ const adminUser = await createUser(adminRole.id);
620
+ await createGroup({
621
+ role: editorRole.id,
622
+ users: [{ user: adminUser }],
649
623
  });
650
- await groupStore.addUsersToGroup(groupWithRootEditorRole.id, [{ user: adminUser }], 'Admin');
651
624
  expect(await accessService.hasPermission(adminUser, permissions.ADMIN)).toBe(true);
652
625
  });
653
626
  test('Should not change permissions for a user in a group without a root role', async () => {
654
627
  const groupStore = stores.groupStore;
655
- const viewerUser = await createUserViewerAccess('Virgil Viewer', 'virgil@getunleash.io');
628
+ const viewerUser = await createUser(readRole.id);
656
629
  const groupWithoutRootRole = await groupStore.create({
657
630
  name: 'GroupWithNoRootRole',
658
631
  description: '',
@@ -665,12 +638,10 @@ test('Should not change permissions for a user in a group without a root role',
665
638
  });
666
639
  test('Should add permissions to user when a group is given a root role after the user has been added to the group', async () => {
667
640
  const groupStore = stores.groupStore;
668
- const viewerUser = await createUserViewerAccess('Vera Viewer', 'vera@getunleash.io');
669
- const groupWithoutRootRole = await groupStore.create({
670
- name: 'GroupWithNoRootRole',
671
- description: '',
641
+ const viewerUser = await createUser(readRole.id);
642
+ const groupWithoutRootRole = await createGroup({
643
+ users: [{ user: viewerUser }],
672
644
  });
673
- await groupStore.addUsersToGroup(groupWithoutRootRole.id, [{ user: viewerUser }], 'Admin');
674
645
  expect(await accessService.hasPermission(viewerUser, permissions.ADMIN)).toBe(false);
675
646
  await groupStore.update({
676
647
  id: groupWithoutRootRole.id,
@@ -682,14 +653,457 @@ test('Should add permissions to user when a group is given a root role after the
682
653
  });
683
654
  test('Should give full project access to the default project to user in a group with an editor root role', async () => {
684
655
  const projectName = 'default';
685
- const groupStore = stores.groupStore;
686
- const viewerUser = await createUserViewerAccess('Vee viewer', 'vee@getunleash.io');
687
- const groupWithRootEditorRole = await groupStore.create({
688
- name: 'GroupThatGrantsEditorRights',
689
- description: '',
690
- rootRole: editorRole.id,
656
+ const viewerUser = await createUser(readRole.id);
657
+ await createGroup({
658
+ role: editorRole.id,
659
+ users: [{ user: viewerUser }],
691
660
  });
692
- await groupStore.addUsersToGroup(groupWithRootEditorRole.id, [{ user: viewerUser }], 'Admin');
693
661
  await hasFullProjectAccess(viewerUser, projectName, true);
694
662
  });
663
+ test('if user has two roles user has union of permissions from the two roles', async () => {
664
+ const projectName = 'default';
665
+ const emptyUser = await createUser();
666
+ const firstRole = await createRole([
667
+ {
668
+ id: 2,
669
+ name: 'CREATE_FEATURE',
670
+ },
671
+ {
672
+ id: 8,
673
+ name: 'DELETE_FEATURE',
674
+ },
675
+ ]);
676
+ const secondRole = await createRole([
677
+ {
678
+ id: 2,
679
+ name: 'CREATE_FEATURE',
680
+ },
681
+ {
682
+ id: 13,
683
+ name: 'UPDATE_PROJECT',
684
+ },
685
+ ]);
686
+ await accessService.setProjectRolesForUser(projectName, emptyUser.id, [
687
+ firstRole.id,
688
+ secondRole.id,
689
+ ]);
690
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
691
+ const permissionNameSet = new Set(assignedPermissions.map((p) => p.permission));
692
+ expect(permissionNameSet.size).toBe(3);
693
+ });
694
+ test('calling set for user overwrites existing roles', async () => {
695
+ const projectName = 'default';
696
+ const emptyUser = await createUser();
697
+ const firstRole = await createRole([
698
+ {
699
+ id: 2,
700
+ name: 'CREATE_FEATURE',
701
+ },
702
+ {
703
+ id: 8,
704
+ name: 'DELETE_FEATURE',
705
+ },
706
+ ]);
707
+ const secondRole = await createRole([
708
+ {
709
+ id: 2,
710
+ name: 'CREATE_FEATURE',
711
+ },
712
+ {
713
+ id: 13,
714
+ name: 'UPDATE_PROJECT',
715
+ },
716
+ ]);
717
+ await accessService.setProjectRolesForUser(projectName, emptyUser.id, [
718
+ firstRole.id,
719
+ secondRole.id,
720
+ ]);
721
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
722
+ const permissionNameSet = new Set(assignedPermissions.map((p) => p.permission));
723
+ expect(permissionNameSet.size).toBe(3);
724
+ await accessService.setProjectRolesForUser(projectName, emptyUser.id, [
725
+ firstRole.id,
726
+ ]);
727
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
728
+ expect(newAssignedPermissions.length).toBe(2);
729
+ expect(newAssignedPermissions).toContainEqual({
730
+ project: projectName,
731
+ permission: 'CREATE_FEATURE',
732
+ });
733
+ expect(newAssignedPermissions).toContainEqual({
734
+ project: projectName,
735
+ permission: 'DELETE_FEATURE',
736
+ });
737
+ });
738
+ test('if group has two roles user has union of permissions from the two roles', async () => {
739
+ const projectName = 'default';
740
+ const emptyUser = await createUser();
741
+ const emptyGroup = await createGroup({
742
+ users: [{ user: emptyUser }],
743
+ });
744
+ const firstRole = await createRole([
745
+ {
746
+ id: 2,
747
+ name: 'CREATE_FEATURE',
748
+ },
749
+ {
750
+ id: 8,
751
+ name: 'DELETE_FEATURE',
752
+ },
753
+ ]);
754
+ const secondRole = await createRole([
755
+ {
756
+ id: 2,
757
+ name: 'CREATE_FEATURE',
758
+ },
759
+ {
760
+ id: 13,
761
+ name: 'UPDATE_PROJECT',
762
+ },
763
+ ]);
764
+ await accessService.setProjectRolesForGroup(projectName, emptyGroup.id, [firstRole.id, secondRole.id], 'testusr');
765
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
766
+ const permissionNameSet = new Set(assignedPermissions.map((p) => p.permission));
767
+ expect(permissionNameSet.size).toBe(3);
768
+ });
769
+ test('calling set for group overwrites existing roles', async () => {
770
+ const projectName = 'default';
771
+ const emptyUser = await createUser();
772
+ const emptyGroup = await createGroup({
773
+ users: [{ user: emptyUser }],
774
+ });
775
+ const firstRole = await createRole([
776
+ {
777
+ id: 2,
778
+ name: 'CREATE_FEATURE',
779
+ },
780
+ {
781
+ id: 8,
782
+ name: 'DELETE_FEATURE',
783
+ },
784
+ ]);
785
+ const secondRole = await createRole([
786
+ {
787
+ id: 2,
788
+ name: 'CREATE_FEATURE',
789
+ },
790
+ {
791
+ id: 13,
792
+ name: 'UPDATE_PROJECT',
793
+ },
794
+ ]);
795
+ await accessService.setProjectRolesForGroup(projectName, emptyGroup.id, [firstRole.id, secondRole.id], 'testusr');
796
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
797
+ const permissionNameSet = new Set(assignedPermissions.map((p) => p.permission));
798
+ expect(permissionNameSet.size).toBe(3);
799
+ await accessService.setProjectRolesForGroup(projectName, emptyGroup.id, [firstRole.id], 'testusr');
800
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
801
+ expect(newAssignedPermissions.length).toBe(2);
802
+ expect(newAssignedPermissions).toContainEqual({
803
+ project: projectName,
804
+ permission: 'CREATE_FEATURE',
805
+ });
806
+ expect(newAssignedPermissions).toContainEqual({
807
+ project: projectName,
808
+ permission: 'DELETE_FEATURE',
809
+ });
810
+ });
811
+ test('group with root role can be assigned a project specific role', async () => {
812
+ const projectName = 'default';
813
+ const emptyUser = await createUser();
814
+ const emptyGroup = await createGroup({
815
+ role: readRole.id,
816
+ users: [{ user: emptyUser }],
817
+ });
818
+ const firstRole = await createRole([
819
+ {
820
+ id: 2,
821
+ name: 'CREATE_FEATURE',
822
+ },
823
+ ]);
824
+ await accessService.setProjectRolesForGroup(projectName, emptyGroup.id, [firstRole.id], 'testusr');
825
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
826
+ expect(assignedPermissions).toContainEqual({
827
+ project: projectName,
828
+ permission: 'CREATE_FEATURE',
829
+ });
830
+ });
831
+ test('calling add access with invalid project role ids should not assign those roles', async () => {
832
+ const projectName = 'default';
833
+ const emptyUser = await createUser();
834
+ const adminRootRole = await accessService.getRoleByName(model_1.RoleName.ADMIN);
835
+ accessService.addAccessToProject([adminRootRole.id, 9999], [], [emptyUser.id], projectName, 'some-admin-user');
836
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
837
+ expect(newAssignedPermissions.length).toBe(0);
838
+ });
839
+ test('calling set roles for user with invalid project role ids should not assign those roles', async () => {
840
+ const projectName = 'default';
841
+ const emptyUser = await createUser();
842
+ const adminRootRole = await accessService.getRoleByName(model_1.RoleName.ADMIN);
843
+ accessService.setProjectRolesForUser(projectName, emptyUser.id, [
844
+ adminRootRole.id,
845
+ 9999,
846
+ ]);
847
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
848
+ expect(newAssignedPermissions.length).toBe(0);
849
+ });
850
+ test('calling set roles for user with empty role array removes all roles', async () => {
851
+ const projectName = 'default';
852
+ const emptyUser = await createUser();
853
+ const role = await createRole([
854
+ {
855
+ id: 2,
856
+ name: 'CREATE_FEATURE',
857
+ },
858
+ ]);
859
+ await accessService.setProjectRolesForUser(projectName, emptyUser.id, [
860
+ role.id,
861
+ ]);
862
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
863
+ expect(assignedPermissions.length).toBe(1);
864
+ await accessService.setProjectRolesForUser(projectName, emptyUser.id, []);
865
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
866
+ expect(newAssignedPermissions.length).toBe(0);
867
+ });
868
+ test('calling set roles for user with empty role array should not remove root roles', async () => {
869
+ const projectName = 'default';
870
+ const adminUser = await createUser(adminRole.id);
871
+ const firstRole = await createRole([
872
+ {
873
+ id: 2,
874
+ name: 'CREATE_FEATURE',
875
+ },
876
+ {
877
+ id: 8,
878
+ name: 'DELETE_FEATURE',
879
+ },
880
+ ]);
881
+ await accessService.setProjectRolesForUser(projectName, adminUser.id, [
882
+ firstRole.id,
883
+ ]);
884
+ const assignedPermissions = await accessService.getPermissionsForUser(adminUser);
885
+ expect(assignedPermissions.length).toBe(3);
886
+ await accessService.setProjectRolesForUser(projectName, adminUser.id, []);
887
+ const newAssignedPermissions = await accessService.getPermissionsForUser(adminUser);
888
+ expect(newAssignedPermissions.length).toBe(1);
889
+ expect(newAssignedPermissions[0].permission).toBe(permissions.ADMIN);
890
+ });
891
+ test('remove user access should remove all project roles', async () => {
892
+ const projectName = 'default';
893
+ const emptyUser = await createUser();
894
+ const firstRole = await createRole([
895
+ {
896
+ id: 2,
897
+ name: 'CREATE_FEATURE',
898
+ },
899
+ {
900
+ id: 8,
901
+ name: 'DELETE_FEATURE',
902
+ },
903
+ ]);
904
+ const secondRole = await createRole([
905
+ {
906
+ id: 13,
907
+ name: 'UPDATE_PROJECT',
908
+ },
909
+ ]);
910
+ await accessService.setProjectRolesForUser(projectName, emptyUser.id, [
911
+ firstRole.id,
912
+ secondRole.id,
913
+ ]);
914
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
915
+ expect(assignedPermissions.length).toBe(3);
916
+ await accessService.removeUserAccess(projectName, emptyUser.id);
917
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
918
+ expect(newAssignedPermissions.length).toBe(0);
919
+ });
920
+ test('remove user access should remove all project roles, while leaving root roles untouched', async () => {
921
+ const projectName = 'default';
922
+ const adminUser = await createUser(adminRole.id);
923
+ const firstRole = await createRole([
924
+ {
925
+ id: 2,
926
+ name: 'CREATE_FEATURE',
927
+ },
928
+ {
929
+ id: 8,
930
+ name: 'DELETE_FEATURE',
931
+ },
932
+ ]);
933
+ const secondRole = await createRole([
934
+ {
935
+ id: 13,
936
+ name: 'UPDATE_PROJECT',
937
+ },
938
+ ]);
939
+ await accessService.setProjectRolesForUser(projectName, adminUser.id, [
940
+ firstRole.id,
941
+ secondRole.id,
942
+ ]);
943
+ const assignedPermissions = await accessService.getPermissionsForUser(adminUser);
944
+ expect(assignedPermissions.length).toBe(4);
945
+ await accessService.removeUserAccess(projectName, adminUser.id);
946
+ const newAssignedPermissions = await accessService.getPermissionsForUser(adminUser);
947
+ expect(newAssignedPermissions.length).toBe(1);
948
+ expect(newAssignedPermissions[0].permission).toBe(permissions.ADMIN);
949
+ });
950
+ test('calling set roles for group with invalid project role ids should not assign those roles', async () => {
951
+ const projectName = 'default';
952
+ const emptyUser = await createUser();
953
+ const emptyGroup = await createGroup({
954
+ users: [{ user: emptyUser }],
955
+ });
956
+ const adminRootRole = await accessService.getRoleByName(model_1.RoleName.ADMIN);
957
+ accessService.setProjectRolesForGroup(projectName, emptyGroup.id, [adminRootRole.id, 9999], 'admin');
958
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
959
+ expect(newAssignedPermissions.length).toBe(0);
960
+ });
961
+ test('calling set roles for group with empty role array removes all roles', async () => {
962
+ const projectName = 'default';
963
+ const emptyUser = await createUser();
964
+ const emptyGroup = await createGroup({
965
+ users: [{ user: emptyUser }],
966
+ });
967
+ const role = await createRole([
968
+ {
969
+ id: 2,
970
+ name: 'CREATE_FEATURE',
971
+ },
972
+ ]);
973
+ await accessService.setProjectRolesForGroup(projectName, emptyGroup.id, [role.id], 'admin');
974
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
975
+ expect(assignedPermissions.length).toBe(1);
976
+ await accessService.setProjectRolesForGroup(projectName, emptyGroup.id, [], 'admin');
977
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
978
+ expect(newAssignedPermissions.length).toBe(0);
979
+ });
980
+ test('calling set roles for group with empty role array should not remove root roles', async () => {
981
+ const projectName = 'default';
982
+ const adminUser = await createUser(adminRole.id);
983
+ const group = await createGroup({
984
+ users: [{ user: adminUser }],
985
+ });
986
+ const role = await createRole([
987
+ {
988
+ id: 2,
989
+ name: 'CREATE_FEATURE',
990
+ },
991
+ {
992
+ id: 8,
993
+ name: 'DELETE_FEATURE',
994
+ },
995
+ ]);
996
+ await accessService.setProjectRolesForGroup(projectName, group.id, [role.id], 'admin');
997
+ const assignedPermissions = await accessService.getPermissionsForUser(adminUser);
998
+ expect(assignedPermissions.length).toBe(3);
999
+ await accessService.setProjectRolesForGroup(projectName, group.id, [], 'admin');
1000
+ const newAssignedPermissions = await accessService.getPermissionsForUser(adminUser);
1001
+ expect(newAssignedPermissions.length).toBe(1);
1002
+ expect(newAssignedPermissions[0].permission).toBe(permissions.ADMIN);
1003
+ });
1004
+ test('remove group access should remove all project roles', async () => {
1005
+ const projectName = 'default';
1006
+ const emptyUser = await createUser();
1007
+ const group = await createGroup({
1008
+ users: [{ user: emptyUser }],
1009
+ });
1010
+ const firstRole = await createRole([
1011
+ {
1012
+ id: 2,
1013
+ name: 'CREATE_FEATURE',
1014
+ },
1015
+ {
1016
+ id: 8,
1017
+ name: 'DELETE_FEATURE',
1018
+ },
1019
+ ]);
1020
+ const secondRole = await createRole([
1021
+ {
1022
+ id: 13,
1023
+ name: 'UPDATE_PROJECT',
1024
+ },
1025
+ ]);
1026
+ await accessService.setProjectRolesForGroup(projectName, group.id, [firstRole.id, secondRole.id], 'admin');
1027
+ const assignedPermissions = await accessService.getPermissionsForUser(emptyUser);
1028
+ expect(assignedPermissions.length).toBe(3);
1029
+ await accessService.removeGroupAccess(projectName, group.id);
1030
+ const newAssignedPermissions = await accessService.getPermissionsForUser(emptyUser);
1031
+ expect(newAssignedPermissions.length).toBe(0);
1032
+ });
1033
+ test('remove group access should remove all project roles, while leaving root roles untouched', async () => {
1034
+ const projectName = 'default';
1035
+ const adminUser = await createUser(adminRole.id);
1036
+ const group = await createGroup({
1037
+ users: [{ user: adminUser }],
1038
+ });
1039
+ const firstRole = await createRole([
1040
+ {
1041
+ id: 2,
1042
+ name: 'CREATE_FEATURE',
1043
+ },
1044
+ {
1045
+ id: 8,
1046
+ name: 'DELETE_FEATURE',
1047
+ },
1048
+ ]);
1049
+ const secondRole = await createRole([
1050
+ {
1051
+ id: 13,
1052
+ name: 'UPDATE_PROJECT',
1053
+ },
1054
+ ]);
1055
+ await accessService.setProjectRolesForGroup(projectName, group.id, [firstRole.id, secondRole.id], 'admin');
1056
+ const assignedPermissions = await accessService.getPermissionsForUser(adminUser);
1057
+ expect(assignedPermissions.length).toBe(4);
1058
+ await accessService.removeGroupAccess(projectName, group.id);
1059
+ const newAssignedPermissions = await accessService.getPermissionsForUser(adminUser);
1060
+ expect(newAssignedPermissions.length).toBe(1);
1061
+ expect(newAssignedPermissions[0].permission).toBe(permissions.ADMIN);
1062
+ });
1063
+ test('access overview should have admin access and default project for admin user', async () => {
1064
+ const email = 'a-person@places.com';
1065
+ const { userStore } = stores;
1066
+ const user = await userStore.insert({
1067
+ name: 'Some User',
1068
+ email,
1069
+ });
1070
+ await accessService.setUserRootRole(user.id, adminRole.id);
1071
+ const accessOverView = await accessService.getUserAccessOverview();
1072
+ const userAccess = accessOverView.find((overviewRow) => overviewRow.userId == user.id);
1073
+ expect(userAccess.userId).toBe(user.id);
1074
+ expect(userAccess.rootRole).toBe('Admin');
1075
+ expect(userAccess.accessibleProjects).toStrictEqual(['default']);
1076
+ });
1077
+ test('access overview should have group access for groups that they are in', async () => {
1078
+ const email = 'a-nother-person@places.com';
1079
+ const { userStore } = stores;
1080
+ const user = await userStore.insert({
1081
+ name: 'Some Other User',
1082
+ email,
1083
+ });
1084
+ await accessService.setUserRootRole(user.id, adminRole.id);
1085
+ const group = await stores.groupStore.create({
1086
+ name: 'Test Group',
1087
+ });
1088
+ await stores.groupStore.addUsersToGroup(group.id, [
1089
+ {
1090
+ user: {
1091
+ id: user.id,
1092
+ },
1093
+ },
1094
+ ], 'Admin');
1095
+ const someGroupRole = await createRole([
1096
+ {
1097
+ id: 13,
1098
+ name: 'UPDATE_PROJECT',
1099
+ },
1100
+ ]);
1101
+ await accessService.addGroupToRole(group.id, someGroupRole.id, 'creator', 'default');
1102
+ const accessOverView = await accessService.getUserAccessOverview();
1103
+ const userAccess = accessOverView.find((overviewRow) => overviewRow.userId == user.id);
1104
+ expect(userAccess.userId).toBe(user.id);
1105
+ expect(userAccess.rootRole).toBe('Admin');
1106
+ expect(userAccess.groups).toStrictEqual(['Test Group']);
1107
+ expect(userAccess.groupProjects).toStrictEqual(['default']);
1108
+ });
695
1109
  //# sourceMappingURL=access-service.e2e.test.js.map