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.
- package/README.md +5 -3
- package/dist/lib/addons/addon-schema.js +2 -1
- package/dist/lib/addons/addon-schema.js.map +1 -1
- package/dist/lib/addons/datadog-definition.js +22 -7
- package/dist/lib/addons/datadog-definition.js.map +1 -1
- package/dist/lib/addons/datadog.d.ts +7 -1
- package/dist/lib/addons/datadog.js +16 -3
- package/dist/lib/addons/datadog.js.map +1 -1
- package/dist/lib/addons/datadog.test.js +62 -0
- package/dist/lib/addons/datadog.test.js.map +1 -1
- package/dist/lib/addons/index.js +3 -11
- package/dist/lib/addons/index.js.map +1 -1
- package/dist/lib/addons/slack-app-definition.js +5 -24
- package/dist/lib/addons/slack-app-definition.js.map +1 -1
- package/dist/lib/addons/slack-app.d.ts +0 -1
- package/dist/lib/addons/slack-app.js +5 -17
- package/dist/lib/addons/slack-app.js.map +1 -1
- package/dist/lib/addons/slack-app.test.js +39 -25
- package/dist/lib/addons/slack-app.test.js.map +1 -1
- package/dist/lib/addons/slack-definition.js +11 -4
- package/dist/lib/addons/slack-definition.js.map +1 -1
- package/dist/lib/addons/teams-definition.js +5 -4
- package/dist/lib/addons/teams-definition.js.map +1 -1
- package/dist/lib/addons/webhook-definition.js +10 -12
- package/dist/lib/addons/webhook-definition.js.map +1 -1
- package/dist/lib/create-config.js +13 -1
- package/dist/lib/create-config.js.map +1 -1
- package/dist/lib/create-config.test.js +14 -0
- package/dist/lib/create-config.test.js.map +1 -1
- package/dist/lib/db/access-store.d.ts +23 -5
- package/dist/lib/db/access-store.js +263 -17
- package/dist/lib/db/access-store.js.map +1 -1
- package/dist/lib/db/access-store.test.js +83 -0
- package/dist/lib/db/access-store.test.js.map +1 -0
- package/dist/lib/db/client-applications-store.d.ts +1 -3
- package/dist/lib/db/client-applications-store.js +13 -24
- package/dist/lib/db/client-applications-store.js.map +1 -1
- package/dist/lib/db/event-store.js +1 -0
- package/dist/lib/db/event-store.js.map +1 -1
- package/dist/lib/db/feature-toggle-client-store.js +17 -4
- package/dist/lib/db/feature-toggle-client-store.js.map +1 -1
- package/dist/lib/db/feature-toggle-store.js +1 -1
- package/dist/lib/db/feature-toggle-store.js.map +1 -1
- package/dist/lib/db/group-store.d.ts +4 -2
- package/dist/lib/db/group-store.js +24 -0
- package/dist/lib/db/group-store.js.map +1 -1
- package/dist/lib/db/index.d.ts +1 -2
- package/dist/lib/db/index.js +5 -1
- package/dist/lib/db/index.js.map +1 -1
- package/dist/lib/db/project-stats-store.d.ts +2 -0
- package/dist/lib/db/project-stats-store.js +27 -0
- package/dist/lib/db/project-stats-store.js.map +1 -1
- package/dist/lib/db/project-store.d.ts +7 -1
- package/dist/lib/db/project-store.js +34 -1
- package/dist/lib/db/project-store.js.map +1 -1
- package/dist/lib/error/bad-data-error.d.ts +1 -1
- package/dist/lib/error/index.d.ts +2 -1
- package/dist/lib/error/index.js +3 -1
- package/dist/lib/error/index.js.map +1 -1
- package/dist/lib/error/pattern-error.d.ts +10 -0
- package/dist/lib/error/pattern-error.js +20 -0
- package/dist/lib/error/pattern-error.js.map +1 -0
- package/dist/lib/features/dependent-features/createDependentFeaturesService.d.ts +3 -0
- package/dist/lib/features/dependent-features/createDependentFeaturesService.js +11 -0
- package/dist/lib/features/dependent-features/createDependentFeaturesService.js.map +1 -0
- package/dist/lib/features/dependent-features/dependent-features-controller.d.ts +28 -0
- package/dist/lib/features/dependent-features/dependent-features-controller.js +151 -0
- package/dist/lib/features/dependent-features/dependent-features-controller.js.map +1 -0
- package/dist/lib/features/dependent-features/dependent-features-service.d.ts +11 -0
- package/dist/lib/features/dependent-features/dependent-features-service.js +40 -0
- package/dist/lib/features/dependent-features/dependent-features-service.js.map +1 -0
- package/dist/lib/features/dependent-features/dependent-features-store-type.d.ts +8 -0
- package/dist/lib/features/dependent-features/dependent-features-store-type.js +3 -0
- package/dist/lib/features/dependent-features/dependent-features-store-type.js.map +1 -0
- package/dist/lib/features/dependent-features/dependent-features-store.d.ts +12 -0
- package/dist/lib/features/dependent-features/dependent-features-store.js +56 -0
- package/dist/lib/features/dependent-features/dependent-features-store.js.map +1 -0
- package/dist/lib/features/dependent-features/dependent-features.d.ts +14 -0
- package/dist/lib/features/dependent-features/dependent-features.js +3 -0
- package/dist/lib/features/dependent-features/dependent-features.js.map +1 -0
- package/dist/lib/features/dependent-features/dependent.features.e2e.test.d.ts +1 -0
- package/dist/lib/features/dependent-features/dependent.features.e2e.test.js +82 -0
- package/dist/lib/features/dependent-features/dependent.features.e2e.test.js.map +1 -0
- package/dist/lib/features/dependent-features/fake-dependent-features-store.d.ts +8 -0
- package/dist/lib/features/dependent-features/fake-dependent-features-store.js +22 -0
- package/dist/lib/features/dependent-features/fake-dependent-features-store.js.map +1 -0
- package/dist/lib/features/export-import-toggles/createExportImportService.js +6 -3
- package/dist/lib/features/export-import-toggles/createExportImportService.js.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import-service.d.ts +9 -3
- package/dist/lib/features/export-import-toggles/export-import-service.js +51 -21
- package/dist/lib/features/export-import-toggles/export-import-service.js.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import.e2e.test.js +120 -50
- package/dist/lib/features/export-import-toggles/export-import.e2e.test.js.map +1 -1
- package/dist/lib/features/export-import-toggles/import-permissions-service.d.ts +1 -2
- package/dist/lib/features/export-import-toggles/import-toggles-store-type.d.ts +6 -0
- package/dist/lib/features/export-import-toggles/import-toggles-store.d.ts +2 -1
- package/dist/lib/features/export-import-toggles/import-toggles-store.js +25 -0
- package/dist/lib/features/export-import-toggles/import-toggles-store.js.map +1 -1
- package/dist/lib/features/export-import-toggles/import-validation-messages.d.ts +18 -2
- package/dist/lib/features/export-import-toggles/import-validation-messages.js +27 -11
- package/dist/lib/features/export-import-toggles/import-validation-messages.js.map +1 -1
- package/dist/lib/features/feature-naming-pattern/feature-naming-validation.d.ts +14 -0
- package/dist/lib/features/feature-naming-pattern/feature-naming-validation.js +46 -0
- package/dist/lib/features/feature-naming-pattern/feature-naming-validation.js.map +1 -0
- package/dist/lib/features/feature-naming-pattern/feature-naming-validation.test.d.ts +1 -0
- package/dist/lib/features/feature-naming-pattern/feature-naming-validation.test.js +116 -0
- package/dist/lib/features/feature-naming-pattern/feature-naming-validation.test.js.map +1 -0
- package/dist/lib/features/feature-toggle/createFeatureToggleService.js +11 -2
- package/dist/lib/features/feature-toggle/createFeatureToggleService.js.map +1 -1
- package/dist/lib/features/instance-stats/getActiveUsers.d.ts +9 -0
- package/dist/lib/features/instance-stats/getActiveUsers.e2e.test.d.ts +1 -0
- package/dist/lib/features/instance-stats/getActiveUsers.e2e.test.js +141 -0
- package/dist/lib/features/instance-stats/getActiveUsers.e2e.test.js.map +1 -0
- package/dist/lib/features/instance-stats/getActiveUsers.js +33 -0
- package/dist/lib/features/instance-stats/getActiveUsers.js.map +1 -0
- package/dist/lib/{services → features/instance-stats}/instance-stats-service.d.ts +13 -7
- package/dist/lib/{services → features/instance-stats}/instance-stats-service.js +16 -7
- package/dist/lib/features/instance-stats/instance-stats-service.js.map +1 -0
- package/dist/lib/features/instance-stats/instance-stats-service.test.d.ts +1 -0
- package/dist/lib/{services → features/instance-stats}/instance-stats-service.test.js +6 -5
- package/dist/lib/features/instance-stats/instance-stats-service.test.js.map +1 -0
- package/dist/lib/features/playground/advanced-playground.test.js +2 -3
- package/dist/lib/features/playground/advanced-playground.test.js.map +1 -1
- package/dist/lib/features/playground/feature-evaluator/variant.d.ts +1 -1
- package/dist/lib/features/playground/generateObjectCombinations.d.ts +1 -1
- package/dist/lib/features/playground/generateObjectCombinations.js +14 -4
- package/dist/lib/features/playground/generateObjectCombinations.js.map +1 -1
- package/dist/lib/features/playground/generateObjectCombinations.test.js +21 -0
- package/dist/lib/features/playground/generateObjectCombinations.test.js.map +1 -1
- package/dist/lib/features/playground/playground-service.d.ts +5 -3
- package/dist/lib/features/playground/playground-service.js +18 -3
- package/dist/lib/features/playground/playground-service.js.map +1 -1
- package/dist/lib/features/playground/playground.d.ts +2 -1
- package/dist/lib/features/playground/playground.js +2 -1
- package/dist/lib/features/playground/playground.js.map +1 -1
- package/dist/lib/features/private-project/createPrivateProjectChecker.d.ts +5 -0
- package/dist/lib/features/private-project/createPrivateProjectChecker.js +22 -0
- package/dist/lib/features/private-project/createPrivateProjectChecker.js.map +1 -0
- package/dist/lib/features/private-project/fakePrivateProjectChecker.d.ts +7 -0
- package/dist/lib/features/private-project/fakePrivateProjectChecker.js +15 -0
- package/dist/lib/features/private-project/fakePrivateProjectChecker.js.map +1 -0
- package/dist/lib/features/private-project/privateProjectChecker.d.ts +10 -0
- package/dist/lib/features/private-project/privateProjectChecker.js +22 -0
- package/dist/lib/features/private-project/privateProjectChecker.js.map +1 -0
- package/dist/lib/features/private-project/privateProjectCheckerType.d.ts +5 -0
- package/dist/lib/features/private-project/privateProjectCheckerType.js +3 -0
- package/dist/lib/features/private-project/privateProjectCheckerType.js.map +1 -0
- package/dist/lib/features/private-project/privateProjectStore.d.ts +18 -0
- package/dist/lib/features/private-project/privateProjectStore.js +70 -0
- package/dist/lib/features/private-project/privateProjectStore.js.map +1 -0
- package/dist/lib/features/private-project/privateProjectStoreType.d.ts +4 -0
- package/dist/lib/features/private-project/privateProjectStoreType.js +3 -0
- package/dist/lib/features/private-project/privateProjectStoreType.js.map +1 -0
- package/dist/lib/features/project/createProjectService.js +5 -8
- package/dist/lib/features/project/createProjectService.js.map +1 -1
- package/dist/lib/features/segment/createSegmentService.js +5 -2
- package/dist/lib/features/segment/createSegmentService.js.map +1 -1
- package/dist/lib/features/segment/segment-controller.d.ts +39 -0
- package/dist/lib/features/segment/segment-controller.js +291 -0
- package/dist/lib/features/segment/segment-controller.js.map +1 -0
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/metrics.js +30 -1
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/metrics.test.js +3 -2
- package/dist/lib/metrics.test.js.map +1 -1
- package/dist/lib/middleware/rbac-middleware.d.ts +2 -0
- package/dist/lib/middleware/rbac-middleware.js +2 -0
- package/dist/lib/middleware/rbac-middleware.js.map +1 -1
- package/dist/lib/middleware/secure-headers.js +18 -0
- package/dist/lib/middleware/secure-headers.js.map +1 -1
- package/dist/lib/openapi/index.js +13 -0
- package/dist/lib/openapi/index.js.map +1 -1
- package/dist/lib/openapi/meta-schema-rules.test.js +14 -4
- package/dist/lib/openapi/meta-schema-rules.test.js.map +1 -1
- package/dist/lib/openapi/spec/addon-type-schema.d.ts +6 -1
- package/dist/lib/openapi/spec/addon-type-schema.js +6 -1
- package/dist/lib/openapi/spec/addon-type-schema.js.map +1 -1
- package/dist/lib/openapi/spec/addons-schema.d.ts +8 -3
- package/dist/lib/openapi/spec/addons-schema.js +8 -3
- package/dist/lib/openapi/spec/addons-schema.js.map +1 -1
- package/dist/lib/openapi/spec/admin-segment-schema.d.ts +115 -0
- package/dist/lib/openapi/spec/admin-segment-schema.js +75 -0
- package/dist/lib/openapi/spec/admin-segment-schema.js.map +1 -0
- package/dist/lib/openapi/spec/admin-segment-schema.test.d.ts +1 -0
- package/dist/lib/openapi/spec/admin-segment-schema.test.js +39 -0
- package/dist/lib/openapi/spec/admin-segment-schema.test.js.map +1 -0
- package/dist/lib/openapi/spec/admin-strategies-schema.d.ts +46 -0
- package/dist/lib/openapi/spec/admin-strategies-schema.js +54 -0
- package/dist/lib/openapi/spec/admin-strategies-schema.js.map +1 -0
- package/dist/lib/openapi/spec/admin-strategies-schema.test.d.ts +1 -0
- package/dist/lib/openapi/spec/admin-strategies-schema.test.js +40 -0
- package/dist/lib/openapi/spec/admin-strategies-schema.test.js.map +1 -0
- package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.d.ts +51 -6
- package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.js +3 -1
- package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.js.map +1 -1
- package/dist/lib/openapi/spec/advanced-playground-feature-schema.d.ts +101 -11
- package/dist/lib/openapi/spec/advanced-playground-feature-schema.js +2 -0
- package/dist/lib/openapi/spec/advanced-playground-feature-schema.js.map +1 -1
- package/dist/lib/openapi/spec/advanced-playground-request-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/advanced-playground-response-schema.d.ts +203 -22
- package/dist/lib/openapi/spec/advanced-playground-response-schema.js +2 -0
- package/dist/lib/openapi/spec/advanced-playground-response-schema.js.map +1 -1
- package/dist/lib/openapi/spec/client-feature-schema.d.ts +41 -6
- package/dist/lib/openapi/spec/client-feature-schema.js +9 -0
- package/dist/lib/openapi/spec/client-feature-schema.js.map +1 -1
- package/dist/lib/openapi/spec/client-features-schema.d.ts +75 -12
- package/dist/lib/openapi/spec/client-features-schema.js +2 -0
- package/dist/lib/openapi/spec/client-features-schema.js.map +1 -1
- package/dist/lib/openapi/spec/context-field-strategies-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/context-field-strategies-schema.js +1 -1
- package/dist/lib/openapi/spec/context-field-strategies-schema.js.map +1 -1
- package/dist/lib/openapi/spec/create-api-token-schema.d.ts +1 -139
- package/dist/lib/openapi/spec/create-api-token-schema.js +16 -20
- package/dist/lib/openapi/spec/create-api-token-schema.js.map +1 -1
- package/dist/lib/openapi/spec/create-dependent-feature-schema.d.ts +29 -0
- package/dist/lib/openapi/spec/create-dependent-feature-schema.js +31 -0
- package/dist/lib/openapi/spec/create-dependent-feature-schema.js.map +1 -0
- package/dist/lib/openapi/spec/create-feature-naming-pattern-schema.d.ts +29 -0
- package/dist/lib/openapi/spec/create-feature-naming-pattern-schema.js +33 -0
- package/dist/lib/openapi/spec/create-feature-naming-pattern-schema.js.map +1 -0
- package/dist/lib/openapi/spec/create-feature-strategy-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/create-strategy-schema.d.ts +15 -0
- package/dist/lib/openapi/spec/create-strategy-schema.js +15 -0
- package/dist/lib/openapi/spec/create-strategy-schema.js.map +1 -1
- package/dist/lib/openapi/spec/create-strategy-variant-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/create-strategy-variant-schema.js +2 -2
- package/dist/lib/openapi/spec/create-strategy-variant-schema.js.map +1 -1
- package/dist/lib/openapi/spec/dependent-feature-schema.d.ts +30 -0
- package/dist/lib/openapi/spec/dependent-feature-schema.js +14 -0
- package/dist/lib/openapi/spec/dependent-feature-schema.js.map +1 -0
- package/dist/lib/openapi/spec/dora-features-schema.d.ts +20 -0
- package/dist/lib/openapi/spec/dora-features-schema.js +22 -0
- package/dist/lib/openapi/spec/dora-features-schema.js.map +1 -0
- package/dist/lib/openapi/spec/environment-project-schema.d.ts +4 -4
- package/dist/lib/openapi/spec/environments-project-schema.d.ts +4 -4
- package/dist/lib/openapi/spec/event-schema.d.ts +3 -3
- package/dist/lib/openapi/spec/events-schema.d.ts +3 -3
- package/dist/lib/openapi/spec/export-query-schema.d.ts +22 -15
- package/dist/lib/openapi/spec/export-query-schema.js +16 -15
- package/dist/lib/openapi/spec/export-query-schema.js.map +1 -1
- package/dist/lib/openapi/spec/export-result-schema.d.ts +26 -26
- package/dist/lib/openapi/spec/feature-environment-schema.d.ts +6 -6
- package/dist/lib/openapi/spec/feature-events-schema.d.ts +3 -3
- package/dist/lib/openapi/spec/feature-schema.d.ts +12 -12
- package/dist/lib/openapi/spec/feature-strategy-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/feature-variants-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/features-schema.d.ts +24 -24
- package/dist/lib/openapi/spec/health-overview-schema.d.ts +63 -33
- package/dist/lib/openapi/spec/health-overview-schema.js +6 -1
- package/dist/lib/openapi/spec/health-overview-schema.js.map +1 -1
- package/dist/lib/openapi/spec/health-report-schema.d.ts +63 -33
- package/dist/lib/openapi/spec/import-toggles-schema.d.ts +52 -52
- package/dist/lib/openapi/spec/index.d.ts +9 -0
- package/dist/lib/openapi/spec/index.js +9 -0
- package/dist/lib/openapi/spec/index.js.map +1 -1
- package/dist/lib/openapi/spec/instance-admin-stats-schema.d.ts +42 -0
- package/dist/lib/openapi/spec/instance-admin-stats-schema.js +42 -0
- package/dist/lib/openapi/spec/instance-admin-stats-schema.js.map +1 -1
- package/dist/lib/openapi/spec/parent-feature-options-schema.d.ts +11 -0
- package/dist/lib/openapi/spec/parent-feature-options-schema.js +13 -0
- package/dist/lib/openapi/spec/parent-feature-options-schema.js.map +1 -0
- package/dist/lib/openapi/spec/playground-feature-schema.d.ts +5 -5
- package/dist/lib/openapi/spec/playground-request-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/playground-response-schema.d.ts +12 -10
- package/dist/lib/openapi/spec/playground-strategy-schema.d.ts +4 -4
- package/dist/lib/openapi/spec/playground-strategy-schema.js +1 -1
- package/dist/lib/openapi/spec/playground-strategy-schema.js.map +1 -1
- package/dist/lib/openapi/spec/profile-schema.d.ts +12 -12
- package/dist/lib/openapi/spec/project-dora-metrics-schema.d.ts +44 -0
- package/dist/lib/openapi/spec/project-dora-metrics-schema.js +28 -0
- package/dist/lib/openapi/spec/project-dora-metrics-schema.js.map +1 -0
- package/dist/lib/openapi/spec/project-environment-schema.d.ts +4 -4
- package/dist/lib/openapi/spec/project-overview-schema.d.ts +63 -33
- package/dist/lib/openapi/spec/project-overview-schema.js +6 -1
- package/dist/lib/openapi/spec/project-overview-schema.js.map +1 -1
- package/dist/lib/openapi/spec/project-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/project-schema.js +1 -1
- package/dist/lib/openapi/spec/project-schema.js.map +1 -1
- package/dist/lib/openapi/spec/projects-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/push-variants-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/sdk-context-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/sdk-context-schema.js +1 -0
- package/dist/lib/openapi/spec/sdk-context-schema.js.map +1 -1
- package/dist/lib/openapi/spec/sdk-flat-context-schema.d.ts +46 -0
- package/dist/lib/openapi/spec/sdk-flat-context-schema.js +15 -0
- package/dist/lib/openapi/spec/sdk-flat-context-schema.js.map +1 -0
- package/dist/lib/openapi/spec/search-events-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/segments-schema.d.ts +177 -0
- package/dist/lib/openapi/spec/segments-schema.js +26 -0
- package/dist/lib/openapi/spec/segments-schema.js.map +1 -0
- package/dist/lib/openapi/spec/segments-schema.test.d.ts +1 -0
- package/dist/lib/openapi/spec/segments-schema.test.js +16 -0
- package/dist/lib/openapi/spec/segments-schema.test.js.map +1 -0
- package/dist/lib/openapi/spec/state-schema.d.ts +23 -23
- package/dist/lib/openapi/spec/strategy-variant-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.d.ts +35 -0
- package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.js +37 -0
- package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.js.map +1 -0
- package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.test.d.ts +1 -0
- package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.test.js +19 -0
- package/dist/lib/openapi/spec/update-feature-strategy-segments-schema.test.js.map +1 -0
- package/dist/lib/openapi/spec/upsert-segment-schema.d.ts +8 -15
- package/dist/lib/openapi/spec/upsert-segment-schema.js +8 -17
- package/dist/lib/openapi/spec/upsert-segment-schema.js.map +1 -1
- package/dist/lib/openapi/spec/upsert-segment-schema.test.d.ts +1 -0
- package/dist/lib/openapi/spec/upsert-segment-schema.test.js +35 -0
- package/dist/lib/openapi/spec/upsert-segment-schema.test.js.map +1 -0
- package/dist/lib/openapi/spec/validate-feature-schema.d.ts +6 -0
- package/dist/lib/openapi/spec/validate-feature-schema.js +6 -0
- package/dist/lib/openapi/spec/validate-feature-schema.js.map +1 -1
- package/dist/lib/openapi/spec/variant-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/variant-schema.js +2 -2
- package/dist/lib/openapi/spec/variant-schema.js.map +1 -1
- package/dist/lib/openapi/spec/variants-schema.d.ts +2 -2
- package/dist/lib/openapi/util/all-of.d.ts +3 -0
- package/dist/lib/openapi/util/all-of.js +34 -0
- package/dist/lib/openapi/util/all-of.js.map +1 -0
- package/dist/lib/openapi/util/openapi-tags.d.ts +46 -58
- package/dist/lib/openapi/util/openapi-tags.js +27 -34
- package/dist/lib/openapi/util/openapi-tags.js.map +1 -1
- package/dist/lib/openapi/util/openapi-tags.test.d.ts +1 -0
- package/dist/lib/openapi/util/openapi-tags.test.js +15 -0
- package/dist/lib/openapi/util/openapi-tags.test.js.map +1 -0
- package/dist/lib/openapi/validate.js +0 -1
- package/dist/lib/openapi/validate.js.map +1 -1
- package/dist/lib/routes/admin-api/archive.d.ts +1 -1
- package/dist/lib/routes/admin-api/archive.js +3 -2
- package/dist/lib/routes/admin-api/archive.js.map +1 -1
- package/dist/lib/routes/admin-api/context.js +2 -1
- package/dist/lib/routes/admin-api/context.js.map +1 -1
- package/dist/lib/routes/admin-api/feature.js +2 -1
- package/dist/lib/routes/admin-api/feature.js.map +1 -1
- package/dist/lib/routes/admin-api/index.js +2 -0
- package/dist/lib/routes/admin-api/index.js.map +1 -1
- package/dist/lib/routes/admin-api/instance-admin.d.ts +2 -2
- package/dist/lib/routes/admin-api/instance-admin.js +7 -1
- package/dist/lib/routes/admin-api/instance-admin.js.map +1 -1
- package/dist/lib/routes/admin-api/metrics.d.ts +2 -1
- package/dist/lib/routes/admin-api/metrics.js +2 -1
- package/dist/lib/routes/admin-api/metrics.js.map +1 -1
- package/dist/lib/routes/admin-api/project/api-token.d.ts +2 -1
- package/dist/lib/routes/admin-api/project/api-token.js +12 -3
- package/dist/lib/routes/admin-api/project/api-token.js.map +1 -1
- package/dist/lib/routes/admin-api/project/environments.d.ts +2 -1
- package/dist/lib/routes/admin-api/project/environments.js +3 -1
- package/dist/lib/routes/admin-api/project/environments.js.map +1 -1
- package/dist/lib/routes/admin-api/project/index.d.ts +2 -1
- package/dist/lib/routes/admin-api/project/index.js +31 -0
- package/dist/lib/routes/admin-api/project/index.js.map +1 -1
- package/dist/lib/routes/admin-api/strategy.d.ts +1 -1
- package/dist/lib/routes/admin-api/strategy.js.map +1 -1
- package/dist/lib/routes/client-api/metrics.js +14 -8
- package/dist/lib/routes/client-api/metrics.js.map +1 -1
- package/dist/lib/routes/client-api/metrics.test.js +27 -0
- package/dist/lib/routes/client-api/metrics.test.js.map +1 -1
- package/dist/lib/routes/controller.d.ts +1 -1
- package/dist/lib/routes/controller.js +17 -10
- package/dist/lib/routes/controller.js.map +1 -1
- package/dist/lib/routes/proxy-api/index.js +5 -0
- package/dist/lib/routes/proxy-api/index.js.map +1 -1
- package/dist/lib/schema/role-schema.js +3 -1
- package/dist/lib/schema/role-schema.js.map +1 -1
- package/dist/lib/schema/role-schema.test.js +1 -1
- package/dist/lib/schema/role-schema.test.js.map +1 -1
- package/dist/lib/segments/segment-service-interface.d.ts +1 -1
- package/dist/lib/services/access-service.d.ts +29 -11
- package/dist/lib/services/access-service.js +53 -10
- package/dist/lib/services/access-service.js.map +1 -1
- package/dist/lib/services/access-service.test.js +2 -1
- package/dist/lib/services/access-service.test.js.map +1 -1
- package/dist/lib/services/addon-service.js +4 -2
- package/dist/lib/services/addon-service.js.map +1 -1
- package/dist/lib/services/addon-service.test.js +65 -0
- package/dist/lib/services/addon-service.test.js.map +1 -1
- package/dist/lib/services/client-metrics/instance-service.d.ts +5 -2
- package/dist/lib/services/client-metrics/instance-service.js +22 -3
- package/dist/lib/services/client-metrics/instance-service.js.map +1 -1
- package/dist/lib/services/client-metrics/instance-service.test.js +5 -4
- package/dist/lib/services/client-metrics/instance-service.test.js.map +1 -1
- package/dist/lib/services/context-service.d.ts +6 -2
- package/dist/lib/services/context-service.js +16 -2
- package/dist/lib/services/context-service.js.map +1 -1
- package/dist/lib/services/feature-service-potentially-stale.test.js +1 -1
- package/dist/lib/services/feature-service-potentially-stale.test.js.map +1 -1
- package/dist/lib/services/feature-toggle-service.d.ts +20 -7
- package/dist/lib/services/feature-toggle-service.js +109 -41
- package/dist/lib/services/feature-toggle-service.js.map +1 -1
- package/dist/lib/services/group-service.d.ts +4 -4
- package/dist/lib/services/group-service.js +17 -16
- package/dist/lib/services/group-service.js.map +1 -1
- package/dist/lib/services/index.d.ts +3 -2
- package/dist/lib/services/index.js +31 -17
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/project-schema.js +9 -1
- package/dist/lib/services/project-schema.js.map +1 -1
- package/dist/lib/services/project-service.d.ts +16 -12
- package/dist/lib/services/project-service.js +127 -17
- package/dist/lib/services/project-service.js.map +1 -1
- package/dist/lib/services/scheduler-service.d.ts +1 -1
- package/dist/lib/services/scheduler-service.js +3 -3
- package/dist/lib/services/scheduler-service.js.map +1 -1
- package/dist/lib/services/scheduler-service.test.js +15 -15
- package/dist/lib/services/scheduler-service.test.js.map +1 -1
- package/dist/lib/services/segment-service.d.ts +4 -2
- package/dist/lib/services/segment-service.js +17 -10
- package/dist/lib/services/segment-service.js.map +1 -1
- package/dist/lib/services/state-service.test.js +13 -3
- package/dist/lib/services/state-service.test.js.map +1 -1
- package/dist/lib/services/version-service.test.js +3 -0
- package/dist/lib/services/version-service.test.js.map +1 -1
- package/dist/lib/types/events.d.ts +61 -1
- package/dist/lib/types/events.js +66 -4
- package/dist/lib/types/events.js.map +1 -1
- package/dist/lib/types/experimental.d.ts +1 -1
- package/dist/lib/types/experimental.js +9 -5
- package/dist/lib/types/experimental.js.map +1 -1
- package/dist/lib/types/group.d.ts +2 -2
- package/dist/lib/types/model.d.ts +31 -2
- package/dist/lib/types/model.js.map +1 -1
- package/dist/lib/types/no-auth-user.d.ts +1 -0
- package/dist/lib/types/no-auth-user.js +3 -1
- package/dist/lib/types/no-auth-user.js.map +1 -1
- package/dist/lib/types/option.d.ts +7 -0
- package/dist/lib/types/services.d.ts +6 -1
- package/dist/lib/types/stores/access-store.d.ts +23 -4
- package/dist/lib/types/stores/feature-strategies-store.d.ts +2 -1
- package/dist/lib/types/stores/group-store.d.ts +4 -2
- package/dist/lib/types/stores/project-stats-store-type.d.ts +2 -0
- package/dist/lib/types/stores/project-store.d.ts +7 -14
- package/dist/lib/types/stores/strategy-store.d.ts +3 -17
- package/dist/lib/types/stores.d.ts +5 -1
- package/dist/lib/util/findDuplicates.d.ts +1 -0
- package/dist/lib/util/findDuplicates.js +18 -0
- package/dist/lib/util/findDuplicates.js.map +1 -0
- package/dist/lib/util/findDuplicates.test.d.ts +1 -0
- package/dist/lib/util/findDuplicates.test.js +23 -0
- package/dist/lib/util/findDuplicates.test.js.map +1 -0
- package/dist/migrations/20230830121352-update-client-applications-usage-table.d.ts +2 -0
- package/dist/migrations/20230830121352-update-client-applications-usage-table.js +16 -0
- package/dist/migrations/20230830121352-update-client-applications-usage-table.js.map +1 -0
- package/dist/migrations/20230905122605-add-feature-naming-description.d.ts +2 -0
- package/dist/migrations/20230905122605-add-feature-naming-description.js +13 -0
- package/dist/migrations/20230905122605-add-feature-naming-description.js.map +1 -0
- package/dist/migrations/20230919104006-dependent-features.d.ts +2 -0
- package/dist/migrations/20230919104006-dependent-features.js +21 -0
- package/dist/migrations/20230919104006-dependent-features.js.map +1 -0
- package/dist/migrations/20230927071830-reset-pnps-feedback.d.ts +2 -0
- package/dist/migrations/20230927071830-reset-pnps-feedback.js +10 -0
- package/dist/migrations/20230927071830-reset-pnps-feedback.js.map +1 -0
- package/dist/server-dev.js +7 -4
- package/dist/server-dev.js.map +1 -1
- package/dist/test/e2e/api/admin/addon.e2e.test.js +0 -1
- package/dist/test/e2e/api/admin/addon.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js +8 -12
- package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/event.e2e.test.js +9 -2
- package/dist/test/e2e/api/admin/event.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/metrics.e2e.test.js +2 -10
- package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/environments.e2e.test.js +8 -0
- package/dist/test/e2e/api/admin/project/environments.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/features.e2e.test.js +41 -15
- package/dist/test/e2e/api/admin/project/features.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/project.api.tokens.e2e.test.js +30 -3
- package/dist/test/e2e/api/admin/project/project.api.tokens.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/segment.e2e.test.d.ts +1 -0
- package/dist/test/e2e/api/admin/segment.e2e.test.js +272 -0
- package/dist/test/e2e/api/admin/segment.e2e.test.js.map +1 -0
- package/dist/test/e2e/api/admin/state.e2e.test.js +0 -11
- package/dist/test/e2e/api/admin/state.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/strategy.e2e.test.js +1 -1
- package/dist/test/e2e/api/client/feature.e2e.test.js +27 -3
- package/dist/test/e2e/api/client/feature.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js +2 -2
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/segment.e2e.test.js +1 -1
- package/dist/test/e2e/api/client/segment.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/proxy/proxy.e2e.test.js +34 -9
- package/dist/test/e2e/api/proxy/proxy.e2e.test.js.map +1 -1
- package/dist/test/e2e/helpers/app.utils.d.ts +6 -0
- package/dist/test/e2e/helpers/app.utils.js +16 -0
- package/dist/test/e2e/helpers/app.utils.js.map +1 -0
- package/dist/test/e2e/helpers/database.json +24 -0
- package/dist/test/e2e/services/access-service.e2e.test.js +549 -135
- package/dist/test/e2e/services/access-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/api-token-service.e2e.test.js +4 -2
- package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/client-metrics-service.e2e.test.js +2 -1
- package/dist/test/e2e/services/client-metrics-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js +38 -5
- package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/group-service.e2e.test.js +16 -11
- package/dist/test/e2e/services/group-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/playground-service.test.js +5 -2
- package/dist/test/e2e/services/playground-service.test.js.map +1 -1
- package/dist/test/e2e/services/project-health-service.e2e.test.js +4 -2
- package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/project-service.e2e.test.js +242 -60
- package/dist/test/e2e/services/project-service.e2e.test.js.map +1 -1
- package/dist/test/fixtures/access-service-mock.d.ts +3 -4
- package/dist/test/fixtures/access-service-mock.js.map +1 -1
- package/dist/test/fixtures/fake-access-store.d.ts +15 -5
- package/dist/test/fixtures/fake-access-store.js +30 -3
- package/dist/test/fixtures/fake-access-store.js.map +1 -1
- package/dist/test/fixtures/fake-group-store.d.ts +4 -2
- package/dist/test/fixtures/fake-group-store.js +3 -0
- package/dist/test/fixtures/fake-group-store.js.map +1 -1
- package/dist/test/fixtures/fake-project-stats-store.d.ts +1 -0
- package/dist/test/fixtures/fake-project-stats-store.js +3 -0
- package/dist/test/fixtures/fake-project-stats-store.js.map +1 -1
- package/dist/test/fixtures/fake-project-store.d.ts +2 -1
- package/dist/test/fixtures/fake-project-store.js +3 -0
- package/dist/test/fixtures/fake-project-store.js.map +1 -1
- package/dist/test/fixtures/no-logger.d.ts +2 -1
- package/dist/test/fixtures/no-logger.js +8 -4
- package/dist/test/fixtures/no-logger.js.map +1 -1
- package/dist/test/fixtures/store.js +3 -0
- package/dist/test/fixtures/store.js.map +1 -1
- package/frontend/README.md +7 -1
- package/frontend/build/index.html +2 -2
- package/frontend/build/static/{AdvancedPlayground-1748fcdd.js → AdvancedPlayground-20059178.js} +11 -11
- package/frontend/build/static/CreateProject-6955728f.js +4 -0
- package/frontend/build/static/{Error-cbce6b64.js → Error-f56339ab.js} +1 -1
- package/frontend/build/static/FeatureArchiveDialog-33dc3a5b.js +10 -0
- package/frontend/build/static/{FeatureMetricsChart-8fd8a304.js → FeatureMetricsChart-5ad514bc.js} +2 -2
- package/frontend/build/static/FeatureViewLazyExport-85a68ed0.js +7 -0
- package/frontend/build/static/LazyAdminExport-e2677758.js +35 -0
- package/frontend/build/static/LazyProjectExport-969bb54e.js +24 -0
- package/frontend/build/static/Logo-android-218bddbb.svg +1 -0
- package/frontend/build/static/Logo-flutter-cc3c706f.svg +1 -0
- package/frontend/build/static/Logo-go-02475b3d.svg +1 -0
- package/frontend/build/static/Logo-java-6e556b26.svg +1 -0
- package/frontend/build/static/Logo-javascript-caebc06e.svg +1 -0
- package/frontend/build/static/Logo-net-0a33abee.svg +1 -0
- package/frontend/build/static/Logo-node-318ed025.svg +1 -0
- package/frontend/build/static/Logo-php-201f18c3.svg +1 -0
- package/frontend/build/static/Logo-python-4305760e.svg +1 -0
- package/frontend/build/static/Logo-react-18e98687.svg +1 -0
- package/frontend/build/static/Logo-ruby-58f46832.svg +1 -0
- package/frontend/build/static/Logo-rust-c83a80f9.svg +1 -0
- package/frontend/build/static/Logo-svelte-97dcb624.svg +1 -0
- package/frontend/build/static/Logo-swift-315f842b.svg +5 -0
- package/frontend/build/static/Logo-vue-0de73099.svg +1 -0
- package/frontend/build/static/{NetworkOverview-349a7bdd.js → NetworkOverview-894877e6.js} +2 -2
- package/frontend/build/static/{NetworkTraffic-60478e50.js → NetworkTraffic-81eff1ae.js} +1 -1
- package/frontend/build/static/ReactJSONEditor-59c8a094.js +129 -0
- package/frontend/build/static/RoleCell-35857d41.js +1 -0
- package/frontend/build/static/{StrategyItemContainer-a4caeace.js → StrategyItemContainer-b250f2d4.js} +1 -1
- package/frontend/build/static/{chartjs-adapter-date-fns.esm-03d2fbea.js → chartjs-adapter-date-fns.esm-c51fe022.js} +1 -1
- package/frontend/build/static/cr-db7653ac.png +0 -0
- package/frontend/build/static/datadog-543762b6.svg +5 -0
- package/frontend/build/static/edge-daisy-chaining-012bfdef.svg +48 -0
- package/frontend/build/static/edge-mode-5d25949b.svg +22 -0
- package/frontend/build/static/edge-offline-f6a0f761.svg +19 -0
- package/frontend/build/static/{flowchart-elk-definition-170a3958-fc100c77.js → flowchart-elk-definition-170a3958-a8c4a86a.js} +1 -1
- package/frontend/build/static/{index-866f9bf9.js → index-0515f416.js} +1 -1
- package/frontend/build/static/index-942e9eeb.js +463 -0
- package/frontend/build/static/{index-3c63138f.js → index-a59b2d65.js} +1 -1
- package/frontend/build/static/{is_dark-31c253e9.js → is_dark-464961a8.js} +1 -1
- package/frontend/build/static/jira-1abe7cbf.svg +17 -0
- package/frontend/build/static/{mindmap-definition-44684416-398682f9.js → mindmap-definition-44684416-3a71a9a5.js} +1 -1
- package/frontend/build/static/slack-36ce798a.svg +18 -0
- package/frontend/build/static/style-97d3ef98.css +1 -0
- package/frontend/build/static/teams-4e30b51f.svg +45 -0
- package/frontend/build/static/{timeline-definition-8e5a9bc6-04a0ae08.js → timeline-definition-8e5a9bc6-da4ebc88.js} +1 -1
- package/frontend/build/static/{unknownify-b8618d88.js → unknownify-3563456b.js} +1 -1
- package/frontend/build/static/unleash-integration-949d8966.svg +1 -0
- package/frontend/build/static/webhooks-b1b44207.svg +16 -0
- package/frontend/package.json +20 -18
- package/package.json +23 -23
- package/dist/lib/services/instance-stats-service.js.map +0 -1
- package/dist/lib/services/instance-stats-service.test.js.map +0 -1
- package/frontend/build/static/CreateProject-972fa820.js +0 -4
- package/frontend/build/static/FeatureArchiveDialog-8a281845.js +0 -10
- package/frontend/build/static/FeatureViewLazyExport-a215d53b.js +0 -7
- package/frontend/build/static/LazyAdminExport-ba7d55ca.js +0 -35
- package/frontend/build/static/LazyProjectExport-12bccd40.js +0 -17
- package/frontend/build/static/RoleCell-144e7eca.js +0 -1
- package/frontend/build/static/datadog-591b6a73.svg +0 -1
- package/frontend/build/static/index-17d74ac9.js +0 -454
- package/frontend/build/static/slack-c0af31c6.svg +0 -1
- package/frontend/build/static/style-770afaee.css +0 -1
- package/frontend/build/static/teams-62e72076.svg +0 -26
- package/frontend/build/static/webhooks-ffa904ac.svg +0 -1
- /package/dist/lib/{services/instance-stats-service.test.d.ts → db/access-store.test.d.ts} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
await
|
|
66
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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
|
|
132
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
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
|
|
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
|
|
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
|
|
533
|
-
|
|
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
|
-
|
|
551
|
-
|
|
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
|
|
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
|
|
576
|
-
|
|
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
|
|
599
|
-
|
|
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
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
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
|
|
631
|
-
const
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
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
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
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
|
|
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
|
|
669
|
-
const groupWithoutRootRole = await
|
|
670
|
-
|
|
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
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
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
|