@decaf-ts/integrations 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/integrations.cjs +1649 -2
- package/dist/integrations.js +1885 -2
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/azure/index.cjs +2 -2
- package/lib/cjs/blob/core/BlobErrors.cjs +2 -2
- package/lib/cjs/blob/core/BlobKey.cjs +2 -2
- package/lib/cjs/blob/core/BlobStoreFactory.cjs +2 -2
- package/lib/cjs/blob/core/BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/core/BlobTypes.cjs +2 -2
- package/lib/cjs/blob/core/BlobValue.cjs +2 -2
- package/lib/cjs/blob/core/index.cjs +2 -2
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/gcp/index.cjs +2 -2
- package/lib/cjs/blob/index.cjs +2 -2
- package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/index.cjs +2 -2
- package/lib/cjs/blob/local/LocalBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/local/index.cjs +2 -2
- package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/memory/index.cjs +2 -2
- package/lib/cjs/blob/s3/MinioBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/R2BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/index.cjs +2 -2
- package/lib/cjs/docker/DockerComposeService.cjs +2 -2
- package/lib/cjs/docker/index.cjs +2 -2
- package/lib/cjs/graph/constants.cjs +2 -2
- package/lib/cjs/graph/decorators.cjs +2 -2
- package/lib/cjs/graph/errors/GraphCycleError.cjs +2 -2
- package/lib/cjs/graph/errors/GraphExecutionError.cjs +2 -2
- package/lib/cjs/graph/errors/GraphInputError.cjs +2 -2
- package/lib/cjs/graph/errors/GraphLoopLimitError.cjs +2 -2
- package/lib/cjs/graph/errors/GraphPinningError.cjs +2 -2
- package/lib/cjs/graph/errors/GraphPortError.cjs +2 -2
- package/lib/cjs/graph/errors/GraphStoreError.cjs +2 -2
- package/lib/cjs/graph/errors/GraphTopologyError.cjs +2 -2
- package/lib/cjs/graph/errors/index.cjs +2 -2
- package/lib/cjs/graph/events/GraphExecutionEvent.cjs +2 -2
- package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs +2 -2
- package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs +2 -2
- package/lib/cjs/graph/events/GraphExecutionObserver.cjs +2 -2
- package/lib/cjs/graph/events/index.cjs +2 -2
- package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs +2 -2
- package/lib/cjs/graph/execution/GraphExecutionContext.cjs +2 -2
- package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +2 -2
- package/lib/cjs/graph/execution/GraphExecutionFrame.cjs +2 -2
- package/lib/cjs/graph/execution/GraphExecutionResult.cjs +2 -2
- package/lib/cjs/graph/execution/GraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/execution/index.cjs +2 -2
- package/lib/cjs/graph/index.cjs +2 -2
- package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +2 -2
- package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +2 -2
- package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs +2 -2
- package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/loops/index.cjs +2 -2
- package/lib/cjs/graph/nodes/agent.cjs +2 -2
- package/lib/cjs/graph/nodes/base.cjs +35 -0
- package/lib/cjs/graph/nodes/category-styles.cjs +2 -2
- package/lib/cjs/graph/nodes/flow-control.cjs +31 -3
- package/lib/cjs/graph/nodes/index.cjs +3 -2
- package/lib/cjs/graph/nodes/triggers.cjs +2 -2
- package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs +2 -2
- package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs +2 -2
- package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs +2 -2
- package/lib/cjs/graph/pinning/GraphPinningService.cjs +2 -2
- package/lib/cjs/graph/pinning/index.cjs +2 -2
- package/lib/cjs/graph/planning/GraphExecutionPlan.cjs +2 -2
- package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs +2 -2
- package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs +2 -2
- package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs +2 -2
- package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs +2 -2
- package/lib/cjs/graph/planning/GraphRelationResolver.cjs +2 -2
- package/lib/cjs/graph/planning/GraphTopology.cjs +2 -2
- package/lib/cjs/graph/planning/index.cjs +2 -2
- package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs +2 -2
- package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +2 -2
- package/lib/cjs/graph/registry/index.cjs +2 -2
- package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +2 -2
- package/lib/cjs/graph/snapshots/index.cjs +2 -2
- package/lib/cjs/graph/store/GraphCachedValue.cjs +2 -2
- package/lib/cjs/graph/store/GraphValueKey.cjs +2 -2
- package/lib/cjs/graph/store/GraphValueStore.cjs +2 -2
- package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs +2 -2
- package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs +2 -2
- package/lib/cjs/graph/store/index.cjs +2 -2
- package/lib/cjs/graph/types.cjs +2 -2
- package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs +2 -2
- package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs +2 -2
- package/lib/cjs/graph/validation/GraphValueValidator.cjs +2 -2
- package/lib/cjs/graph/validation/index.cjs +2 -2
- package/lib/cjs/index.cjs +6 -5
- package/lib/cjs/keycloak/index.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs +2 -2
- package/lib/cjs/keycloak/services/index.cjs +2 -2
- package/lib/cjs/keycloak/services/runtime.cjs +2 -2
- package/lib/cjs/keycloak/types.cjs +2 -2
- package/lib/cjs/kibana/helpers.cjs +2 -2
- package/lib/cjs/kibana/index.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaAuthService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaRoleService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaUserService.cjs +2 -2
- package/lib/cjs/kibana/services/index.cjs +2 -2
- package/lib/cjs/kibana/services/runtime.cjs +2 -2
- package/lib/cjs/kibana/types.cjs +2 -2
- package/lib/cjs/namespaces/index.cjs +26 -0
- package/lib/cjs/namespaces/models/authorization-model.cjs +12 -0
- package/lib/cjs/namespaces/models/effective-permission.model.cjs +95 -0
- package/lib/cjs/namespaces/models/group-membership.model.cjs +66 -0
- package/lib/cjs/namespaces/models/group.model.cjs +74 -0
- package/lib/cjs/namespaces/models/index.cjs +39 -0
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs +76 -0
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +66 -0
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +73 -0
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +64 -0
- package/lib/cjs/namespaces/models/org-unit.model.cjs +102 -0
- package/lib/cjs/namespaces/models/permission.model.cjs +64 -0
- package/lib/cjs/namespaces/models/principal.model.cjs +77 -0
- package/lib/cjs/namespaces/models/protected-resource.model.cjs +99 -0
- package/lib/cjs/namespaces/models/resource-grant.model.cjs +88 -0
- package/lib/cjs/namespaces/models/role-assignment.model.cjs +98 -0
- package/lib/cjs/namespaces/models/role-permission.model.cjs +55 -0
- package/lib/cjs/namespaces/models/role.model.cjs +84 -0
- package/lib/cjs/namespaces/models/storage-binding.model.cjs +85 -0
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs +67 -0
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs +64 -0
- package/lib/cjs/namespaces/models/tenant.model.cjs +88 -0
- package/lib/cjs/namespaces/models/user.model.cjs +75 -0
- package/lib/cjs/namespaces/org-based-authorization-system.cjs +286 -0
- package/lib/cjs/namespaces/org-based-authorization-system.models.cjs +968 -0
- package/lib/cjs/namespaces/org-based-authorization-system.services.cjs +1046 -0
- package/lib/cjs/namespaces/services/authz.service.cjs +76 -0
- package/lib/cjs/namespaces/services/bootstrap.service.cjs +112 -0
- package/lib/cjs/namespaces/services/effective-permission.service.cjs +150 -0
- package/lib/cjs/namespaces/services/group-membership.service.cjs +42 -0
- package/lib/cjs/namespaces/services/group.service.cjs +30 -0
- package/lib/cjs/namespaces/services/index.cjs +42 -0
- package/lib/cjs/namespaces/services/inheritance-block.service.cjs +32 -0
- package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +55 -0
- package/lib/cjs/namespaces/services/org-unit-membership.service.cjs +34 -0
- package/lib/cjs/namespaces/services/org-unit-profile.service.cjs +23 -0
- package/lib/cjs/namespaces/services/org-unit.service.cjs +160 -0
- package/lib/cjs/namespaces/services/permission.service.cjs +29 -0
- package/lib/cjs/namespaces/services/principal.service.cjs +35 -0
- package/lib/cjs/namespaces/services/protected-resource.service.cjs +43 -0
- package/lib/cjs/namespaces/services/resource-grant.service.cjs +45 -0
- package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs +24 -0
- package/lib/cjs/namespaces/services/role-assignment.service.cjs +41 -0
- package/lib/cjs/namespaces/services/role-permission.service.cjs +51 -0
- package/lib/cjs/namespaces/services/role.service.cjs +45 -0
- package/lib/cjs/namespaces/services/storage-binding.service.cjs +39 -0
- package/lib/cjs/namespaces/services/system-management.service.cjs +102 -0
- package/lib/cjs/namespaces/services/tenant-membership.service.cjs +33 -0
- package/lib/cjs/namespaces/services/tenant-profile.service.cjs +28 -0
- package/lib/cjs/namespaces/services/tenant.service.cjs +36 -0
- package/lib/cjs/namespaces/services/user.service.cjs +32 -0
- package/lib/cjs/namespaces/types.cjs +67 -0
- package/lib/cjs/namespaces/utils.cjs +161 -0
- package/lib/cjs/nest/authService.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionController.cjs +153 -0
- package/lib/cjs/nest/graph/GraphExecutionModule.cjs +84 -0
- package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs +82 -0
- package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs +66 -0
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +35 -0
- package/lib/cjs/nest/graph/index.cjs +28 -0
- package/lib/cjs/nest/index.cjs +3 -2
- package/lib/cjs/nest/keycloakAuthHandler.cjs +2 -2
- package/lib/cjs/nest/keycloakModule.cjs +2 -2
- package/lib/cjs/nest/logging.cjs +2 -2
- package/lib/cjs/nest/types.cjs +2 -2
- package/lib/cjs/nest/utils.cjs +2 -2
- package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -2
- package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/aws/index.cjs +2 -2
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -2
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/azure/index.cjs +2 -2
- package/lib/cjs/secrets/core/SecretErrors.cjs +2 -2
- package/lib/cjs/secrets/core/SecretName.cjs +2 -2
- package/lib/cjs/secrets/core/SecretReference.cjs +2 -2
- package/lib/cjs/secrets/core/SecretSerialization.cjs +2 -2
- package/lib/cjs/secrets/core/SecretService.cjs +2 -2
- package/lib/cjs/secrets/core/SecretTypes.cjs +2 -2
- package/lib/cjs/secrets/core/index.cjs +2 -2
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -2
- package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/gcp/index.cjs +2 -2
- package/lib/cjs/secrets/index.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretCrypto.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretService.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/model/Secret.cjs +2 -2
- package/lib/cjs/secrets/model/index.cjs +2 -2
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -2
- package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/onepassword/index.cjs +2 -2
- package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -2
- package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/vault/index.cjs +2 -2
- package/lib/cjs/shared/runtime.cjs +2 -2
- package/lib/cjs/utils.cjs +2 -2
- package/lib/esm/blob/azure/AzureBlobStoreService.js +1 -1
- package/lib/esm/blob/azure/index.js +1 -1
- package/lib/esm/blob/core/BlobErrors.js +1 -1
- package/lib/esm/blob/core/BlobKey.js +1 -1
- package/lib/esm/blob/core/BlobStoreFactory.js +1 -1
- package/lib/esm/blob/core/BlobStoreService.js +1 -1
- package/lib/esm/blob/core/BlobTypes.js +1 -1
- package/lib/esm/blob/core/BlobValue.js +1 -1
- package/lib/esm/blob/core/index.js +1 -1
- package/lib/esm/blob/gcp/GcsBlobStoreService.js +1 -1
- package/lib/esm/blob/gcp/index.js +1 -1
- package/lib/esm/blob/index.js +1 -1
- package/lib/esm/blob/ipfs/IpfsBlobStoreService.js +1 -1
- package/lib/esm/blob/ipfs/IpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/index.js +1 -1
- package/lib/esm/blob/local/LocalBlobStoreService.js +1 -1
- package/lib/esm/blob/local/index.js +1 -1
- package/lib/esm/blob/memory/MemoryBlobStoreService.js +1 -1
- package/lib/esm/blob/memory/index.js +1 -1
- package/lib/esm/blob/s3/MinioBlobStoreService.js +1 -1
- package/lib/esm/blob/s3/R2BlobStoreService.js +1 -1
- package/lib/esm/blob/s3/S3BlobStoreService.js +1 -1
- package/lib/esm/blob/s3/index.js +1 -1
- package/lib/esm/docker/DockerComposeService.js +1 -1
- package/lib/esm/docker/index.js +1 -1
- package/lib/esm/graph/constants.js +1 -1
- package/lib/esm/graph/decorators.js +1 -1
- package/lib/esm/graph/errors/GraphCycleError.js +1 -1
- package/lib/esm/graph/errors/GraphExecutionError.js +1 -1
- package/lib/esm/graph/errors/GraphInputError.js +1 -1
- package/lib/esm/graph/errors/GraphLoopLimitError.js +1 -1
- package/lib/esm/graph/errors/GraphPinningError.js +1 -1
- package/lib/esm/graph/errors/GraphPortError.js +1 -1
- package/lib/esm/graph/errors/GraphStoreError.js +1 -1
- package/lib/esm/graph/errors/GraphTopologyError.js +1 -1
- package/lib/esm/graph/errors/index.js +1 -1
- package/lib/esm/graph/events/GraphExecutionEvent.js +1 -1
- package/lib/esm/graph/events/GraphExecutionEventEmitter.js +1 -1
- package/lib/esm/graph/events/GraphExecutionEventFactory.js +1 -1
- package/lib/esm/graph/events/GraphExecutionObserver.js +1 -1
- package/lib/esm/graph/events/index.js +1 -1
- package/lib/esm/graph/execution/CodeSandboxEvaluator.js +1 -1
- package/lib/esm/graph/execution/GraphExecutionContext.js +1 -1
- package/lib/esm/graph/execution/GraphExecutionEngine.js +1 -1
- package/lib/esm/graph/execution/GraphExecutionFrame.js +1 -1
- package/lib/esm/graph/execution/GraphExecutionResult.js +1 -1
- package/lib/esm/graph/execution/GraphNodeExecutor.js +1 -1
- package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/execution/index.js +1 -1
- package/lib/esm/graph/index.js +1 -1
- package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +1 -1
- package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/loops/GraphConditionEvaluator.js +1 -1
- package/lib/esm/graph/loops/GraphLoopExecutionContext.js +1 -1
- package/lib/esm/graph/loops/UntilGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/loops/WhileGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/loops/index.js +1 -1
- package/lib/esm/graph/nodes/agent.js +1 -1
- package/lib/esm/graph/nodes/base.js +30 -0
- package/lib/esm/graph/nodes/category-styles.js +1 -1
- package/lib/esm/graph/nodes/flow-control.js +31 -3
- package/lib/esm/graph/nodes/index.js +2 -1
- package/lib/esm/graph/nodes/triggers.js +1 -1
- package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js +1 -1
- package/lib/esm/graph/pinning/GraphPinningMetadata.js +1 -1
- package/lib/esm/graph/pinning/GraphPinningPolicy.js +1 -1
- package/lib/esm/graph/pinning/GraphPinningService.js +1 -1
- package/lib/esm/graph/pinning/index.js +1 -1
- package/lib/esm/graph/planning/GraphExecutionPlan.js +1 -1
- package/lib/esm/graph/planning/GraphExecutionPlanEdge.js +1 -1
- package/lib/esm/graph/planning/GraphExecutionPlanLayer.js +1 -1
- package/lib/esm/graph/planning/GraphExecutionPlanNode.js +1 -1
- package/lib/esm/graph/planning/GraphExecutionPlanner.js +1 -1
- package/lib/esm/graph/planning/GraphRelationResolver.js +1 -1
- package/lib/esm/graph/planning/GraphTopology.js +1 -1
- package/lib/esm/graph/planning/index.js +1 -1
- package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js +1 -1
- package/lib/esm/graph/registry/GraphNodeExecutorResolver.js +1 -1
- package/lib/esm/graph/registry/index.js +1 -1
- package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js +1 -1
- package/lib/esm/graph/snapshots/index.js +1 -1
- package/lib/esm/graph/store/GraphCachedValue.js +1 -1
- package/lib/esm/graph/store/GraphValueKey.js +1 -1
- package/lib/esm/graph/store/GraphValueStore.js +1 -1
- package/lib/esm/graph/store/GraphValueStoreAdapter.js +1 -1
- package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js +1 -1
- package/lib/esm/graph/store/index.js +1 -1
- package/lib/esm/graph/types.js +1 -1
- package/lib/esm/graph/validation/GraphDefinitionValidator.js +1 -1
- package/lib/esm/graph/validation/GraphPortSchemaResolver.js +1 -1
- package/lib/esm/graph/validation/GraphValueValidator.js +1 -1
- package/lib/esm/graph/validation/index.js +1 -1
- package/lib/esm/index.js +5 -4
- package/lib/esm/keycloak/index.js +1 -1
- package/lib/esm/keycloak/services/KeycloakAuthService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakClientService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakRealmService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakRoleService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakUserService.js +1 -1
- package/lib/esm/keycloak/services/index.js +1 -1
- package/lib/esm/keycloak/services/runtime.js +1 -1
- package/lib/esm/keycloak/types.js +1 -1
- package/lib/esm/kibana/helpers.js +1 -1
- package/lib/esm/kibana/index.js +1 -1
- package/lib/esm/kibana/services/KibanaAuthService.js +1 -1
- package/lib/esm/kibana/services/KibanaDashboardService.js +1 -1
- package/lib/esm/kibana/services/KibanaDataViewService.js +1 -1
- package/lib/esm/kibana/services/KibanaRoleService.js +1 -1
- package/lib/esm/kibana/services/KibanaService.js +1 -1
- package/lib/esm/kibana/services/KibanaSpaceService.js +1 -1
- package/lib/esm/kibana/services/KibanaUserService.js +1 -1
- package/lib/esm/kibana/services/index.js +1 -1
- package/lib/esm/kibana/services/runtime.js +1 -1
- package/lib/esm/kibana/types.js +1 -1
- package/lib/esm/namespaces/index.js +9 -0
- package/lib/esm/namespaces/models/authorization-model.js +7 -0
- package/lib/esm/namespaces/models/effective-permission.model.js +86 -0
- package/lib/esm/namespaces/models/group-membership.model.js +57 -0
- package/lib/esm/namespaces/models/group.model.js +65 -0
- package/lib/esm/namespaces/models/index.js +22 -0
- package/lib/esm/namespaces/models/inheritance-block.model.js +67 -0
- package/lib/esm/namespaces/models/org-unit-closure.model.js +57 -0
- package/lib/esm/namespaces/models/org-unit-membership.model.js +64 -0
- package/lib/esm/namespaces/models/org-unit-profile.model.js +55 -0
- package/lib/esm/namespaces/models/org-unit.model.js +93 -0
- package/lib/esm/namespaces/models/permission.model.js +55 -0
- package/lib/esm/namespaces/models/principal.model.js +68 -0
- package/lib/esm/namespaces/models/protected-resource.model.js +90 -0
- package/lib/esm/namespaces/models/resource-grant.model.js +79 -0
- package/lib/esm/namespaces/models/role-assignment.model.js +89 -0
- package/lib/esm/namespaces/models/role-permission.model.js +46 -0
- package/lib/esm/namespaces/models/role.model.js +75 -0
- package/lib/esm/namespaces/models/storage-binding.model.js +76 -0
- package/lib/esm/namespaces/models/tenant-membership.model.js +58 -0
- package/lib/esm/namespaces/models/tenant-profile.model.js +55 -0
- package/lib/esm/namespaces/models/tenant.model.js +79 -0
- package/lib/esm/namespaces/models/user.model.js +66 -0
- package/lib/esm/namespaces/org-based-authorization-system.js +283 -0
- package/lib/esm/namespaces/org-based-authorization-system.models.js +958 -0
- package/lib/esm/namespaces/org-based-authorization-system.services.js +1014 -0
- package/lib/esm/namespaces/services/authz.service.js +71 -0
- package/lib/esm/namespaces/services/bootstrap.service.js +102 -0
- package/lib/esm/namespaces/services/effective-permission.service.js +140 -0
- package/lib/esm/namespaces/services/group-membership.service.js +37 -0
- package/lib/esm/namespaces/services/group.service.js +25 -0
- package/lib/esm/namespaces/services/index.js +25 -0
- package/lib/esm/namespaces/services/inheritance-block.service.js +27 -0
- package/lib/esm/namespaces/services/org-unit-closure.service.js +50 -0
- package/lib/esm/namespaces/services/org-unit-membership.service.js +29 -0
- package/lib/esm/namespaces/services/org-unit-profile.service.js +18 -0
- package/lib/esm/namespaces/services/org-unit.service.js +150 -0
- package/lib/esm/namespaces/services/permission.service.js +24 -0
- package/lib/esm/namespaces/services/principal.service.js +30 -0
- package/lib/esm/namespaces/services/protected-resource.service.js +38 -0
- package/lib/esm/namespaces/services/resource-grant.service.js +40 -0
- package/lib/esm/namespaces/services/resource-lifecycle.service.js +19 -0
- package/lib/esm/namespaces/services/role-assignment.service.js +36 -0
- package/lib/esm/namespaces/services/role-permission.service.js +46 -0
- package/lib/esm/namespaces/services/role.service.js +40 -0
- package/lib/esm/namespaces/services/storage-binding.service.js +34 -0
- package/lib/esm/namespaces/services/system-management.service.js +92 -0
- package/lib/esm/namespaces/services/tenant-membership.service.js +28 -0
- package/lib/esm/namespaces/services/tenant-profile.service.js +23 -0
- package/lib/esm/namespaces/services/tenant.service.js +31 -0
- package/lib/esm/namespaces/services/user.service.js +27 -0
- package/lib/esm/namespaces/types.js +71 -0
- package/lib/esm/namespaces/utils.js +143 -0
- package/lib/esm/nest/authService.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionController.js +144 -0
- package/lib/esm/nest/graph/GraphExecutionModule.js +76 -0
- package/lib/esm/nest/graph/GraphExecutionResultModel.js +73 -0
- package/lib/esm/nest/graph/GraphExecutionResultRepository.js +60 -0
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +31 -0
- package/lib/esm/nest/graph/index.js +11 -0
- package/lib/esm/nest/index.js +2 -1
- package/lib/esm/nest/keycloakAuthHandler.js +1 -1
- package/lib/esm/nest/keycloakModule.js +1 -1
- package/lib/esm/nest/logging.js +1 -1
- package/lib/esm/nest/types.js +1 -1
- package/lib/esm/nest/utils.js +1 -1
- package/lib/esm/secrets/aws/AwsSecretService.js +1 -1
- package/lib/esm/secrets/aws/AwsSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/aws/index.js +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/azure/index.js +1 -1
- package/lib/esm/secrets/core/SecretErrors.js +1 -1
- package/lib/esm/secrets/core/SecretName.js +1 -1
- package/lib/esm/secrets/core/SecretReference.js +1 -1
- package/lib/esm/secrets/core/SecretSerialization.js +1 -1
- package/lib/esm/secrets/core/SecretService.js +1 -1
- package/lib/esm/secrets/core/SecretTypes.js +1 -1
- package/lib/esm/secrets/core/index.js +1 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js +1 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js +1 -1
- package/lib/esm/secrets/gcp/index.js +1 -1
- package/lib/esm/secrets/index.js +1 -1
- package/lib/esm/secrets/model/ModelSecretCrypto.js +1 -1
- package/lib/esm/secrets/model/ModelSecretService.js +1 -1
- package/lib/esm/secrets/model/ModelSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/model/Secret.js +1 -1
- package/lib/esm/secrets/model/index.js +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/onepassword/index.js +1 -1
- package/lib/esm/secrets/vault/VaultSecretService.js +1 -1
- package/lib/esm/secrets/vault/VaultSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/vault/index.js +1 -1
- package/lib/esm/shared/runtime.js +1 -1
- package/lib/esm/utils.js +1 -1
- package/lib/types/graph/nodes/base.d.cts +28 -0
- package/lib/types/graph/nodes/base.d.mts +28 -0
- package/lib/types/graph/nodes/flow-control.d.cts +9 -1
- package/lib/types/graph/nodes/flow-control.d.mts +9 -1
- package/lib/types/graph/nodes/index.d.cts +1 -0
- package/lib/types/graph/nodes/index.d.mts +1 -0
- package/lib/types/graph/types.d.cts +15 -1
- package/lib/types/graph/types.d.mts +15 -1
- package/lib/types/index.d.cts +3 -2
- package/lib/types/index.d.mts +3 -2
- package/lib/types/namespaces/index.d.cts +8 -0
- package/lib/types/namespaces/index.d.mts +8 -0
- package/lib/types/namespaces/models/authorization-model.d.cts +4 -0
- package/lib/types/namespaces/models/authorization-model.d.mts +4 -0
- package/lib/types/namespaces/models/effective-permission.model.d.cts +18 -0
- package/lib/types/namespaces/models/effective-permission.model.d.mts +18 -0
- package/lib/types/namespaces/models/group-membership.model.d.cts +13 -0
- package/lib/types/namespaces/models/group-membership.model.d.mts +13 -0
- package/lib/types/namespaces/models/group.model.d.cts +15 -0
- package/lib/types/namespaces/models/group.model.d.mts +15 -0
- package/lib/types/namespaces/models/index.d.cts +21 -0
- package/lib/types/namespaces/models/index.d.mts +21 -0
- package/lib/types/namespaces/models/inheritance-block.model.d.cts +15 -0
- package/lib/types/namespaces/models/inheritance-block.model.d.mts +15 -0
- package/lib/types/namespaces/models/org-unit-closure.model.d.cts +12 -0
- package/lib/types/namespaces/models/org-unit-closure.model.d.mts +12 -0
- package/lib/types/namespaces/models/org-unit-membership.model.d.cts +15 -0
- package/lib/types/namespaces/models/org-unit-membership.model.d.mts +15 -0
- package/lib/types/namespaces/models/org-unit-profile.model.d.cts +11 -0
- package/lib/types/namespaces/models/org-unit-profile.model.d.mts +11 -0
- package/lib/types/namespaces/models/org-unit.model.d.cts +23 -0
- package/lib/types/namespaces/models/org-unit.model.d.mts +23 -0
- package/lib/types/namespaces/models/permission.model.d.cts +11 -0
- package/lib/types/namespaces/models/permission.model.d.mts +11 -0
- package/lib/types/namespaces/models/principal.model.d.cts +16 -0
- package/lib/types/namespaces/models/principal.model.d.mts +16 -0
- package/lib/types/namespaces/models/protected-resource.model.d.cts +21 -0
- package/lib/types/namespaces/models/protected-resource.model.d.mts +21 -0
- package/lib/types/namespaces/models/resource-grant.model.d.cts +18 -0
- package/lib/types/namespaces/models/resource-grant.model.d.mts +18 -0
- package/lib/types/namespaces/models/role-assignment.model.d.cts +20 -0
- package/lib/types/namespaces/models/role-assignment.model.d.mts +20 -0
- package/lib/types/namespaces/models/role-permission.model.d.cts +10 -0
- package/lib/types/namespaces/models/role-permission.model.d.mts +10 -0
- package/lib/types/namespaces/models/role.model.d.cts +17 -0
- package/lib/types/namespaces/models/role.model.d.mts +17 -0
- package/lib/types/namespaces/models/storage-binding.model.d.cts +15 -0
- package/lib/types/namespaces/models/storage-binding.model.d.mts +15 -0
- package/lib/types/namespaces/models/tenant-membership.model.d.cts +13 -0
- package/lib/types/namespaces/models/tenant-membership.model.d.mts +13 -0
- package/lib/types/namespaces/models/tenant-profile.model.d.cts +11 -0
- package/lib/types/namespaces/models/tenant-profile.model.d.mts +11 -0
- package/lib/types/namespaces/models/tenant.model.d.cts +19 -0
- package/lib/types/namespaces/models/tenant.model.d.mts +19 -0
- package/lib/types/namespaces/models/user.model.d.cts +14 -0
- package/lib/types/namespaces/models/user.model.d.mts +14 -0
- package/lib/types/namespaces/org-based-authorization-system.d.cts +299 -0
- package/lib/types/namespaces/org-based-authorization-system.d.mts +299 -0
- package/lib/types/namespaces/org-based-authorization-system.models.d.cts +212 -0
- package/lib/types/namespaces/org-based-authorization-system.models.d.mts +212 -0
- package/lib/types/namespaces/org-based-authorization-system.services.d.cts +217 -0
- package/lib/types/namespaces/org-based-authorization-system.services.d.mts +217 -0
- package/lib/types/namespaces/services/authz.service.d.cts +10 -0
- package/lib/types/namespaces/services/authz.service.d.mts +10 -0
- package/lib/types/namespaces/services/bootstrap.service.d.cts +21 -0
- package/lib/types/namespaces/services/bootstrap.service.d.mts +21 -0
- package/lib/types/namespaces/services/effective-permission.service.d.cts +13 -0
- package/lib/types/namespaces/services/effective-permission.service.d.mts +13 -0
- package/lib/types/namespaces/services/group-membership.service.d.cts +10 -0
- package/lib/types/namespaces/services/group-membership.service.d.mts +10 -0
- package/lib/types/namespaces/services/group.service.d.cts +9 -0
- package/lib/types/namespaces/services/group.service.d.mts +9 -0
- package/lib/types/namespaces/services/index.d.cts +24 -0
- package/lib/types/namespaces/services/index.d.mts +24 -0
- package/lib/types/namespaces/services/inheritance-block.service.d.cts +10 -0
- package/lib/types/namespaces/services/inheritance-block.service.d.mts +10 -0
- package/lib/types/namespaces/services/org-unit-closure.service.d.cts +11 -0
- package/lib/types/namespaces/services/org-unit-closure.service.d.mts +11 -0
- package/lib/types/namespaces/services/org-unit-membership.service.d.cts +11 -0
- package/lib/types/namespaces/services/org-unit-membership.service.d.mts +11 -0
- package/lib/types/namespaces/services/org-unit-profile.service.d.cts +7 -0
- package/lib/types/namespaces/services/org-unit-profile.service.d.mts +7 -0
- package/lib/types/namespaces/services/org-unit.service.d.cts +18 -0
- package/lib/types/namespaces/services/org-unit.service.d.mts +18 -0
- package/lib/types/namespaces/services/permission.service.d.cts +10 -0
- package/lib/types/namespaces/services/permission.service.d.mts +10 -0
- package/lib/types/namespaces/services/principal.service.d.cts +11 -0
- package/lib/types/namespaces/services/principal.service.d.mts +11 -0
- package/lib/types/namespaces/services/protected-resource.service.d.cts +13 -0
- package/lib/types/namespaces/services/protected-resource.service.d.mts +13 -0
- package/lib/types/namespaces/services/resource-grant.service.d.cts +12 -0
- package/lib/types/namespaces/services/resource-grant.service.d.mts +12 -0
- package/lib/types/namespaces/services/resource-lifecycle.service.d.cts +10 -0
- package/lib/types/namespaces/services/resource-lifecycle.service.d.mts +10 -0
- package/lib/types/namespaces/services/role-assignment.service.d.cts +12 -0
- package/lib/types/namespaces/services/role-assignment.service.d.mts +12 -0
- package/lib/types/namespaces/services/role-permission.service.d.cts +12 -0
- package/lib/types/namespaces/services/role-permission.service.d.mts +12 -0
- package/lib/types/namespaces/services/role.service.d.cts +12 -0
- package/lib/types/namespaces/services/role.service.d.mts +12 -0
- package/lib/types/namespaces/services/storage-binding.service.d.cts +12 -0
- package/lib/types/namespaces/services/storage-binding.service.d.mts +12 -0
- package/lib/types/namespaces/services/system-management.service.d.cts +14 -0
- package/lib/types/namespaces/services/system-management.service.d.mts +14 -0
- package/lib/types/namespaces/services/tenant-membership.service.d.cts +11 -0
- package/lib/types/namespaces/services/tenant-membership.service.d.mts +11 -0
- package/lib/types/namespaces/services/tenant-profile.service.d.cts +8 -0
- package/lib/types/namespaces/services/tenant-profile.service.d.mts +8 -0
- package/lib/types/namespaces/services/tenant.service.d.cts +12 -0
- package/lib/types/namespaces/services/tenant.service.d.mts +12 -0
- package/lib/types/namespaces/services/user.service.d.cts +11 -0
- package/lib/types/namespaces/services/user.service.d.mts +11 -0
- package/lib/types/namespaces/types.d.cts +230 -0
- package/lib/types/namespaces/types.d.mts +230 -0
- package/lib/types/namespaces/utils.d.cts +68 -0
- package/lib/types/namespaces/utils.d.mts +68 -0
- package/lib/types/nest/graph/GraphExecutionController.d.cts +62 -0
- package/lib/types/nest/graph/GraphExecutionController.d.mts +62 -0
- package/lib/types/nest/graph/GraphExecutionModule.d.cts +39 -0
- package/lib/types/nest/graph/GraphExecutionModule.d.mts +39 -0
- package/lib/types/nest/graph/GraphExecutionResultModel.d.cts +46 -0
- package/lib/types/nest/graph/GraphExecutionResultModel.d.mts +46 -0
- package/lib/types/nest/graph/GraphExecutionResultRepository.d.cts +38 -0
- package/lib/types/nest/graph/GraphExecutionResultRepository.d.mts +38 -0
- package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.cts +17 -0
- package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.mts +17 -0
- package/lib/types/nest/graph/index.d.cts +10 -0
- package/lib/types/nest/graph/index.d.mts +10 -0
- package/lib/types/nest/index.d.cts +1 -0
- package/lib/types/nest/index.d.mts +1 -0
- package/package.json +16 -5
- package/sql/001_constraints.sql +11 -0
- package/sql/002_rls.sql +20 -0
- package/sql/003_indexes.sql +2 -0
- package/dist/integrations.cjs.map +0 -1
- package/dist/integrations.js.map +0 -1
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/azure/index.cjs.map +0 -1
- package/lib/cjs/blob/core/BlobErrors.cjs.map +0 -1
- package/lib/cjs/blob/core/BlobKey.cjs.map +0 -1
- package/lib/cjs/blob/core/BlobStoreFactory.cjs.map +0 -1
- package/lib/cjs/blob/core/BlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/core/BlobTypes.cjs.map +0 -1
- package/lib/cjs/blob/core/BlobValue.cjs.map +0 -1
- package/lib/cjs/blob/core/index.cjs.map +0 -1
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/gcp/index.cjs.map +0 -1
- package/lib/cjs/blob/index.cjs.map +0 -1
- package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs.map +0 -1
- package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs.map +0 -1
- package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs.map +0 -1
- package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs.map +0 -1
- package/lib/cjs/blob/ipfs/index.cjs.map +0 -1
- package/lib/cjs/blob/local/LocalBlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/local/index.cjs.map +0 -1
- package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/memory/index.cjs.map +0 -1
- package/lib/cjs/blob/s3/MinioBlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/s3/R2BlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +0 -1
- package/lib/cjs/blob/s3/index.cjs.map +0 -1
- package/lib/cjs/docker/DockerComposeService.cjs.map +0 -1
- package/lib/cjs/docker/index.cjs.map +0 -1
- package/lib/cjs/graph/constants.cjs.map +0 -1
- package/lib/cjs/graph/decorators.cjs.map +0 -1
- package/lib/cjs/graph/errors/GraphCycleError.cjs.map +0 -1
- package/lib/cjs/graph/errors/GraphExecutionError.cjs.map +0 -1
- package/lib/cjs/graph/errors/GraphInputError.cjs.map +0 -1
- package/lib/cjs/graph/errors/GraphLoopLimitError.cjs.map +0 -1
- package/lib/cjs/graph/errors/GraphPinningError.cjs.map +0 -1
- package/lib/cjs/graph/errors/GraphPortError.cjs.map +0 -1
- package/lib/cjs/graph/errors/GraphStoreError.cjs.map +0 -1
- package/lib/cjs/graph/errors/GraphTopologyError.cjs.map +0 -1
- package/lib/cjs/graph/errors/index.cjs.map +0 -1
- package/lib/cjs/graph/events/GraphExecutionEvent.cjs.map +0 -1
- package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs.map +0 -1
- package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs.map +0 -1
- package/lib/cjs/graph/events/GraphExecutionObserver.cjs.map +0 -1
- package/lib/cjs/graph/events/index.cjs.map +0 -1
- package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs.map +0 -1
- package/lib/cjs/graph/execution/GraphExecutionContext.cjs.map +0 -1
- package/lib/cjs/graph/execution/GraphExecutionEngine.cjs.map +0 -1
- package/lib/cjs/graph/execution/GraphExecutionFrame.cjs.map +0 -1
- package/lib/cjs/graph/execution/GraphExecutionResult.cjs.map +0 -1
- package/lib/cjs/graph/execution/GraphNodeExecutor.cjs.map +0 -1
- package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs.map +0 -1
- package/lib/cjs/graph/execution/index.cjs.map +0 -1
- package/lib/cjs/graph/index.cjs.map +0 -1
- package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs.map +0 -1
- package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs.map +0 -1
- package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs.map +0 -1
- package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs.map +0 -1
- package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs.map +0 -1
- package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs.map +0 -1
- package/lib/cjs/graph/loops/index.cjs.map +0 -1
- package/lib/cjs/graph/nodes/agent.cjs.map +0 -1
- package/lib/cjs/graph/nodes/category-styles.cjs.map +0 -1
- package/lib/cjs/graph/nodes/flow-control.cjs.map +0 -1
- package/lib/cjs/graph/nodes/index.cjs.map +0 -1
- package/lib/cjs/graph/nodes/triggers.cjs.map +0 -1
- package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs.map +0 -1
- package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs.map +0 -1
- package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs.map +0 -1
- package/lib/cjs/graph/pinning/GraphPinningService.cjs.map +0 -1
- package/lib/cjs/graph/pinning/index.cjs.map +0 -1
- package/lib/cjs/graph/planning/GraphExecutionPlan.cjs.map +0 -1
- package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs.map +0 -1
- package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs.map +0 -1
- package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs.map +0 -1
- package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs.map +0 -1
- package/lib/cjs/graph/planning/GraphRelationResolver.cjs.map +0 -1
- package/lib/cjs/graph/planning/GraphTopology.cjs.map +0 -1
- package/lib/cjs/graph/planning/index.cjs.map +0 -1
- package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs.map +0 -1
- package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs.map +0 -1
- package/lib/cjs/graph/registry/index.cjs.map +0 -1
- package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs.map +0 -1
- package/lib/cjs/graph/snapshots/index.cjs.map +0 -1
- package/lib/cjs/graph/store/GraphCachedValue.cjs.map +0 -1
- package/lib/cjs/graph/store/GraphValueKey.cjs.map +0 -1
- package/lib/cjs/graph/store/GraphValueStore.cjs.map +0 -1
- package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs.map +0 -1
- package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs.map +0 -1
- package/lib/cjs/graph/store/index.cjs.map +0 -1
- package/lib/cjs/graph/types.cjs.map +0 -1
- package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs.map +0 -1
- package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs.map +0 -1
- package/lib/cjs/graph/validation/GraphValueValidator.cjs.map +0 -1
- package/lib/cjs/graph/validation/index.cjs.map +0 -1
- package/lib/cjs/index.cjs.map +0 -1
- package/lib/cjs/keycloak/index.cjs.map +0 -1
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs.map +0 -1
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs.map +0 -1
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs.map +0 -1
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs.map +0 -1
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs.map +0 -1
- package/lib/cjs/keycloak/services/KeycloakService.cjs.map +0 -1
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs.map +0 -1
- package/lib/cjs/keycloak/services/index.cjs.map +0 -1
- package/lib/cjs/keycloak/services/runtime.cjs.map +0 -1
- package/lib/cjs/keycloak/types.cjs.map +0 -1
- package/lib/cjs/kibana/helpers.cjs.map +0 -1
- package/lib/cjs/kibana/index.cjs.map +0 -1
- package/lib/cjs/kibana/services/KibanaAuthService.cjs.map +0 -1
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs.map +0 -1
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs.map +0 -1
- package/lib/cjs/kibana/services/KibanaRoleService.cjs.map +0 -1
- package/lib/cjs/kibana/services/KibanaService.cjs.map +0 -1
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs.map +0 -1
- package/lib/cjs/kibana/services/KibanaUserService.cjs.map +0 -1
- package/lib/cjs/kibana/services/index.cjs.map +0 -1
- package/lib/cjs/kibana/services/runtime.cjs.map +0 -1
- package/lib/cjs/kibana/types.cjs.map +0 -1
- package/lib/cjs/nest/authService.cjs.map +0 -1
- package/lib/cjs/nest/index.cjs.map +0 -1
- package/lib/cjs/nest/keycloakAuthHandler.cjs.map +0 -1
- package/lib/cjs/nest/keycloakModule.cjs.map +0 -1
- package/lib/cjs/nest/logging.cjs.map +0 -1
- package/lib/cjs/nest/types.cjs.map +0 -1
- package/lib/cjs/nest/utils.cjs.map +0 -1
- package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +0 -1
- package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs.map +0 -1
- package/lib/cjs/secrets/aws/index.cjs.map +0 -1
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +0 -1
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs.map +0 -1
- package/lib/cjs/secrets/azure/index.cjs.map +0 -1
- package/lib/cjs/secrets/core/SecretErrors.cjs.map +0 -1
- package/lib/cjs/secrets/core/SecretName.cjs.map +0 -1
- package/lib/cjs/secrets/core/SecretReference.cjs.map +0 -1
- package/lib/cjs/secrets/core/SecretSerialization.cjs.map +0 -1
- package/lib/cjs/secrets/core/SecretService.cjs.map +0 -1
- package/lib/cjs/secrets/core/SecretTypes.cjs.map +0 -1
- package/lib/cjs/secrets/core/index.cjs.map +0 -1
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +0 -1
- package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs.map +0 -1
- package/lib/cjs/secrets/gcp/index.cjs.map +0 -1
- package/lib/cjs/secrets/index.cjs.map +0 -1
- package/lib/cjs/secrets/model/ModelSecretCrypto.cjs.map +0 -1
- package/lib/cjs/secrets/model/ModelSecretService.cjs.map +0 -1
- package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs.map +0 -1
- package/lib/cjs/secrets/model/Secret.cjs.map +0 -1
- package/lib/cjs/secrets/model/index.cjs.map +0 -1
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +0 -1
- package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs.map +0 -1
- package/lib/cjs/secrets/onepassword/index.cjs.map +0 -1
- package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +0 -1
- package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs.map +0 -1
- package/lib/cjs/secrets/vault/index.cjs.map +0 -1
- package/lib/cjs/shared/runtime.cjs.map +0 -1
- package/lib/cjs/utils.cjs.map +0 -1
- package/lib/esm/blob/azure/AzureBlobStoreService.js.map +0 -1
- package/lib/esm/blob/azure/index.js.map +0 -1
- package/lib/esm/blob/core/BlobErrors.js.map +0 -1
- package/lib/esm/blob/core/BlobKey.js.map +0 -1
- package/lib/esm/blob/core/BlobStoreFactory.js.map +0 -1
- package/lib/esm/blob/core/BlobStoreService.js.map +0 -1
- package/lib/esm/blob/core/BlobTypes.js.map +0 -1
- package/lib/esm/blob/core/BlobValue.js.map +0 -1
- package/lib/esm/blob/core/index.js.map +0 -1
- package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +0 -1
- package/lib/esm/blob/gcp/index.js.map +0 -1
- package/lib/esm/blob/index.js.map +0 -1
- package/lib/esm/blob/ipfs/IpfsBlobStoreService.js.map +0 -1
- package/lib/esm/blob/ipfs/IpfsKeyIndex.js.map +0 -1
- package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js.map +0 -1
- package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js.map +0 -1
- package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js.map +0 -1
- package/lib/esm/blob/ipfs/index.js.map +0 -1
- package/lib/esm/blob/local/LocalBlobStoreService.js.map +0 -1
- package/lib/esm/blob/local/index.js.map +0 -1
- package/lib/esm/blob/memory/MemoryBlobStoreService.js.map +0 -1
- package/lib/esm/blob/memory/index.js.map +0 -1
- package/lib/esm/blob/s3/MinioBlobStoreService.js.map +0 -1
- package/lib/esm/blob/s3/R2BlobStoreService.js.map +0 -1
- package/lib/esm/blob/s3/S3BlobStoreService.js.map +0 -1
- package/lib/esm/blob/s3/index.js.map +0 -1
- package/lib/esm/docker/DockerComposeService.js.map +0 -1
- package/lib/esm/docker/index.js.map +0 -1
- package/lib/esm/graph/constants.js.map +0 -1
- package/lib/esm/graph/decorators.js.map +0 -1
- package/lib/esm/graph/errors/GraphCycleError.js.map +0 -1
- package/lib/esm/graph/errors/GraphExecutionError.js.map +0 -1
- package/lib/esm/graph/errors/GraphInputError.js.map +0 -1
- package/lib/esm/graph/errors/GraphLoopLimitError.js.map +0 -1
- package/lib/esm/graph/errors/GraphPinningError.js.map +0 -1
- package/lib/esm/graph/errors/GraphPortError.js.map +0 -1
- package/lib/esm/graph/errors/GraphStoreError.js.map +0 -1
- package/lib/esm/graph/errors/GraphTopologyError.js.map +0 -1
- package/lib/esm/graph/errors/index.js.map +0 -1
- package/lib/esm/graph/events/GraphExecutionEvent.js.map +0 -1
- package/lib/esm/graph/events/GraphExecutionEventEmitter.js.map +0 -1
- package/lib/esm/graph/events/GraphExecutionEventFactory.js.map +0 -1
- package/lib/esm/graph/events/GraphExecutionObserver.js.map +0 -1
- package/lib/esm/graph/events/index.js.map +0 -1
- package/lib/esm/graph/execution/CodeSandboxEvaluator.js.map +0 -1
- package/lib/esm/graph/execution/GraphExecutionContext.js.map +0 -1
- package/lib/esm/graph/execution/GraphExecutionEngine.js.map +0 -1
- package/lib/esm/graph/execution/GraphExecutionFrame.js.map +0 -1
- package/lib/esm/graph/execution/GraphExecutionResult.js.map +0 -1
- package/lib/esm/graph/execution/GraphNodeExecutor.js.map +0 -1
- package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js.map +0 -1
- package/lib/esm/graph/execution/index.js.map +0 -1
- package/lib/esm/graph/index.js.map +0 -1
- package/lib/esm/graph/loops/ConditionExpressionEvaluator.js.map +0 -1
- package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js.map +0 -1
- package/lib/esm/graph/loops/GraphConditionEvaluator.js.map +0 -1
- package/lib/esm/graph/loops/GraphLoopExecutionContext.js.map +0 -1
- package/lib/esm/graph/loops/UntilGraphNodeExecutor.js.map +0 -1
- package/lib/esm/graph/loops/WhileGraphNodeExecutor.js.map +0 -1
- package/lib/esm/graph/loops/index.js.map +0 -1
- package/lib/esm/graph/nodes/agent.js.map +0 -1
- package/lib/esm/graph/nodes/category-styles.js.map +0 -1
- package/lib/esm/graph/nodes/flow-control.js.map +0 -1
- package/lib/esm/graph/nodes/index.js.map +0 -1
- package/lib/esm/graph/nodes/triggers.js.map +0 -1
- package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js.map +0 -1
- package/lib/esm/graph/pinning/GraphPinningMetadata.js.map +0 -1
- package/lib/esm/graph/pinning/GraphPinningPolicy.js.map +0 -1
- package/lib/esm/graph/pinning/GraphPinningService.js.map +0 -1
- package/lib/esm/graph/pinning/index.js.map +0 -1
- package/lib/esm/graph/planning/GraphExecutionPlan.js.map +0 -1
- package/lib/esm/graph/planning/GraphExecutionPlanEdge.js.map +0 -1
- package/lib/esm/graph/planning/GraphExecutionPlanLayer.js.map +0 -1
- package/lib/esm/graph/planning/GraphExecutionPlanNode.js.map +0 -1
- package/lib/esm/graph/planning/GraphExecutionPlanner.js.map +0 -1
- package/lib/esm/graph/planning/GraphRelationResolver.js.map +0 -1
- package/lib/esm/graph/planning/GraphTopology.js.map +0 -1
- package/lib/esm/graph/planning/index.js.map +0 -1
- package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js.map +0 -1
- package/lib/esm/graph/registry/GraphNodeExecutorResolver.js.map +0 -1
- package/lib/esm/graph/registry/index.js.map +0 -1
- package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js.map +0 -1
- package/lib/esm/graph/snapshots/index.js.map +0 -1
- package/lib/esm/graph/store/GraphCachedValue.js.map +0 -1
- package/lib/esm/graph/store/GraphValueKey.js.map +0 -1
- package/lib/esm/graph/store/GraphValueStore.js.map +0 -1
- package/lib/esm/graph/store/GraphValueStoreAdapter.js.map +0 -1
- package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js.map +0 -1
- package/lib/esm/graph/store/index.js.map +0 -1
- package/lib/esm/graph/types.js.map +0 -1
- package/lib/esm/graph/validation/GraphDefinitionValidator.js.map +0 -1
- package/lib/esm/graph/validation/GraphPortSchemaResolver.js.map +0 -1
- package/lib/esm/graph/validation/GraphValueValidator.js.map +0 -1
- package/lib/esm/graph/validation/index.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/keycloak/index.js.map +0 -1
- package/lib/esm/keycloak/services/KeycloakAuthService.js.map +0 -1
- package/lib/esm/keycloak/services/KeycloakClientService.js.map +0 -1
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js.map +0 -1
- package/lib/esm/keycloak/services/KeycloakRealmService.js.map +0 -1
- package/lib/esm/keycloak/services/KeycloakRoleService.js.map +0 -1
- package/lib/esm/keycloak/services/KeycloakService.js.map +0 -1
- package/lib/esm/keycloak/services/KeycloakUserService.js.map +0 -1
- package/lib/esm/keycloak/services/index.js.map +0 -1
- package/lib/esm/keycloak/services/runtime.js.map +0 -1
- package/lib/esm/keycloak/types.js.map +0 -1
- package/lib/esm/kibana/helpers.js.map +0 -1
- package/lib/esm/kibana/index.js.map +0 -1
- package/lib/esm/kibana/services/KibanaAuthService.js.map +0 -1
- package/lib/esm/kibana/services/KibanaDashboardService.js.map +0 -1
- package/lib/esm/kibana/services/KibanaDataViewService.js.map +0 -1
- package/lib/esm/kibana/services/KibanaRoleService.js.map +0 -1
- package/lib/esm/kibana/services/KibanaService.js.map +0 -1
- package/lib/esm/kibana/services/KibanaSpaceService.js.map +0 -1
- package/lib/esm/kibana/services/KibanaUserService.js.map +0 -1
- package/lib/esm/kibana/services/index.js.map +0 -1
- package/lib/esm/kibana/services/runtime.js.map +0 -1
- package/lib/esm/kibana/types.js.map +0 -1
- package/lib/esm/nest/authService.js.map +0 -1
- package/lib/esm/nest/index.js.map +0 -1
- package/lib/esm/nest/keycloakAuthHandler.js.map +0 -1
- package/lib/esm/nest/keycloakModule.js.map +0 -1
- package/lib/esm/nest/logging.js.map +0 -1
- package/lib/esm/nest/types.js.map +0 -1
- package/lib/esm/nest/utils.js.map +0 -1
- package/lib/esm/secrets/aws/AwsSecretService.js.map +0 -1
- package/lib/esm/secrets/aws/AwsSecretServiceConfig.js.map +0 -1
- package/lib/esm/secrets/aws/index.js.map +0 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +0 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js.map +0 -1
- package/lib/esm/secrets/azure/index.js.map +0 -1
- package/lib/esm/secrets/core/SecretErrors.js.map +0 -1
- package/lib/esm/secrets/core/SecretName.js.map +0 -1
- package/lib/esm/secrets/core/SecretReference.js.map +0 -1
- package/lib/esm/secrets/core/SecretSerialization.js.map +0 -1
- package/lib/esm/secrets/core/SecretService.js.map +0 -1
- package/lib/esm/secrets/core/SecretTypes.js.map +0 -1
- package/lib/esm/secrets/core/index.js.map +0 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +0 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js.map +0 -1
- package/lib/esm/secrets/gcp/index.js.map +0 -1
- package/lib/esm/secrets/index.js.map +0 -1
- package/lib/esm/secrets/model/ModelSecretCrypto.js.map +0 -1
- package/lib/esm/secrets/model/ModelSecretService.js.map +0 -1
- package/lib/esm/secrets/model/ModelSecretServiceConfig.js.map +0 -1
- package/lib/esm/secrets/model/Secret.js.map +0 -1
- package/lib/esm/secrets/model/index.js.map +0 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +0 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js.map +0 -1
- package/lib/esm/secrets/onepassword/index.js.map +0 -1
- package/lib/esm/secrets/vault/VaultSecretService.js.map +0 -1
- package/lib/esm/secrets/vault/VaultSecretServiceConfig.js.map +0 -1
- package/lib/esm/secrets/vault/index.js.map +0 -1
- package/lib/esm/shared/runtime.js.map +0 -1
- package/lib/esm/utils.js.map +0 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { AuthorizationError } from "@decaf-ts/core";
|
|
2
|
+
import { ResourceVisibility, ScopeKind } from "./../types.js";
|
|
3
|
+
import { asArray, buildAccessContext, buildArangoContext, buildQdrantFilter, isTimeValid } from "./../utils.js";
|
|
4
|
+
function scopeKey(scopeKind, scopeId) {
|
|
5
|
+
return `${scopeKind}:${scopeId}`;
|
|
6
|
+
}
|
|
7
|
+
export class AuthzService {
|
|
8
|
+
constructor(dataSources = {}) {
|
|
9
|
+
this.dataSources = dataSources;
|
|
10
|
+
}
|
|
11
|
+
async canAccess(input, ...args) {
|
|
12
|
+
const at = input.at ?? new Date();
|
|
13
|
+
if (input.scopeKind && input.scopeId) {
|
|
14
|
+
const permissions = await this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, input.scopeKind, input.scopeId);
|
|
15
|
+
return asArray(permissions).some((permission) => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
|
|
16
|
+
}
|
|
17
|
+
if (!input.resourceProtectedId)
|
|
18
|
+
return false;
|
|
19
|
+
const resource = await this.dataSources.loadResource?.(input.tenantId, input.resourceProtectedId);
|
|
20
|
+
if (!resource)
|
|
21
|
+
return false;
|
|
22
|
+
if (resource.tenantId !== input.tenantId)
|
|
23
|
+
return false;
|
|
24
|
+
if (resource.ownerPrincipalId === input.principalId)
|
|
25
|
+
return true;
|
|
26
|
+
const grants = asArray(await this.dataSources.listResourceGrants?.(input.tenantId, input.resourceProtectedId)).filter((grant) => grant.principalId === input.principalId && grant.permissionKey === input.permissionKey && isTimeValid(at, grant.startsAt, grant.expiresAt));
|
|
27
|
+
if (grants.length > 0)
|
|
28
|
+
return true;
|
|
29
|
+
const visibility = resource.visibility;
|
|
30
|
+
if (visibility === ResourceVisibility.Private || visibility === ResourceVisibility.ResourceAcl) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
if (visibility === ResourceVisibility.OrgUnit || visibility === ResourceVisibility.OrgSubtree) {
|
|
34
|
+
const effectivePermissions = asArray(await this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, ScopeKind.OrgUnit, resource.orgUnitId));
|
|
35
|
+
return effectivePermissions.some((permission) => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
|
|
36
|
+
}
|
|
37
|
+
if (visibility === ResourceVisibility.Tenant) {
|
|
38
|
+
const effectivePermissions = asArray(await this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, ScopeKind.Tenant, input.tenantId));
|
|
39
|
+
return effectivePermissions.some((permission) => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
async requireAccess(input, ...args) {
|
|
44
|
+
if (!(await this.canAccess(input, ...args))) {
|
|
45
|
+
throw new AuthorizationError(`Access denied for ${input.permissionKey} on ${input.resourceProtectedId ?? scopeKey(input.scopeKind ?? ScopeKind.Resource, input.scopeId ?? "")}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async buildAccessContext(tenantId, principalId, ...args) {
|
|
49
|
+
const permissions = asArray(await this.dataSources.listEffectivePermissions?.(tenantId, principalId));
|
|
50
|
+
const grants = asArray(await this.dataSources.listPrincipalGrants?.(tenantId, principalId));
|
|
51
|
+
return buildAccessContext({
|
|
52
|
+
tenantId,
|
|
53
|
+
principalId,
|
|
54
|
+
permissions,
|
|
55
|
+
grants,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async buildArangoContext(tenantId, principalId, permissionKey, ...args) {
|
|
59
|
+
const access = await this.buildAccessContext(tenantId, principalId, ...args);
|
|
60
|
+
const allowedOrgUnitIds = access.allowedOrgUnitIdsByPermission[permissionKey] ?? [];
|
|
61
|
+
const allowedResourceIds = access.resourceGrants.filter((grant) => grant.permissionKey === permissionKey).map((grant) => grant.resourceId);
|
|
62
|
+
return buildArangoContext({ tenantId, principalId, permissionKey, allowedOrgUnitIds, allowedResourceIds });
|
|
63
|
+
}
|
|
64
|
+
async buildQdrantFilter(tenantId, principalId, permissionKey, ...args) {
|
|
65
|
+
const access = await this.buildAccessContext(tenantId, principalId, ...args);
|
|
66
|
+
const allowedOrgUnitIds = access.allowedOrgUnitIdsByPermission[permissionKey] ?? [];
|
|
67
|
+
const allowedResourceIds = access.resourceGrants.filter((grant) => grant.permissionKey === permissionKey).map((grant) => grant.resourceId);
|
|
68
|
+
return buildQdrantFilter({ tenantId, principalId, permissionKey, allowedOrgUnitIds, allowedResourceIds });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aHouc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2F1dGh6LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFvQyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsc0JBQWlCO0FBQzNGLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFjLHNCQUFpQjtBQUV2SCxTQUFTLFFBQVEsQ0FBQyxTQUFvQixFQUFFLE9BQWU7SUFDckQsT0FBTyxHQUFHLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxPQUFPLFlBQVk7SUFHdkIsWUFBWSxjQUFnQyxFQUFFO1FBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQXFCLEVBQUUsR0FBRyxJQUFXO1FBQ25ELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUVsQyxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUgsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUM5QixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsYUFBYSxJQUFJLFdBQVcs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QUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzSSxPQUFPLGtCQUFrQixDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxXQUFtQixFQUFFLGFBQXFCLEVBQUUsR0FBRyxJQUFXO1FBQ2xHLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3RSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzSSxPQUFPLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQXV0aHpEYXRhU291cmNlcywgQ2FuQWNjZXNzSW5wdXQsIFJlc291cmNlVmlzaWJpbGl0eSwgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBhc0FycmF5LCBidWlsZEFjY2Vzc0NvbnRleHQsIGJ1aWxkQXJhbmdvQ29udGV4dCwgYnVpbGRRZHJhbnRGaWx0ZXIsIGlzVGltZVZhbGlkLCByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmZ1bmN0aW9uIHNjb3BlS2V5KHNjb3BlS2luZDogU2NvcGVLaW5kLCBzY29wZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2NvcGVLaW5kfToke3Njb3BlSWR9YDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGh6U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZXM6IEF1dGh6RGF0YVNvdXJjZXM7XG5cbiAgY29uc3RydWN0b3IoZGF0YVNvdXJjZXM6IEF1dGh6RGF0YVNvdXJjZXMgPSB7fSkge1xuICAgIHRoaXMuZGF0YVNvdXJjZXMgPSBkYXRhU291cmNlcztcbiAgfVxuXG4gIGFzeW5jIGNhbkFjY2VzcyhpbnB1dDogQ2FuQWNjZXNzSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYXQgPSBpbnB1dC5hdCA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKGlucHV0LnNjb3BlS2luZCAmJiBpbnB1dC5zY29wZUlkKSB7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihpbnB1dC50ZW5hbnRJZCwgaW5wdXQuc2NvcGVLaW5kLCBpbnB1dC5zY29wZUlkKTtcbiAgICAgIHJldHVybiBhc0FycmF5KHBlcm1pc3Npb25zKS5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT4gcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubG9hZFJlc291cmNlPy4oaW5wdXQudGVuYW50SWQsIGlucHV0LnJlc291cmNlUHJvdGVjdGVkSWQpO1xuICAgIGlmICghcmVzb3VyY2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocmVzb3VyY2UudGVuYW50SWQgIT09IGlucHV0LnRlbmFudElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocmVzb3VyY2Uub3duZXJQcmluY2lwYWxJZCA9PT0gaW5wdXQucHJpbmNpcGFsSWQpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgZ3JhbnRzID0gYXNBcnJheShhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RSZXNvdXJjZUdyYW50cz8uKGlucHV0LnRlbmFudElkLCBpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkKSkuZmlsdGVyKFxuICAgICAgKGdyYW50KSA9PiBncmFudC5wcmluY2lwYWxJZCA9PT0gaW5wdXQucHJpbmNpcGFsSWQgJiYgZ3JhbnQucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJiBpc1RpbWVWYWxpZChhdCwgZ3JhbnQuc3RhcnRzQXQsIGdyYW50LmV4cGlyZXNBdClcbiAgICApO1xuICAgIGlmIChncmFudHMubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCB2aXNpYmlsaXR5ID0gcmVzb3VyY2UudmlzaWJpbGl0eTtcbiAgICBpZiAodmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5LlByaXZhdGUgfHwgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5LlJlc291cmNlQWNsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5PcmdVbml0IHx8IHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5PcmdTdWJ0cmVlKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVQZXJtaXNzaW9ucyA9IGFzQXJyYXkoXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihpbnB1dC50ZW5hbnRJZCwgU2NvcGVLaW5kLk9yZ1VuaXQsIHJlc291cmNlLm9yZ1VuaXRJZClcbiAgICAgICk7XG4gICAgICByZXR1cm4gZWZmZWN0aXZlUGVybWlzc2lvbnMuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+IHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJiBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuVGVuYW50KSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVQZXJtaXNzaW9ucyA9IGFzQXJyYXkoXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihpbnB1dC50ZW5hbnRJZCwgU2NvcGVLaW5kLlRlbmFudCwgaW5wdXQudGVuYW50SWQpXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVmZmVjdGl2ZVBlcm1pc3Npb25zLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiYgaXNUaW1lVmFsaWQoYXQsIHBlcm1pc3Npb24uc3RhcnRzQXQsIHBlcm1pc3Npb24uZXhwaXJlc0F0KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZXF1aXJlQWNjZXNzKGlucHV0OiBDYW5BY2Nlc3NJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmNhbkFjY2VzcyhpbnB1dCwgLi4uYXJncykpKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICBgQWNjZXNzIGRlbmllZCBmb3IgJHtpbnB1dC5wZXJtaXNzaW9uS2V5fSBvbiAke2lucHV0LnJlc291cmNlUHJvdGVjdGVkSWQgPz8gc2NvcGVLZXkoaW5wdXQuc2NvcGVLaW5kID8/IFNjb3BlS2luZC5SZXNvdXJjZSwgaW5wdXQuc2NvcGVJZCA/PyBcIlwiKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQWNjZXNzQ29udGV4dCh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8aW1wb3J0KFwiLi4vdHlwZXNcIikuQWNjZXNzQ29udGV4dD4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXNBcnJheShhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucz8uKHRlbmFudElkLCBwcmluY2lwYWxJZCkpO1xuICAgIGNvbnN0IGdyYW50cyA9IGFzQXJyYXkoYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0UHJpbmNpcGFsR3JhbnRzPy4odGVuYW50SWQsIHByaW5jaXBhbElkKSk7XG4gICAgcmV0dXJuIGJ1aWxkQWNjZXNzQ29udGV4dCh7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbnMsXG4gICAgICBncmFudHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZEFyYW5nb0NvbnRleHQodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgcGVybWlzc2lvbktleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2Nlc3NDb250ZXh0KHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgYWxsb3dlZE9yZ1VuaXRJZHMgPSBhY2Nlc3MuYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbktleV0gPz8gW107XG4gICAgY29uc3QgYWxsb3dlZFJlc291cmNlSWRzID0gYWNjZXNzLnJlc291cmNlR3JhbnRzLmZpbHRlcigoZ3JhbnQpID0+IGdyYW50LnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkpLm1hcCgoZ3JhbnQpID0+IGdyYW50LnJlc291cmNlSWQpO1xuICAgIHJldHVybiBidWlsZEFyYW5nb0NvbnRleHQoeyB0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIHBlcm1pc3Npb25LZXksIGFsbG93ZWRPcmdVbml0SWRzLCBhbGxvd2VkUmVzb3VyY2VJZHMgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZFFkcmFudEZpbHRlcih0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgYWNjZXNzID0gYXdhaXQgdGhpcy5idWlsZEFjY2Vzc0NvbnRleHQodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9IGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHMuZmlsdGVyKChncmFudCkgPT4gZ3JhbnQucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSkubWFwKChncmFudCkgPT4gZ3JhbnQucmVzb3VyY2VJZCk7XG4gICAgcmV0dXJuIGJ1aWxkUWRyYW50RmlsdGVyKHsgdGVuYW50SWQsIHByaW5jaXBhbElkLCBwZXJtaXNzaW9uS2V5LCBhbGxvd2VkT3JnVW5pdElkcywgYWxsb3dlZFJlc291cmNlSWRzIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { transactional } from "./../utils.js";
|
|
11
|
+
import { MembershipStatus, ScopeKind } from "./../types.js";
|
|
12
|
+
import { TenantService } from "./tenant.service";
|
|
13
|
+
import { TenantProfileService } from "./tenant-profile.service";
|
|
14
|
+
import { OrgUnitService } from "./org-unit.service";
|
|
15
|
+
import { OrgUnitProfileService } from "./org-unit-profile.service";
|
|
16
|
+
import { UserService } from "./user.service";
|
|
17
|
+
import { TenantMembershipService } from "./tenant-membership.service";
|
|
18
|
+
import { PrincipalService } from "./principal.service";
|
|
19
|
+
import { PermissionService } from "./permission.service";
|
|
20
|
+
import { RoleService } from "./role.service";
|
|
21
|
+
import { RolePermissionService } from "./role-permission.service";
|
|
22
|
+
import { RoleAssignmentService } from "./role-assignment.service";
|
|
23
|
+
import { EffectivePermissionService } from "./effective-permission.service";
|
|
24
|
+
export class BootstrapService {
|
|
25
|
+
constructor() {
|
|
26
|
+
this.tenantService = new TenantService();
|
|
27
|
+
this.tenantProfileService = new TenantProfileService();
|
|
28
|
+
this.orgUnitService = new OrgUnitService();
|
|
29
|
+
this.orgUnitProfileService = new OrgUnitProfileService();
|
|
30
|
+
this.userService = new UserService();
|
|
31
|
+
this.membershipService = new TenantMembershipService();
|
|
32
|
+
this.principalService = new PrincipalService();
|
|
33
|
+
this.permissionService = new PermissionService();
|
|
34
|
+
this.roleService = new RoleService();
|
|
35
|
+
this.rolePermissionService = new RolePermissionService();
|
|
36
|
+
this.roleAssignmentService = new RoleAssignmentService();
|
|
37
|
+
this.effectivePermissionService = new EffectivePermissionService();
|
|
38
|
+
}
|
|
39
|
+
async bootstrapTenantFromTemplate(template, ...args) {
|
|
40
|
+
const tenant = await this.tenantService.createTenant(template.tenant, ...args);
|
|
41
|
+
if (template.tenant.profileKey) {
|
|
42
|
+
await this.tenantProfileService.createProfile(tenant.id, template.tenant.profileKey, template.tenant.profileMetadata, ...args);
|
|
43
|
+
}
|
|
44
|
+
const createOrgTree = async (parentId, orgUnit) => {
|
|
45
|
+
const created = parentId === undefined
|
|
46
|
+
? await this.orgUnitService.createRoot(tenant.id, orgUnit.name, orgUnit.metadata, orgUnit.profileKey, orgUnit.metadata, ...args)
|
|
47
|
+
: await this.orgUnitService.createChild({
|
|
48
|
+
tenantId: tenant.id,
|
|
49
|
+
parentOrgUnitId: parentId,
|
|
50
|
+
name: orgUnit.name,
|
|
51
|
+
metadata: orgUnit.metadata,
|
|
52
|
+
profileKey: orgUnit.profileKey,
|
|
53
|
+
profileMetadata: orgUnit.metadata,
|
|
54
|
+
}, ...args);
|
|
55
|
+
for (const child of orgUnit.children ?? []) {
|
|
56
|
+
await createOrgTree(created.id, child);
|
|
57
|
+
}
|
|
58
|
+
return created;
|
|
59
|
+
};
|
|
60
|
+
const rootOrgUnit = await createOrgTree(undefined, template.rootOrgUnit);
|
|
61
|
+
const owner = await this.userService.createUser(template.ownerUser, ...args);
|
|
62
|
+
await this.membershipService.addUserToTenant(tenant.id, owner.id, MembershipStatus.Active, ...args);
|
|
63
|
+
const ownerPrincipal = await this.principalService.getUserPrincipal(tenant.id, owner.id, ...args);
|
|
64
|
+
for (const permission of template.permissions) {
|
|
65
|
+
await this.permissionService.createPermission(permission, ...args);
|
|
66
|
+
}
|
|
67
|
+
for (const role of template.roles) {
|
|
68
|
+
const createdRole = await this.roleService.createRole({
|
|
69
|
+
tenantId: tenant.id,
|
|
70
|
+
key: role.key,
|
|
71
|
+
name: role.name,
|
|
72
|
+
description: role.description,
|
|
73
|
+
}, ...args);
|
|
74
|
+
for (const permissionKey of role.permissionKeys) {
|
|
75
|
+
await this.rolePermissionService.addPermissionKeyToRole(createdRole.id, permissionKey, ...args);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const ownerRole = await this.roleService.getTenantRoleByKey(tenant.id, template.ownerRoleKey, ...args);
|
|
79
|
+
await this.roleAssignmentService.assignRole({
|
|
80
|
+
tenantId: tenant.id,
|
|
81
|
+
principalId: ownerPrincipal.id,
|
|
82
|
+
roleId: ownerRole.id,
|
|
83
|
+
scopeKind: ScopeKind.OrgUnit,
|
|
84
|
+
scopeId: rootOrgUnit.id,
|
|
85
|
+
inheritDown: true,
|
|
86
|
+
}, ...args);
|
|
87
|
+
await this.effectivePermissionService.rebuildForPrincipal(tenant.id, ownerPrincipal.id, ...args);
|
|
88
|
+
return {
|
|
89
|
+
tenantId: tenant.id,
|
|
90
|
+
rootOrgUnitId: rootOrgUnit.id,
|
|
91
|
+
ownerUserId: owner.id,
|
|
92
|
+
ownerPrincipalId: ownerPrincipal.id,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
__decorate([
|
|
97
|
+
transactional(),
|
|
98
|
+
__metadata("design:type", Function),
|
|
99
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
100
|
+
__metadata("design:returntype", Promise)
|
|
101
|
+
], BootstrapService.prototype, "bootstrapTenantFromTemplate", null);
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9ib290c3RyYXAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLHNCQUFpQjtBQUt6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLHNCQUFpQjtBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHNUUsTUFBTSxPQUFPLGdCQUFnQjtJQUE3QjtRQUNVLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNwQyx5QkFBb0IsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDbEQsbUJBQWMsR0FBRyxJQUFJLGNB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QVcsQ0FBQyxFQUFFO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLEVBQ0QsR0FBRyxJQUFJLENBQ1IsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRWpHLE9BQU87WUFDTCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDbkIsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQzdCLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNyQixnQkFBZ0IsRUFBRSxjQUFjLENBQUMsRUFBRTtTQUNwQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBMUVPO0lBREwsYUFBYSxFQUFFOzs7O21FQTBFZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRyYW5zYWN0aW9uYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQm9vdHN0cmFwT3JnVW5pdCxcbiAgQm9vdHN0cmFwVGVtcGxhdGUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW5hbnRTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IFRlbmFudFByb2ZpbGVTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdFNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0UHJvZmlsZVNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC1wcm9maWxlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4vdXNlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgcmVsYXRpb25JZCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwU2VydmljZSB7XG4gIHByaXZhdGUgdGVuYW50U2VydmljZSA9IG5ldyBUZW5hbnRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgdGVuYW50UHJvZmlsZVNlcnZpY2UgPSBuZXcgVGVuYW50UHJvZmlsZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBvcmdVbml0U2VydmljZSA9IG5ldyBPcmdVbml0U2VydmljZSgpO1xuICBwcml2YXRlIG9yZ1VuaXRQcm9maWxlU2VydmljZSA9IG5ldyBPcmdVbml0UHJvZmlsZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSB1c2VyU2VydmljZSA9IG5ldyBVc2VyU2VydmljZSgpO1xuICBwcml2YXRlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcGVybWlzc2lvblNlcnZpY2UgPSBuZXcgUGVybWlzc2lvblNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlU2VydmljZSA9IG5ldyBSb2xlU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBSb2xlUGVybWlzc2lvblNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UoKTtcblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIGJvb3RzdHJhcFRlbmFudEZyb21UZW1wbGF0ZShcbiAgICB0ZW1wbGF0ZTogQm9vdHN0cmFwVGVtcGxhdGUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7IHRlbmFudElkOiBzdHJpbmc7IHJvb3RPcmdVbml0SWQ6IHN0cmluZzsgb3duZXJVc2VySWQ6IHN0cmluZzsgb3duZXJQcmluY2lwYWxJZDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2UuY3JlYXRlVGVuYW50KHRlbXBsYXRlLnRlbmFudCwgLi4uYXJncyk7XG4gICAgaWYgKHRlbXBsYXRlLnRlbmFudC5wcm9maWxlS2V5KSB7XG4gICAgICBhd2FpdCB0aGlzLnRlbmFudFByb2ZpbGVTZXJ2aWNlLmNyZWF0ZVByb2ZpbGUodGVuYW50LmlkLCB0ZW1wbGF0ZS50ZW5hbnQucHJvZmlsZUtleSwgdGVtcGxhdGUudGVuYW50LnByb2ZpbGVNZXRhZGF0YSwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlT3JnVHJlZSA9IGFzeW5jIChwYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcmdVbml0OiBCb290c3RyYXBPcmdVbml0KSA9PiB7XG4gICAgICBjb25zdCBjcmVhdGVkID1cbiAgICAgICAgcGFyZW50SWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYXdhaXQgdGhpcy5vcmdVbml0U2VydmljZS5jcmVhdGVSb290KHRlbmFudC5pZCwgb3JnVW5pdC5uYW1lLCBvcmdVbml0Lm1ldGFkYXRhLCBvcmdVbml0LnByb2ZpbGVLZXksIG9yZ1VuaXQubWV0YWRhdGEsIC4uLmFyZ3MpXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLm9yZ1VuaXRTZXJ2aWNlLmNyZWF0ZUNoaWxkKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgICAgICAgICAgICBwYXJlbnRPcmdVbml0SWQ6IHBhcmVudElkLFxuICAgICAgICAgICAgICAgIG5hbWU6IG9yZ1VuaXQubmFtZSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogb3JnVW5pdC5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBwcm9maWxlS2V5OiBvcmdVbml0LnByb2ZpbGVLZXksXG4gICAgICAgICAgICAgICAgcHJvZmlsZU1ldGFkYXRhOiBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBvcmdVbml0LmNoaWxkcmVuID8/IFtdKSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZU9yZ1RyZWUoY3JlYXRlZC5pZCwgY2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHJvb3RPcmdVbml0ID0gYXdhaXQgY3JlYXRlT3JnVHJlZSh1bmRlZmluZWQsIHRlbXBsYXRlLnJvb3RPcmdVbml0KTtcbiAgICBjb25zdCBvd25lciA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlVXNlcih0ZW1wbGF0ZS5vd25lclVzZXIsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2UuYWRkVXNlclRvVGVuYW50KHRlbmFudC5pZCwgb3duZXIuaWQsIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLCAuLi5hcmdzKTtcbiAgICBjb25zdCBvd25lclByaW5jaXBhbCA9IGF3YWl0IHRoaXMucHJpbmNpcGFsU2VydmljZS5nZXRVc2VyUHJpbmNpcGFsKHRlbmFudC5pZCwgb3duZXIuaWQsIC4uLmFyZ3MpO1xuXG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHRlbXBsYXRlLnBlcm1pc3Npb25zKSB7XG4gICAgICBhd2FpdCB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmNyZWF0ZVBlcm1pc3Npb24ocGVybWlzc2lvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgcm9sZSBvZiB0ZW1wbGF0ZS5yb2xlcykge1xuICAgICAgY29uc3QgY3JlYXRlZFJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmNyZWF0ZVJvbGUoXG4gICAgICAgIHtcbiAgICAgICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgICAgIGtleTogcm9sZS5rZXksXG4gICAgICAgICAgbmFtZTogcm9sZS5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiByb2xlLmRlc2NyaXB0aW9uLFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uS2V5IG9mIHJvbGUucGVybWlzc2lvbktleXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb2xlUGVybWlzc2lvblNlcnZpY2UuYWRkUGVybWlzc2lvbktleVRvUm9sZShjcmVhdGVkUm9sZS5pZCwgcGVybWlzc2lvbktleSwgLi4uYXJncyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZXJSb2xlID0gYXdhaXQgdGhpcy5yb2xlU2VydmljZS5nZXRUZW5hbnRSb2xlQnlLZXkodGVuYW50LmlkLCB0ZW1wbGF0ZS5vd25lclJvbGVLZXksIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmFzc2lnblJvbGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgIHByaW5jaXBhbElkOiBvd25lclByaW5jaXBhbC5pZCxcbiAgICAgICAgcm9sZUlkOiBvd25lclJvbGUuaWQsXG4gICAgICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLk9yZ1VuaXQsXG4gICAgICAgIHNjb3BlSWQ6IHJvb3RPcmdVbml0LmlkLFxuICAgICAgICBpbmhlcml0RG93bjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50LmlkLCBvd25lclByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgIHJvb3RPcmdVbml0SWQ6IHJvb3RPcmdVbml0LmlkLFxuICAgICAgb3duZXJVc2VySWQ6IG93bmVyLmlkLFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogb3duZXJQcmluY2lwYWwuaWQsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { BaseModelService, relationId, relationMatch, sameTenant, transactional } from "./../utils.js";
|
|
11
|
+
import { ScopeKind } from "./../types.js";
|
|
12
|
+
import { EffectivePermission } from "../models/effective-permission.model";
|
|
13
|
+
import { RoleAssignmentService } from "./role-assignment.service";
|
|
14
|
+
import { RolePermissionService } from "./role-permission.service";
|
|
15
|
+
import { PermissionService } from "./permission.service";
|
|
16
|
+
import { GroupMembershipService } from "./group-membership.service";
|
|
17
|
+
import { PrincipalService } from "./principal.service";
|
|
18
|
+
import { OrgUnitClosureService } from "./org-unit-closure.service";
|
|
19
|
+
import { InheritanceBlockService } from "./inheritance-block.service";
|
|
20
|
+
export class EffectivePermissionService extends BaseModelService {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(EffectivePermission);
|
|
23
|
+
}
|
|
24
|
+
async listForPrincipal(tenantId, principalId, ...args) {
|
|
25
|
+
return (await this.listAll(...args)).filter((permission) => sameTenant(permission.tenant, tenantId) && relationMatch(permission.principal, principalId));
|
|
26
|
+
}
|
|
27
|
+
async listForScope(tenantId, scopeKind, scopeId, ...args) {
|
|
28
|
+
return (await this.listAll(...args)).filter((permission) => sameTenant(permission.tenant, tenantId) && permission.scopeKind === scopeKind && permission.scopeId === scopeId);
|
|
29
|
+
}
|
|
30
|
+
async hasPermission(tenantId, principalId, permissionKey, scopeKind, scopeId, at, ...args) {
|
|
31
|
+
return (await this.listForPrincipal(tenantId, principalId, ...args)).some((permission) => permission.permissionKey === permissionKey &&
|
|
32
|
+
permission.scopeKind === scopeKind &&
|
|
33
|
+
permission.scopeId === scopeId &&
|
|
34
|
+
(!permission.startsAt || !at || permission.startsAt <= at) &&
|
|
35
|
+
(!permission.expiresAt || !at || permission.expiresAt >= at));
|
|
36
|
+
}
|
|
37
|
+
async deleteForPrincipal(tenantId, principalId, ...args) {
|
|
38
|
+
for (const row of await this.listForPrincipal(tenantId, principalId, ...args)) {
|
|
39
|
+
await this.deleteById(row.id, ...args);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async deleteForTenant(tenantId, ...args) {
|
|
43
|
+
for (const row of (await this.listAll(...args)).filter((permission) => sameTenant(permission.tenant, tenantId))) {
|
|
44
|
+
await this.deleteById(row.id, ...args);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async rebuildForPrincipal(tenantId, principalId, ...args) {
|
|
48
|
+
await this.deleteForPrincipal(tenantId, principalId, ...args);
|
|
49
|
+
const roleAssignmentService = new RoleAssignmentService();
|
|
50
|
+
const rolePermissionService = new RolePermissionService();
|
|
51
|
+
const permissionService = new PermissionService();
|
|
52
|
+
const groupMembershipService = new GroupMembershipService();
|
|
53
|
+
const principalService = new PrincipalService();
|
|
54
|
+
const orgUnitClosureService = new OrgUnitClosureService();
|
|
55
|
+
const inheritanceBlockService = new InheritanceBlockService();
|
|
56
|
+
const materialized = [];
|
|
57
|
+
const sourceAssignments = await roleAssignmentService.listPrincipalAssignments(tenantId, principalId, ...args);
|
|
58
|
+
const groupMemberships = await groupMembershipService.listPrincipalGroups(principalId, ...args);
|
|
59
|
+
const groupAssignments = (await Promise.all(groupMemberships.map(async (membership) => {
|
|
60
|
+
const groupPrincipal = await principalService.getGroupPrincipal(relationId(membership.tenant), relationId(membership.group), ...args);
|
|
61
|
+
return roleAssignmentService.listPrincipalAssignments(tenantId, groupPrincipal.id, ...args);
|
|
62
|
+
}))).flat();
|
|
63
|
+
const assignments = [...sourceAssignments, ...groupAssignments];
|
|
64
|
+
for (const assignment of assignments) {
|
|
65
|
+
const rolePermissions = await rolePermissionService.listRolePermissions(relationId(assignment.role), ...args);
|
|
66
|
+
const permissions = await Promise.all(rolePermissions.map(async (rolePermission) => permissionService.findOneBy("id", relationId(rolePermission.permission), ...args)));
|
|
67
|
+
for (const permission of permissions) {
|
|
68
|
+
if (!permission)
|
|
69
|
+
continue;
|
|
70
|
+
const scopeKind = assignment.scopeKind;
|
|
71
|
+
const scopeId = assignment.scopeId;
|
|
72
|
+
const scopes = [];
|
|
73
|
+
if (scopeKind === ScopeKind.Tenant) {
|
|
74
|
+
scopes.push({ scopeKind, scopeId: tenantId });
|
|
75
|
+
}
|
|
76
|
+
else if (scopeKind === ScopeKind.Resource) {
|
|
77
|
+
scopes.push({ scopeKind, scopeId });
|
|
78
|
+
}
|
|
79
|
+
else if (scopeKind === ScopeKind.OrgUnit && !assignment.inheritDown) {
|
|
80
|
+
scopes.push({ scopeKind, scopeId });
|
|
81
|
+
}
|
|
82
|
+
else if (scopeKind === ScopeKind.OrgUnit && assignment.inheritDown) {
|
|
83
|
+
const descendants = await orgUnitClosureService.listDescendants(tenantId, scopeId, ...args);
|
|
84
|
+
scopes.push(...descendants.map((row) => ({ scopeKind, scopeId: relationId(row.descendant) })));
|
|
85
|
+
}
|
|
86
|
+
for (const scoped of scopes) {
|
|
87
|
+
if (scopeKind === ScopeKind.OrgUnit &&
|
|
88
|
+
assignment.inheritDown &&
|
|
89
|
+
scoped.scopeId !== scopeId &&
|
|
90
|
+
(await inheritanceBlockService.categoryBlockedForAncestor(tenantId, scoped.scopeId, scopeId, permission.category, ...args))) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
materialized.push({
|
|
94
|
+
id: "",
|
|
95
|
+
tenantId,
|
|
96
|
+
principalId,
|
|
97
|
+
permissionKey: permission.key,
|
|
98
|
+
scopeKind: scoped.scopeKind,
|
|
99
|
+
scopeId: scoped.scopeId,
|
|
100
|
+
sourceKind: "role_assignment",
|
|
101
|
+
sourceId: assignment.id,
|
|
102
|
+
startsAt: assignment.startsAt,
|
|
103
|
+
expiresAt: assignment.expiresAt,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const created = await Promise.all(materialized.map((permission) => this.create({
|
|
109
|
+
tenant: permission.tenantId,
|
|
110
|
+
principal: permission.principalId,
|
|
111
|
+
permissionKey: permission.permissionKey,
|
|
112
|
+
scopeKind: permission.scopeKind,
|
|
113
|
+
scopeId: permission.scopeId,
|
|
114
|
+
sourceKind: permission.sourceKind,
|
|
115
|
+
sourceId: permission.sourceId,
|
|
116
|
+
startsAt: permission.startsAt,
|
|
117
|
+
expiresAt: permission.expiresAt,
|
|
118
|
+
}, ...args)));
|
|
119
|
+
return created;
|
|
120
|
+
}
|
|
121
|
+
async rebuildForTenant(tenantId, ...args) {
|
|
122
|
+
const principals = (await new PrincipalService().listAll(...args)).filter((principal) => sameTenant(principal.tenant, tenantId));
|
|
123
|
+
for (const principal of principals) {
|
|
124
|
+
await this.rebuildForPrincipal(tenantId, principal.id, ...args);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
__decorate([
|
|
129
|
+
transactional(),
|
|
130
|
+
__metadata("design:type", Function),
|
|
131
|
+
__metadata("design:paramtypes", [String, String, Object]),
|
|
132
|
+
__metadata("design:returntype", Promise)
|
|
133
|
+
], EffectivePermissionService.prototype, "rebuildForPrincipal", null);
|
|
134
|
+
__decorate([
|
|
135
|
+
transactional(),
|
|
136
|
+
__metadata("design:type", Function),
|
|
137
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
138
|
+
__metadata("design:returntype", Promise)
|
|
139
|
+
], EffectivePermissionService.prototype, "rebuildForTenant", null);
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2VmZmVjdGl2ZS1wZXJtaXNzaW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxzQkFBaUI7QUFDbEcsT0FBTyxFQUErQixTQUFTLEVBQUUsc0JBQWlCO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXRFLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxnQkFBcUM7SUFDbkY7UUFDRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsV0FBbUIsRUFBRSxHQUFHLElBQVc7UUFDMUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUN6QyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFB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RSxFQUFFLENBQzlCLElBQUksQ0FBQyxNQUFNLENBQ1Q7WUFDRSxNQUFNLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDM0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxXQUFXO1lBQ2pDLGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYTtZQUN2QyxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7WUFDL0IsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO1lBQzNCLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVTtZQUNqQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQzdCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztTQUNoQyxFQUNELEdBQUcsSUFBSSxDQUNSLENBQ0YsQ0FDRixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsR0FBRyxJQUFXO1FBQ3JELE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDakksS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUExR087SUFETCxhQUFhLEVBQUU7Ozs7cUVBa0dmO0FBR0s7SUFETCxhQUFhLEVBQUU7Ozs7a0VBTWYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50LCB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3QsIFNjb3BlS2luZCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvbiB9IGZyb20gXCIuLi9tb2RlbHMvZWZmZWN0aXZlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50U2VydmljZSB9IGZyb20gXCIuL3JvbGUtYXNzaWdubWVudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEdyb3VwTWVtYmVyc2hpcFNlcnZpY2UgfSBmcm9tIFwiLi9ncm91cC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmVTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBJbmhlcml0YW5jZUJsb2NrU2VydmljZSB9IGZyb20gXCIuL2luaGVyaXRhbmNlLWJsb2NrLnNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxFZmZlY3RpdmVQZXJtaXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEVmZmVjdGl2ZVBlcm1pc3Npb24pO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8RWZmZWN0aXZlUGVybWlzc2lvbltdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChwZXJtaXNzaW9uKSA9PiBzYW1lVGVuYW50KHBlcm1pc3Npb24udGVuYW50LCB0ZW5hbnRJZCkgJiYgcmVsYXRpb25NYXRjaChwZXJtaXNzaW9uLnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JTY29wZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLFxuICAgIHNjb3BlSWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAocGVybWlzc2lvbikgPT4gc2FtZVRlbmFudChwZXJtaXNzaW9uLnRlbmFudCwgdGVuYW50SWQpICYmIHBlcm1pc3Npb24uc2NvcGVLaW5kID09PSBzY29wZUtpbmQgJiYgcGVybWlzc2lvbi5zY29wZUlkID09PSBzY29wZUlkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGhhc1Blcm1pc3Npb24oXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmcsXG4gICAgYXQ/OiBEYXRlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0Rm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncykpLnNvbWUoXG4gICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgIHBlcm1pc3Npb24uc2NvcGVLaW5kID09PSBzY29wZUtpbmQgJiZcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUlkID09PSBzY29wZUlkICYmXG4gICAgICAgICghcGVybWlzc2lvbi5zdGFydHNBdCB8fCAhYXQgfHwgcGVybWlzc2lvbi5zdGFydHNBdCA8PSBhdCkgJiZcbiAgICAgICAgKCFwZXJtaXNzaW9uLmV4cGlyZXNBdCB8fCAhYXQgfHwgcGVybWlzc2lvbi5leHBpcmVzQXQgPj0gYXQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZvclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGF3YWl0IHRoaXMubGlzdEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVGb3JUZW5hbnQodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHBlcm1pc3Npb24pID0+IHNhbWVUZW5hbnQocGVybWlzc2lvbi50ZW5hbnQsIHRlbmFudElkKSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8RWZmZWN0aXZlUGVybWlzc2lvbltdPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcblxuICAgIGNvbnN0IHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgICBjb25zdCByb2xlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgUm9sZVBlcm1pc3Npb25TZXJ2aWNlKCk7XG4gICAgY29uc3QgcGVybWlzc2lvblNlcnZpY2UgPSBuZXcgUGVybWlzc2lvblNlcnZpY2UoKTtcbiAgICBjb25zdCBncm91cE1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IEdyb3VwTWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgICBjb25zdCBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgICBjb25zdCBvcmdVbml0Q2xvc3VyZVNlcnZpY2UgPSBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCk7XG4gICAgY29uc3QgaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgPSBuZXcgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UoKTtcblxuICAgIGNvbnN0IG1hdGVyaWFsaXplZDogRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W10gPSBbXTtcbiAgICBjb25zdCBzb3VyY2VBc3NpZ25tZW50cyA9IGF3YWl0IHJvbGVBc3NpZ25tZW50U2VydmljZS5saXN0UHJpbmNpcGFsQXNzaWdubWVudHModGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBncm91cE1lbWJlcnNoaXBzID0gYXdhaXQgZ3JvdXBNZW1iZXJzaGlwU2VydmljZS5saXN0UHJpbmNpcGFsR3JvdXBzKHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBncm91cEFzc2lnbm1lbnRzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGdyb3VwTWVtYmVyc2hpcHMubWFwKGFzeW5jIChtZW1iZXJzaGlwKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBQcmluY2lwYWwgPSBhd2FpdCBwcmluY2lwYWxTZXJ2aWNlLmdldEdyb3VwUHJpbmNpcGFsKHJlbGF0aW9uSWQobWVtYmVyc2hpcC50ZW5hbnQpLCByZWxhdGlvbklkKG1lbWJlcnNoaXAuZ3JvdXApLCAuLi5hcmdzKTtcbiAgICAgICAgICByZXR1cm4gcm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyh0ZW5hbnRJZCwgZ3JvdXBQcmluY2lwYWwuaWQsIC4uLmFyZ3MpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICkuZmxhdCgpO1xuXG4gICAgY29uc3QgYXNzaWdubWVudHMgPSBbLi4uc291cmNlQXNzaWdubWVudHMsIC4uLmdyb3VwQXNzaWdubWVudHNdO1xuICAgIGZvciAoY29uc3QgYXNzaWdubWVudCBvZiBhc3NpZ25tZW50cykge1xuICAgICAgY29uc3Qgcm9sZVBlcm1pc3Npb25zID0gYXdhaXQgcm9sZVBlcm1pc3Npb25TZXJ2aWNlLmxpc3RSb2xlUGVybWlzc2lvbnMocmVsYXRpb25JZChhc3NpZ25tZW50LnJvbGUpLCAuLi5hcmdzKTtcbiAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJvbGVQZXJtaXNzaW9ucy5tYXAoYXN5bmMgKHJvbGVQZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb25TZXJ2aWNlLmZpbmRPbmVCeShcImlkXCIsIHJlbGF0aW9uSWQocm9sZVBlcm1pc3Npb24ucGVybWlzc2lvbikgYXMgbmV2ZXIsIC4uLmFyZ3MpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgcGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKCFwZXJtaXNzaW9uKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgc2NvcGVLaW5kID0gYXNzaWdubWVudC5zY29wZUtpbmQ7XG4gICAgICAgIGNvbnN0IHNjb3BlSWQgPSBhc3NpZ25tZW50LnNjb3BlSWQ7XG4gICAgICAgIGNvbnN0IHNjb3BlczogQXJyYXk8eyBzY29wZUtpbmQ6IFNjb3BlS2luZDsgc2NvcGVJZDogc3RyaW5nIH0+ID0gW107XG4gICAgICAgIGlmIChzY29wZUtpbmQgPT09IFNjb3BlS2luZC5UZW5hbnQpIHtcbiAgICAgICAgICBzY29wZXMucHVzaCh7IHNjb3BlS2luZCwgc2NvcGVJZDogdGVuYW50SWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuUmVzb3VyY2UpIHtcbiAgICAgICAgICBzY29wZXMucHVzaCh7IHNjb3BlS2luZCwgc2NvcGVJZCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0ICYmICFhc3NpZ25tZW50LmluaGVyaXREb3duKSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJiBhc3NpZ25tZW50LmluaGVyaXREb3duKSB7XG4gICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSBhd2FpdCBvcmdVbml0Q2xvc3VyZVNlcnZpY2UubGlzdERlc2NlbmRhbnRzKHRlbmFudElkLCBzY29wZUlkLCAuLi5hcmdzKTtcbiAgICAgICAgICBzY29wZXMucHVzaCguLi5kZXNjZW5kYW50cy5tYXAoKHJvdykgPT4gKHsgc2NvcGVLaW5kLCBzY29wZUlkOiByZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSB9KSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzY29wZWQgb2Ygc2NvcGVzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJlxuICAgICAgICAgICAgYXNzaWdubWVudC5pbmhlcml0RG93biAmJlxuICAgICAgICAgICAgc2NvcGVkLnNjb3BlSWQgIT09IHNjb3BlSWQgJiZcbiAgICAgICAgICAgIChhd2FpdCBpbmhlcml0YW5jZUJsb2NrU2VydmljZS5jYXRlZ29yeUJsb2NrZWRGb3JBbmNlc3RvcihcbiAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgIHNjb3BlZC5zY29wZUlkLFxuICAgICAgICAgICAgICBzY29wZUlkLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uLmNhdGVnb3J5LFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hdGVyaWFsaXplZC5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBcIlwiLFxuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcmluY2lwYWxJZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25LZXk6IHBlcm1pc3Npb24ua2V5LFxuICAgICAgICAgICAgc2NvcGVLaW5kOiBzY29wZWQuc2NvcGVLaW5kLFxuICAgICAgICAgICAgc2NvcGVJZDogc2NvcGVkLnNjb3BlSWQsXG4gICAgICAgICAgICBzb3VyY2VLaW5kOiBcInJvbGVfYXNzaWdubWVudFwiLFxuICAgICAgICAgICAgc291cmNlSWQ6IGFzc2lnbm1lbnQuaWQsXG4gICAgICAgICAgICBzdGFydHNBdDogYXNzaWdubWVudC5zdGFydHNBdCxcbiAgICAgICAgICAgIGV4cGlyZXNBdDogYXNzaWdubWVudC5leHBpcmVzQXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtYXRlcmlhbGl6ZWQubWFwKChwZXJtaXNzaW9uKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZW5hbnQ6IHBlcm1pc3Npb24udGVuYW50SWQsXG4gICAgICAgICAgICBwcmluY2lwYWw6IHBlcm1pc3Npb24ucHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uS2V5OiBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXksXG4gICAgICAgICAgICBzY29wZUtpbmQ6IHBlcm1pc3Npb24uc2NvcGVLaW5kLFxuICAgICAgICAgICAgc2NvcGVJZDogcGVybWlzc2lvbi5zY29wZUlkLFxuICAgICAgICAgICAgc291cmNlS2luZDogcGVybWlzc2lvbi5zb3VyY2VLaW5kLFxuICAgICAgICAgICAgc291cmNlSWQ6IHBlcm1pc3Npb24uc291cmNlSWQsXG4gICAgICAgICAgICBzdGFydHNBdDogcGVybWlzc2lvbi5zdGFydHNBdCxcbiAgICAgICAgICAgIGV4cGlyZXNBdDogcGVybWlzc2lvbi5leHBpcmVzQXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5hcmdzXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWJ1aWxkRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJpbmNpcGFscyA9IChhd2FpdCBuZXcgUHJpbmNpcGFsU2VydmljZSgpLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocHJpbmNpcGFsKSA9PiBzYW1lVGVuYW50KHByaW5jaXBhbC50ZW5hbnQsIHRlbmFudElkKSk7XG4gICAgZm9yIChjb25zdCBwcmluY2lwYWwgb2YgcHJpbmNpcGFscykge1xuICAgICAgYXdhaXQgdGhpcy5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWwuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BaseModelService, relationId, relationMatch } from "./../utils.js";
|
|
2
|
+
import { GroupMembership } from "../models/group-membership.model";
|
|
3
|
+
import { PrincipalService } from "./principal.service";
|
|
4
|
+
export class GroupMembershipService extends BaseModelService {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(GroupMembership);
|
|
7
|
+
}
|
|
8
|
+
async addPrincipalToGroup(tenantId, groupId, principalId, metadata, ...args) {
|
|
9
|
+
return this.create({
|
|
10
|
+
tenant: tenantId,
|
|
11
|
+
group: groupId,
|
|
12
|
+
principal: principalId,
|
|
13
|
+
metadata,
|
|
14
|
+
}, ...args);
|
|
15
|
+
}
|
|
16
|
+
async listGroupMembers(groupId, ...args) {
|
|
17
|
+
return (await this.listAll(...args)).filter((membership) => relationMatch(membership.group, groupId));
|
|
18
|
+
}
|
|
19
|
+
async listPrincipalGroups(principalId, ...args) {
|
|
20
|
+
return (await this.listAll(...args)).filter((membership) => relationMatch(membership.principal, principalId));
|
|
21
|
+
}
|
|
22
|
+
async removePrincipalFromGroup(membershipId, ...args) {
|
|
23
|
+
await this.deleteById(membershipId, ...args);
|
|
24
|
+
}
|
|
25
|
+
async resolveGroupPrincipalIdsForPrincipal(principalId, ...args) {
|
|
26
|
+
const principalService = new PrincipalService();
|
|
27
|
+
const memberships = await this.listPrincipalGroups(principalId, ...args);
|
|
28
|
+
const principals = await Promise.all(memberships.map(async (membership) => {
|
|
29
|
+
const tenantId = relationId(membership.tenant);
|
|
30
|
+
const groupId = relationId(membership.group);
|
|
31
|
+
const principal = await principalService.getGroupPrincipal(tenantId, groupId, ...args);
|
|
32
|
+
return principal.id;
|
|
33
|
+
}));
|
|
34
|
+
return principals;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtbWVtYmVyc2hpcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvZ3JvdXAtbWVtYmVyc2hpcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLHNCQUFpQjtBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGdCQUFpQztJQUMzRTtRQUNFLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUN2QixRQUFnQixFQUNoQixPQUFlLEVBQ2YsV0FBbUIsRUFDbkIsUUFBa0MsRUFDbEMsR0FBRyxJQUFXO1FBRWQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUNoQjtZQUNFLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxPQUFPO1lBQ2QsU0FBUyxFQUFFLFdBQVc7WUFDdEIsUUFBUTtTQUNULEVBQ0QsR0FBRyxJQUFJLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLEdBQUcsSUFBVztRQUNwRCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFtQixFQUFFLEdBQUcsSUFBVztRQUMzRCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxZQUFvQixFQUFFLEdBQUcsSUFBVztRQUNqRSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxXQUFtQixFQUFFLEdBQUcsSUFBVztRQUM1RSxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN6RSxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2xDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQ25DLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxNQUFNLFNBQVMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUN2RixPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uSWQsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEdyb3VwTWVtYmVyc2hpcCB9IGZyb20gXCIuLi9tb2RlbHMvZ3JvdXAtbWVtYmVyc2hpcC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxHcm91cE1lbWJlcnNoaXA+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoR3JvdXBNZW1iZXJzaGlwKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFByaW5jaXBhbFRvR3JvdXAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBncm91cElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8R3JvdXBNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBncm91cDogZ3JvdXBJZCxcbiAgICAgICAgcHJpbmNpcGFsOiBwcmluY2lwYWxJZCxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0R3JvdXBNZW1iZXJzKGdyb3VwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwTWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLmdyb3VwLCBncm91cElkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UHJpbmNpcGFsR3JvdXBzKHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5wcmluY2lwYWwsIHByaW5jaXBhbElkKSk7XG4gIH1cblxuICBhc3luYyByZW1vdmVQcmluY2lwYWxGcm9tR3JvdXAobWVtYmVyc2hpcElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKG1lbWJlcnNoaXBJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlR3JvdXBQcmluY2lwYWxJZHNGb3JQcmluY2lwYWwocHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCB0aGlzLmxpc3RQcmluY2lwYWxHcm91cHMocHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHByaW5jaXBhbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1lbWJlcnNoaXBzLm1hcChhc3luYyAobWVtYmVyc2hpcCkgPT4ge1xuICAgICAgICBjb25zdCB0ZW5hbnRJZCA9IHJlbGF0aW9uSWQobWVtYmVyc2hpcC50ZW5hbnQpO1xuICAgICAgICBjb25zdCBncm91cElkID0gcmVsYXRpb25JZChtZW1iZXJzaGlwLmdyb3VwKTtcbiAgICAgICAgY29uc3QgcHJpbmNpcGFsID0gYXdhaXQgcHJpbmNpcGFsU2VydmljZS5nZXRHcm91cFByaW5jaXBhbCh0ZW5hbnRJZCwgZ3JvdXBJZCwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBwcmluY2lwYWwuaWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHByaW5jaXBhbHM7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseModelService, sameTenant } from "./../utils.js";
|
|
2
|
+
import { Group } from "../models/group.model";
|
|
3
|
+
export class GroupService extends BaseModelService {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(Group);
|
|
6
|
+
}
|
|
7
|
+
async createGroup(tenantId, name, orgUnitId, metadata, ...args) {
|
|
8
|
+
return this.create({
|
|
9
|
+
tenant: tenantId,
|
|
10
|
+
orgUnit: orgUnitId,
|
|
11
|
+
name,
|
|
12
|
+
metadata,
|
|
13
|
+
}, ...args);
|
|
14
|
+
}
|
|
15
|
+
async renameGroup(groupId, name, ...args) {
|
|
16
|
+
return this.updateOne(groupId, { name }, ...args);
|
|
17
|
+
}
|
|
18
|
+
async moveGroupToOrgUnit(groupId, orgUnitId, ...args) {
|
|
19
|
+
return this.updateOne(groupId, { orgUnit: orgUnitId }, ...args);
|
|
20
|
+
}
|
|
21
|
+
async listTenantGroups(tenantId, ...args) {
|
|
22
|
+
return (await this.listAll(...args)).filter((group) => sameTenant(group.tenant, tenantId));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2dyb3VwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxzQkFBaUI7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTlDLE1BQU0sT0FBTyxZQUFhLFNBQVEsZ0JBQXVCO0lBQ3ZEO1FBQ0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQ2YsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLFNBQWtCLEVBQ2xCLFFBQWtDLEVBQ2xDLEdBQUcsSUFBVztRQUVkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FDaEI7WUFDRSxNQUFNLEVBQUUsUUFBUTtZQUNoQixPQUFPLEVBQUUsU0FBUztZQUNsQixJQUFJO1lBQ0osUUFBUTtTQUNULEVBQ0QsR0FBRyxJQUFJLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQWUsRUFBRSxJQUFZLEVBQUUsR0FBRyxJQUFXO1FBQzdELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFNBQTZCLEVBQUUsR0FBRyxJQUFXO1FBQ3JGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsR0FBRyxJQUFXO1FBQ3JELE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBHcm91cCB9IGZyb20gXCIuLi9tb2RlbHMvZ3JvdXAubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIEdyb3VwU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8R3JvdXA+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoR3JvdXApO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlR3JvdXAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkPzogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxHcm91cD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgb3JnVW5pdDogb3JnVW5pdElkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZUdyb3VwKGdyb3VwSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoZ3JvdXBJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbW92ZUdyb3VwVG9PcmdVbml0KGdyb3VwSWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShncm91cElkLCB7IG9yZ1VuaXQ6IG9yZ1VuaXRJZCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRHcm91cHModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChncm91cCkgPT4gc2FtZVRlbmFudChncm91cC50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export * from "./tenant-profile.service";
|
|
2
|
+
export * from "./org-unit-profile.service";
|
|
3
|
+
export * from "./org-unit-closure.service";
|
|
4
|
+
export * from "./inheritance-block.service";
|
|
5
|
+
export * from "./tenant.service";
|
|
6
|
+
export * from "./org-unit.service";
|
|
7
|
+
export * from "./user.service";
|
|
8
|
+
export * from "./principal.service";
|
|
9
|
+
export * from "./tenant-membership.service";
|
|
10
|
+
export * from "./org-unit-membership.service";
|
|
11
|
+
export * from "./group.service";
|
|
12
|
+
export * from "./group-membership.service";
|
|
13
|
+
export * from "./permission.service";
|
|
14
|
+
export * from "./role.service";
|
|
15
|
+
export * from "./role-permission.service";
|
|
16
|
+
export * from "./role-assignment.service";
|
|
17
|
+
export * from "./effective-permission.service";
|
|
18
|
+
export * from "./protected-resource.service";
|
|
19
|
+
export * from "./resource-grant.service";
|
|
20
|
+
export * from "./resource-lifecycle.service";
|
|
21
|
+
export * from "./storage-binding.service";
|
|
22
|
+
export * from "./bootstrap.service";
|
|
23
|
+
export * from "./system-management.service";
|
|
24
|
+
export * from "./authz.service";
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3RlbmFudC1wcm9maWxlLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZW5hbnQuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3JnLXVuaXQuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXNlci5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3JnLXVuaXQtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ncm91cC5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ncm91cC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcm9sZS5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2VmZmVjdGl2ZS1wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Byb3RlY3RlZC1yZXNvdXJjZS5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXNvdXJjZS1saWZlY3ljbGUuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmFnZS1iaW5kaW5nLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Jvb3RzdHJhcC5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zeXN0ZW0tbWFuYWdlbWVudC5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hdXRoei5zZXJ2aWNlXCI7XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BaseModelService, relationMatch, sameTenant } from "./../utils.js";
|
|
2
|
+
import { InheritanceBlock } from "../models/inheritance-block.model";
|
|
3
|
+
export class InheritanceBlockService extends BaseModelService {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(InheritanceBlock);
|
|
6
|
+
}
|
|
7
|
+
async blockCategory(tenantId, orgUnitId, permissionCategory, blockedFromAncestorId, reason, ...args) {
|
|
8
|
+
return this.create({
|
|
9
|
+
tenant: tenantId,
|
|
10
|
+
orgUnit: orgUnitId,
|
|
11
|
+
blockedFromAncestor: blockedFromAncestorId,
|
|
12
|
+
permissionCategory,
|
|
13
|
+
reason,
|
|
14
|
+
}, ...args);
|
|
15
|
+
}
|
|
16
|
+
async unblockCategory(blockId, ...args) {
|
|
17
|
+
await this.deleteById(blockId, ...args);
|
|
18
|
+
}
|
|
19
|
+
async listForOrgUnit(tenantId, orgUnitId, ...args) {
|
|
20
|
+
return (await this.listAll(...args)).filter((block) => sameTenant(block.tenant, tenantId) && relationMatch(block.orgUnit, orgUnitId));
|
|
21
|
+
}
|
|
22
|
+
async categoryBlockedForAncestor(tenantId, orgUnitId, ancestorOrgUnitId, category, ...args) {
|
|
23
|
+
return (await this.listForOrgUnit(tenantId, orgUnitId, ...args)).some((block) => block.permissionCategory === category &&
|
|
24
|
+
(!block.blockedFromAncestor || relationMatch(block.blockedFromAncestor, ancestorOrgUnitId)));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5oZXJpdGFuY2UtYmxvY2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2luaGVyaXRhbmNlLWJsb2NrLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFNLGFBQWEsRUFBRSxVQUFVLEVBQUUsc0JBQWlCO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxnQkFBa0M7SUFDN0U7UUFDRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FDakIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsa0JBQXNDLEVBQ3RDLHFCQUE4QixFQUM5QixNQUFlLEVBQ2YsR0FBRyxJQUFXO1FBRWQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUNoQjtZQUNFLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLG1CQUFtQixFQUFFLHFCQUFxQjtZQUMxQyxrQkFBa0I7WUFDbEIsTUFBTTtTQUNQLEVBQ0QsR0FBRyxJQUFJLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQVc7UUFDbkQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxHQUFHLElBQVc7UUFDdEUsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUN6QyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQ3pGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLDBCQUEwQixDQUM5QixRQUFnQixFQUNoQixTQUFpQixFQUNqQixpQkFBeUIsRUFDekIsUUFBNEIsRUFDNUIsR0FBRyxJQUFXO1FBRWQsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ25FLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDUixLQUFLLENBQUMsa0JBQWtCLEtBQUssUUFBUTtZQUNyQyxDQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQixJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUM5RixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgaWQsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSW5oZXJpdGFuY2VCbG9jayB9IGZyb20gXCIuLi9tb2RlbHMvaW5oZXJpdGFuY2UtYmxvY2subW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxJbmhlcml0YW5jZUJsb2NrPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEluaGVyaXRhbmNlQmxvY2spO1xuICB9XG5cbiAgYXN5bmMgYmxvY2tDYXRlZ29yeShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25DYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5LFxuICAgIGJsb2NrZWRGcm9tQW5jZXN0b3JJZD86IHN0cmluZyxcbiAgICByZWFzb24/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxJbmhlcml0YW5jZUJsb2NrPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIGJsb2NrZWRGcm9tQW5jZXN0b3I6IGJsb2NrZWRGcm9tQW5jZXN0b3JJZCxcbiAgICAgICAgcGVybWlzc2lvbkNhdGVnb3J5LFxuICAgICAgICByZWFzb24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyB1bmJsb2NrQ2F0ZWdvcnkoYmxvY2tJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChibG9ja0lkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JPcmdVbml0KHRlbmFudElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8SW5oZXJpdGFuY2VCbG9ja1tdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChibG9jaykgPT4gc2FtZVRlbmFudChibG9jay50ZW5hbnQsIHRlbmFudElkKSAmJiByZWxhdGlvbk1hdGNoKGJsb2NrLm9yZ1VuaXQsIG9yZ1VuaXRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBhbmNlc3Rvck9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RGb3JPcmdVbml0KHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKGJsb2NrKSA9PlxuICAgICAgICBibG9jay5wZXJtaXNzaW9uQ2F0ZWdvcnkgPT09IGNhdGVnb3J5ICYmXG4gICAgICAgICghYmxvY2suYmxvY2tlZEZyb21BbmNlc3RvciB8fCByZWxhdGlvbk1hdGNoKGJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSlcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { BaseModelService, relationId, relationMatch, sameTenant } from "./../utils.js";
|
|
2
|
+
import { OrgUnitClosure } from "../models/org-unit-closure.model";
|
|
3
|
+
export class OrgUnitClosureService extends BaseModelService {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(OrgUnitClosure);
|
|
6
|
+
}
|
|
7
|
+
async listAncestors(tenantId, orgUnitId, ...args) {
|
|
8
|
+
return (await this.listAll(...args))
|
|
9
|
+
.filter((row) => sameTenant(row.tenant, tenantId) && relationMatch(row.descendant, orgUnitId))
|
|
10
|
+
.sort((left, right) => left.depth - right.depth);
|
|
11
|
+
}
|
|
12
|
+
async listDescendants(tenantId, orgUnitId, ...args) {
|
|
13
|
+
return (await this.listAll(...args))
|
|
14
|
+
.filter((row) => sameTenant(row.tenant, tenantId) && relationMatch(row.ancestor, orgUnitId))
|
|
15
|
+
.sort((left, right) => left.depth - right.depth);
|
|
16
|
+
}
|
|
17
|
+
async isAncestorOf(tenantId, ancestorOrgUnitId, descendantOrgUnitId, ...args) {
|
|
18
|
+
return (await this.listAncestors(tenantId, descendantOrgUnitId, ...args)).some((row) => relationMatch(row.ancestor, ancestorOrgUnitId));
|
|
19
|
+
}
|
|
20
|
+
async createSelfLink(tenantId, orgUnitId, ...args) {
|
|
21
|
+
return this.create({
|
|
22
|
+
tenant: tenantId,
|
|
23
|
+
ancestor: orgUnitId,
|
|
24
|
+
descendant: orgUnitId,
|
|
25
|
+
depth: 0,
|
|
26
|
+
}, ...args);
|
|
27
|
+
}
|
|
28
|
+
async insertAncestorLinksForNewChild(tenantId, parentOrgUnitId, childOrgUnitId, ...args) {
|
|
29
|
+
const ancestorLinks = await this.listAncestors(tenantId, parentOrgUnitId, ...args);
|
|
30
|
+
for (const link of ancestorLinks) {
|
|
31
|
+
await this.create({
|
|
32
|
+
tenant: tenantId,
|
|
33
|
+
ancestor: link.ancestor,
|
|
34
|
+
descendant: childOrgUnitId,
|
|
35
|
+
depth: link.depth + 1,
|
|
36
|
+
}, ...args);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async deleteLinksForSubtree(tenantId, orgUnitId, ...args) {
|
|
40
|
+
const subtree = await this.listDescendants(tenantId, orgUnitId, ...args);
|
|
41
|
+
const descendantIds = new Set([orgUnitId, ...subtree.map((row) => relationId(row.descendant))]);
|
|
42
|
+
const ancestorIds = new Set([orgUnitId, ...subtree.map((row) => relationId(row.ancestor))]);
|
|
43
|
+
const rows = (await this.listAll(...args)).filter((row) => sameTenant(row.tenant, tenantId) &&
|
|
44
|
+
(descendantIds.has(relationId(row.descendant)) || ancestorIds.has(relationId(row.ancestor))));
|
|
45
|
+
for (const row of rows) {
|
|
46
|
+
await this.deleteById(row.id, ...args);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBTSxVQUFVLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxzQkFBaUI7QUFDdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRWxFLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxnQkFBZ0M7SUFDekU7UUFDRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBZ0IsRUFBRSxTQUFpQixFQUFFLEdBQUcsSUFBVztRQUNyRSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDakMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQzthQUM3RixJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFnQixFQUFFLFNBQWlCLEVBQUUsR0FBRyxJQUFXO1FBQ3ZFLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUNqQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFF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SUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBpZCwgcmVsYXRpb25JZCwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmUgfSBmcm9tIFwiLi4vbW9kZWxzL29yZy11bml0LWNsb3N1cmUubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRDbG9zdXJlU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8T3JnVW5pdENsb3N1cmU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoT3JnVW5pdENsb3N1cmUpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEFuY2VzdG9ycyh0ZW5hbnRJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiYgcmVsYXRpb25NYXRjaChyb3cuZGVzY2VuZGFudCwgb3JnVW5pdElkKSlcbiAgICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5kZXB0aCAtIHJpZ2h0LmRlcHRoKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiYgcmVsYXRpb25NYXRjaChyb3cuYW5jZXN0b3IsIG9yZ1VuaXRJZCkpXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQuZGVwdGggLSByaWdodC5kZXB0aCk7XG4gIH1cblxuICBhc3luYyBpc0FuY2VzdG9yT2YoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBhbmNlc3Rvck9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGRlc2NlbmRhbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFuY2VzdG9ycyh0ZW5hbnRJZCwgZGVzY2VuZGFudE9yZ1VuaXRJZCwgLi4uYXJncykpLnNvbWUoKHJvdykgPT5cbiAgICAgIHJlbGF0aW9uTWF0Y2gocm93LmFuY2VzdG9yLCBhbmNlc3Rvck9yZ1VuaXRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2VsZkxpbmsodGVuYW50SWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0Q2xvc3VyZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgYW5jZXN0b3I6IG9yZ1VuaXRJZCxcbiAgICAgICAgZGVzY2VuZGFudDogb3JnVW5pdElkLFxuICAgICAgICBkZXB0aDogMCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFuY2VzdG9yTGlua3NGb3JOZXdDaGlsZChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHBhcmVudE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGNoaWxkT3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYW5jZXN0b3JMaW5rcyA9IGF3YWl0IHRoaXMubGlzdEFuY2VzdG9ycyh0ZW5hbnRJZCwgcGFyZW50T3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgYW5jZXN0b3JMaW5rcykge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICAgIGFuY2VzdG9yOiBsaW5rLmFuY2VzdG9yLFxuICAgICAgICAgIGRlc2NlbmRhbnQ6IGNoaWxkT3JnVW5pdElkLFxuICAgICAgICAgIGRlcHRoOiBsaW5rLmRlcHRoICsgMSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVMaW5rc0ZvclN1YnRyZWUodGVuYW50SWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3VidHJlZSA9IGF3YWl0IHRoaXMubGlzdERlc2NlbmRhbnRzKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGRlc2NlbmRhbnRJZHMgPSBuZXcgU2V0KFtvcmdVbml0SWQsIC4uLnN1YnRyZWUubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmRlc2NlbmRhbnQpKV0pO1xuICAgIGNvbnN0IGFuY2VzdG9ySWRzID0gbmV3IFNldChbb3JnVW5pdElkLCAuLi5zdWJ0cmVlLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5hbmNlc3RvcikpXSk7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHNhbWVUZW5hbnQocm93LnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgIChkZXNjZW5kYW50SWRzLmhhcyhyZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSkgfHwgYW5jZXN0b3JJZHMuaGFzKHJlbGF0aW9uSWQocm93LmFuY2VzdG9yKSkpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|