@webiny/api-core 0.0.0-unstable.ac6ebf63c6 → 0.0.0-unstable.c27f4d8a31
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/ApiCoreFeature.js +2 -0
- package/ApiCoreFeature.js.map +1 -1
- package/exports/api/{buildParams.js → build-params.js} +1 -1
- package/exports/api/build-params.js.map +1 -0
- package/exports/api/{eventPublisher.js → event-publisher.js} +1 -1
- package/exports/api/event-publisher.js.map +1 -0
- package/exports/api/{keyValueStore.js → key-value-store.js} +1 -1
- package/exports/api/key-value-store.js.map +1 -0
- package/exports/api/security/api-key.d.ts +7 -0
- package/exports/api/security/api-key.js +9 -0
- package/exports/api/security/api-key.js.map +1 -0
- package/exports/api/security/authentication.d.ts +1 -1
- package/exports/api/security/authentication.js +1 -1
- package/exports/api/security/authentication.js.map +1 -1
- package/exports/api/security/role.d.ts +3 -3
- package/exports/api/security/role.js +3 -3
- package/exports/api/security/role.js.map +1 -1
- package/exports/api/security/user.d.ts +3 -3
- package/exports/api/security/user.js +3 -3
- package/exports/api/security/user.js.map +1 -1
- package/exports/api/system.d.ts +1 -1
- package/exports/api/system.js +1 -1
- package/exports/api/system.js.map +1 -1
- package/exports/api/tenancy.d.ts +4 -4
- package/exports/api/tenancy.js +4 -4
- package/exports/api/tenancy.js.map +1 -1
- package/features/featureFlags/FeatureFlags.d.ts +12 -0
- package/features/featureFlags/FeatureFlags.js +18 -0
- package/features/featureFlags/FeatureFlags.js.map +1 -0
- package/features/featureFlags/abstractions.d.ts +8 -0
- package/features/featureFlags/abstractions.js +4 -0
- package/features/featureFlags/abstractions.js.map +1 -0
- package/features/featureFlags/feature.d.ts +1 -0
- package/features/featureFlags/feature.js +10 -0
- package/features/featureFlags/feature.js.map +1 -0
- package/features/security/IdentityContext/IdentityContext.js +1 -1
- package/features/security/IdentityContext/IdentityContext.js.map +1 -1
- package/features/security/apiKeys/CreateApiKey/CreateApiKeyUseCase.js +1 -1
- package/features/security/apiKeys/CreateApiKey/CreateApiKeyUseCase.js.map +1 -1
- package/features/security/apiKeys/CreateApiKey/events.d.ts +4 -4
- package/features/security/apiKeys/CreateApiKey/events.js +4 -4
- package/features/security/apiKeys/CreateApiKey/events.js.map +1 -1
- package/features/security/apiKeys/DeleteApiKey/events.d.ts +4 -4
- package/features/security/apiKeys/DeleteApiKey/events.js +4 -4
- package/features/security/apiKeys/DeleteApiKey/events.js.map +1 -1
- package/features/security/apiKeys/ListApiKeys/ListApiKeysUseCase.js +1 -1
- package/features/security/apiKeys/ListApiKeys/ListApiKeysUseCase.js.map +1 -1
- package/features/security/apiKeys/UpdateApiKey/UpdateApiKeyUseCase.js +1 -1
- package/features/security/apiKeys/UpdateApiKey/UpdateApiKeyUseCase.js.map +1 -1
- package/features/security/apiKeys/UpdateApiKey/events.d.ts +4 -4
- package/features/security/apiKeys/UpdateApiKey/events.js +4 -4
- package/features/security/apiKeys/UpdateApiKey/events.js.map +1 -1
- package/features/security/apiKeys/shared/schemas.d.ts +10 -71
- package/features/security/apiKeys/shared/schemas.js +4 -4
- package/features/security/apiKeys/shared/schemas.js.map +1 -1
- package/features/security/authentication/AuthenticationContext/SetIdTokenCookie.d.ts +2 -2
- package/features/security/authentication/AuthenticationContext/SetIdTokenCookie.js +2 -2
- package/features/security/authentication/AuthenticationContext/SetIdTokenCookie.js.map +1 -1
- package/features/security/authentication/AuthenticationContext/events.d.ts +4 -4
- package/features/security/authentication/AuthenticationContext/events.js +4 -4
- package/features/security/authentication/AuthenticationContext/events.js.map +1 -1
- package/features/security/login/abstractions.d.ts +2 -2
- package/features/security/login/abstractions.js +2 -2
- package/features/security/login/abstractions.js.map +1 -1
- package/features/security/permissions/createPermissions.d.ts +8 -0
- package/features/security/permissions/createPermissions.js +240 -0
- package/features/security/permissions/createPermissions.js.map +1 -0
- package/features/security/permissions/index.d.ts +2 -0
- package/features/security/permissions/index.js +3 -0
- package/features/security/permissions/index.js.map +1 -0
- package/features/security/permissions/types.d.ts +137 -0
- package/features/security/permissions/types.js +3 -0
- package/features/security/permissions/types.js.map +1 -0
- package/features/security/roles/CreateRole/CreateRoleUseCase.js +1 -1
- package/features/security/roles/CreateRole/CreateRoleUseCase.js.map +1 -1
- package/features/security/roles/CreateRole/events.d.ts +4 -4
- package/features/security/roles/CreateRole/events.js +4 -4
- package/features/security/roles/CreateRole/events.js.map +1 -1
- package/features/security/roles/CreateRole/schema.d.ts +2 -20
- package/features/security/roles/CreateRole/schema.js +2 -2
- package/features/security/roles/CreateRole/schema.js.map +1 -1
- package/features/security/roles/DeleteRole/events.d.ts +4 -4
- package/features/security/roles/DeleteRole/events.js +4 -4
- package/features/security/roles/DeleteRole/events.js.map +1 -1
- package/features/security/roles/UpdateRole/UpdateRoleUseCase.js +1 -1
- package/features/security/roles/UpdateRole/UpdateRoleUseCase.js.map +1 -1
- package/features/security/roles/UpdateRole/events.d.ts +4 -4
- package/features/security/roles/UpdateRole/events.js +4 -4
- package/features/security/roles/UpdateRole/events.js.map +1 -1
- package/features/security/roles/UpdateRole/schema.d.ts +2 -18
- package/features/security/roles/UpdateRole/schema.js +2 -2
- package/features/security/roles/UpdateRole/schema.js.map +1 -1
- package/features/security/teams/CreateTeam/CreateTeamUseCase.js +1 -1
- package/features/security/teams/CreateTeam/CreateTeamUseCase.js.map +1 -1
- package/features/security/teams/CreateTeam/events.d.ts +4 -4
- package/features/security/teams/CreateTeam/events.js +4 -4
- package/features/security/teams/CreateTeam/events.js.map +1 -1
- package/features/security/teams/CreateTeam/index.d.ts +1 -1
- package/features/security/teams/CreateTeam/index.js +1 -1
- package/features/security/teams/CreateTeam/index.js.map +1 -1
- package/features/security/teams/CreateTeam/schema.d.ts +2 -12
- package/features/security/teams/DeleteTeam/events.d.ts +4 -4
- package/features/security/teams/DeleteTeam/events.js +4 -4
- package/features/security/teams/DeleteTeam/events.js.map +1 -1
- package/features/security/teams/UpdateTeam/UpdateTeamUseCase.js +1 -1
- package/features/security/teams/UpdateTeam/UpdateTeamUseCase.js.map +1 -1
- package/features/security/teams/UpdateTeam/events.d.ts +4 -4
- package/features/security/teams/UpdateTeam/events.js +4 -4
- package/features/security/teams/UpdateTeam/events.js.map +1 -1
- package/features/security/teams/UpdateTeam/schema.d.ts +2 -10
- package/features/system/InstallSystem/abstractions.d.ts +2 -2
- package/features/system/InstallSystem/abstractions.js +1 -1
- package/features/system/InstallSystem/abstractions.js.map +1 -1
- package/features/system/InstallSystem/events.js +2 -2
- package/features/system/InstallSystem/events.js.map +1 -1
- package/features/system/InstallSystem/index.d.ts +1 -1
- package/features/system/InstallSystem/index.js +1 -1
- package/features/system/InstallSystem/index.js.map +1 -1
- package/features/tenancy/CreateTenant/abstractions.d.ts +4 -4
- package/features/tenancy/CreateTenant/abstractions.js +2 -2
- package/features/tenancy/CreateTenant/abstractions.js.map +1 -1
- package/features/tenancy/CreateTenant/events.js +3 -3
- package/features/tenancy/CreateTenant/events.js.map +1 -1
- package/features/tenancy/CreateTenant/index.d.ts +1 -1
- package/features/tenancy/CreateTenant/index.js +1 -1
- package/features/tenancy/CreateTenant/index.js.map +1 -1
- package/features/tenancy/DeleteTenant/abstractions.d.ts +4 -4
- package/features/tenancy/DeleteTenant/abstractions.js +2 -2
- package/features/tenancy/DeleteTenant/abstractions.js.map +1 -1
- package/features/tenancy/DeleteTenant/events.js +3 -3
- package/features/tenancy/DeleteTenant/events.js.map +1 -1
- package/features/tenancy/DeleteTenant/index.d.ts +1 -1
- package/features/tenancy/DeleteTenant/index.js +1 -1
- package/features/tenancy/DeleteTenant/index.js.map +1 -1
- package/features/tenancy/InstallTenant/abstractions.d.ts +2 -2
- package/features/tenancy/InstallTenant/abstractions.js +1 -1
- package/features/tenancy/InstallTenant/abstractions.js.map +1 -1
- package/features/tenancy/InstallTenant/events.js +2 -2
- package/features/tenancy/InstallTenant/events.js.map +1 -1
- package/features/tenancy/InstallTenant/index.d.ts +1 -1
- package/features/tenancy/InstallTenant/index.js +1 -1
- package/features/tenancy/InstallTenant/index.js.map +1 -1
- package/features/tenancy/UpdateTenant/abstractions.d.ts +4 -4
- package/features/tenancy/UpdateTenant/abstractions.js +2 -2
- package/features/tenancy/UpdateTenant/abstractions.js.map +1 -1
- package/features/tenancy/UpdateTenant/events.js +3 -3
- package/features/tenancy/UpdateTenant/events.js.map +1 -1
- package/features/tenancy/UpdateTenant/index.d.ts +1 -1
- package/features/tenancy/UpdateTenant/index.js +1 -1
- package/features/tenancy/UpdateTenant/index.js.map +1 -1
- package/features/users/CreateUser/CreateUserUseCase.js +1 -1
- package/features/users/CreateUser/CreateUserUseCase.js.map +1 -1
- package/features/users/CreateUser/events.d.ts +4 -4
- package/features/users/CreateUser/events.js +4 -4
- package/features/users/CreateUser/events.js.map +1 -1
- package/features/users/CreateUser/schema.d.ts +4 -36
- package/features/users/DeleteUser/events.d.ts +4 -4
- package/features/users/DeleteUser/events.js +4 -4
- package/features/users/DeleteUser/events.js.map +1 -1
- package/features/users/ExternalIdpUserSync/ExternalIdpUserSyncHandler.d.ts +3 -3
- package/features/users/ExternalIdpUserSync/ExternalIdpUserSyncHandler.js +2 -2
- package/features/users/ExternalIdpUserSync/ExternalIdpUserSyncHandler.js.map +1 -1
- package/features/users/UpdateUser/UpdateUserUseCase.js +1 -1
- package/features/users/UpdateUser/UpdateUserUseCase.js.map +1 -1
- package/features/users/UpdateUser/events.d.ts +4 -4
- package/features/users/UpdateUser/events.js +4 -4
- package/features/users/UpdateUser/events.js.map +1 -1
- package/features/users/UpdateUser/schema.d.ts +4 -30
- package/features/wcp/WcpContext/WcpContext.d.ts +2 -0
- package/features/wcp/WcpContext/WcpContext.js +6 -0
- package/features/wcp/WcpContext/WcpContext.js.map +1 -1
- package/features/wcp/WcpContext/abstractions.d.ts +1 -0
- package/features/wcp/WcpContext/abstractions.js.map +1 -1
- package/features/wcp/WcpContext/decorators/WcpContextWithFeatureFlagsDecorator.d.ts +79 -0
- package/features/wcp/WcpContext/decorators/WcpContextWithFeatureFlagsDecorator.js +120 -0
- package/features/wcp/WcpContext/decorators/WcpContextWithFeatureFlagsDecorator.js.map +1 -0
- package/features/wcp/WcpFeature.js +2 -0
- package/features/wcp/WcpFeature.js.map +1 -1
- package/graphql/wcp/graphql.js +1 -1
- package/graphql/wcp/graphql.js.map +1 -1
- package/legacy/wcp/LegacyWcpContext.d.ts +2 -0
- package/legacy/wcp/LegacyWcpContext.js +6 -0
- package/legacy/wcp/LegacyWcpContext.js.map +1 -1
- package/models/base/BaseModel.js +2 -2
- package/models/base/BaseModel.js.map +1 -1
- package/models/base/ModelBuilder.d.ts +2 -2
- package/models/base/ModelBuilder.js +21 -2
- package/models/base/ModelBuilder.js.map +1 -1
- package/models/cms/FieldBuilder.d.ts +3 -2
- package/models/cms/FieldBuilder.js +12 -17
- package/models/cms/FieldBuilder.js.map +1 -1
- package/models/cms/FieldBuilderRegistry.d.ts +1 -1
- package/models/cms/FieldBuilderRegistry.js.map +1 -1
- package/models/cms/FieldDefinitionsBuilder.d.ts +1 -0
- package/models/cms/FieldDefinitionsBuilder.js +13 -15
- package/models/cms/FieldDefinitionsBuilder.js.map +1 -1
- package/models/cms/PrivateCmsModelBuilder.js.map +1 -1
- package/models/cms/abstractions.d.ts +1 -1
- package/models/cms/abstractions.js.map +1 -1
- package/models/cms/fieldsBuilder.md +1 -1
- package/models/simple/Page/abstractions.d.ts +1 -11
- package/package.json +19 -20
- package/exports/api/buildParams.js.map +0 -1
- package/exports/api/eventPublisher.js.map +0 -1
- package/exports/api/keyValueStore.js.map +0 -1
- package/exports/api/security/apiKey.d.ts +0 -7
- package/exports/api/security/apiKey.js +0 -9
- package/exports/api/security/apiKey.js.map +0 -1
- package/extensions/BuildParam.d.ts +0 -11
- package/extensions/BuildParam.js +0 -119
- package/extensions/BuildParam.js.map +0 -1
- package/extensions/GenericExtension.d.ts +0 -10
- package/extensions/GenericExtension.js +0 -7
- package/extensions/GenericExtension.js.map +0 -1
- package/extensions/eventHandlers/AfterAuthentication.d.ts +0 -10
- package/extensions/eventHandlers/AfterAuthentication.js +0 -9
- package/extensions/eventHandlers/AfterAuthentication.js.map +0 -1
- package/extensions/eventHandlers/ApiKeyAfterCreate.d.ts +0 -10
- package/extensions/eventHandlers/ApiKeyAfterCreate.js +0 -9
- package/extensions/eventHandlers/ApiKeyAfterCreate.js.map +0 -1
- package/extensions/eventHandlers/ApiKeyAfterDelete.d.ts +0 -10
- package/extensions/eventHandlers/ApiKeyAfterDelete.js +0 -9
- package/extensions/eventHandlers/ApiKeyAfterDelete.js.map +0 -1
- package/extensions/eventHandlers/ApiKeyAfterUpdate.d.ts +0 -10
- package/extensions/eventHandlers/ApiKeyAfterUpdate.js +0 -9
- package/extensions/eventHandlers/ApiKeyAfterUpdate.js.map +0 -1
- package/extensions/eventHandlers/ApiKeyBeforeCreate.d.ts +0 -10
- package/extensions/eventHandlers/ApiKeyBeforeCreate.js +0 -9
- package/extensions/eventHandlers/ApiKeyBeforeCreate.js.map +0 -1
- package/extensions/eventHandlers/ApiKeyBeforeDelete.d.ts +0 -10
- package/extensions/eventHandlers/ApiKeyBeforeDelete.js +0 -9
- package/extensions/eventHandlers/ApiKeyBeforeDelete.js.map +0 -1
- package/extensions/eventHandlers/ApiKeyBeforeUpdate.d.ts +0 -10
- package/extensions/eventHandlers/ApiKeyBeforeUpdate.js +0 -9
- package/extensions/eventHandlers/ApiKeyBeforeUpdate.js.map +0 -1
- package/extensions/eventHandlers/BeforeAuthentication.d.ts +0 -10
- package/extensions/eventHandlers/BeforeAuthentication.js +0 -9
- package/extensions/eventHandlers/BeforeAuthentication.js.map +0 -1
- package/extensions/eventHandlers/RoleAfterCreate.d.ts +0 -10
- package/extensions/eventHandlers/RoleAfterCreate.js +0 -9
- package/extensions/eventHandlers/RoleAfterCreate.js.map +0 -1
- package/extensions/eventHandlers/RoleAfterDelete.d.ts +0 -10
- package/extensions/eventHandlers/RoleAfterDelete.js +0 -9
- package/extensions/eventHandlers/RoleAfterDelete.js.map +0 -1
- package/extensions/eventHandlers/RoleAfterUpdate.d.ts +0 -10
- package/extensions/eventHandlers/RoleAfterUpdate.js +0 -9
- package/extensions/eventHandlers/RoleAfterUpdate.js.map +0 -1
- package/extensions/eventHandlers/RoleBeforeCreate.d.ts +0 -10
- package/extensions/eventHandlers/RoleBeforeCreate.js +0 -9
- package/extensions/eventHandlers/RoleBeforeCreate.js.map +0 -1
- package/extensions/eventHandlers/RoleBeforeDelete.d.ts +0 -10
- package/extensions/eventHandlers/RoleBeforeDelete.js +0 -9
- package/extensions/eventHandlers/RoleBeforeDelete.js.map +0 -1
- package/extensions/eventHandlers/RoleBeforeUpdate.d.ts +0 -10
- package/extensions/eventHandlers/RoleBeforeUpdate.js +0 -9
- package/extensions/eventHandlers/RoleBeforeUpdate.js.map +0 -1
- package/extensions/eventHandlers/SystemInstalled.d.ts +0 -10
- package/extensions/eventHandlers/SystemInstalled.js +0 -9
- package/extensions/eventHandlers/SystemInstalled.js.map +0 -1
- package/extensions/eventHandlers/TeamAfterCreate.d.ts +0 -10
- package/extensions/eventHandlers/TeamAfterCreate.js +0 -9
- package/extensions/eventHandlers/TeamAfterCreate.js.map +0 -1
- package/extensions/eventHandlers/TeamAfterDelete.d.ts +0 -10
- package/extensions/eventHandlers/TeamAfterDelete.js +0 -9
- package/extensions/eventHandlers/TeamAfterDelete.js.map +0 -1
- package/extensions/eventHandlers/TeamAfterUpdate.d.ts +0 -10
- package/extensions/eventHandlers/TeamAfterUpdate.js +0 -9
- package/extensions/eventHandlers/TeamAfterUpdate.js.map +0 -1
- package/extensions/eventHandlers/TeamBeforeCreate.d.ts +0 -10
- package/extensions/eventHandlers/TeamBeforeCreate.js +0 -9
- package/extensions/eventHandlers/TeamBeforeCreate.js.map +0 -1
- package/extensions/eventHandlers/TeamBeforeDelete.d.ts +0 -10
- package/extensions/eventHandlers/TeamBeforeDelete.js +0 -9
- package/extensions/eventHandlers/TeamBeforeDelete.js.map +0 -1
- package/extensions/eventHandlers/TeamBeforeUpdate.d.ts +0 -10
- package/extensions/eventHandlers/TeamBeforeUpdate.js +0 -9
- package/extensions/eventHandlers/TeamBeforeUpdate.js.map +0 -1
- package/extensions/eventHandlers/TenantAfterCreate.d.ts +0 -10
- package/extensions/eventHandlers/TenantAfterCreate.js +0 -9
- package/extensions/eventHandlers/TenantAfterCreate.js.map +0 -1
- package/extensions/eventHandlers/TenantAfterDelete.d.ts +0 -10
- package/extensions/eventHandlers/TenantAfterDelete.js +0 -9
- package/extensions/eventHandlers/TenantAfterDelete.js.map +0 -1
- package/extensions/eventHandlers/TenantAfterUpdate.d.ts +0 -10
- package/extensions/eventHandlers/TenantAfterUpdate.js +0 -9
- package/extensions/eventHandlers/TenantAfterUpdate.js.map +0 -1
- package/extensions/eventHandlers/TenantBeforeCreate.d.ts +0 -10
- package/extensions/eventHandlers/TenantBeforeCreate.js +0 -9
- package/extensions/eventHandlers/TenantBeforeCreate.js.map +0 -1
- package/extensions/eventHandlers/TenantBeforeDelete.d.ts +0 -10
- package/extensions/eventHandlers/TenantBeforeDelete.js +0 -9
- package/extensions/eventHandlers/TenantBeforeDelete.js.map +0 -1
- package/extensions/eventHandlers/TenantBeforeUpdate.d.ts +0 -10
- package/extensions/eventHandlers/TenantBeforeUpdate.js +0 -9
- package/extensions/eventHandlers/TenantBeforeUpdate.js.map +0 -1
- package/extensions/eventHandlers/TenantInstalled.d.ts +0 -10
- package/extensions/eventHandlers/TenantInstalled.js +0 -9
- package/extensions/eventHandlers/TenantInstalled.js.map +0 -1
- package/extensions/eventHandlers/UserAfterCreate.d.ts +0 -10
- package/extensions/eventHandlers/UserAfterCreate.js +0 -9
- package/extensions/eventHandlers/UserAfterCreate.js.map +0 -1
- package/extensions/eventHandlers/UserAfterDelete.d.ts +0 -10
- package/extensions/eventHandlers/UserAfterDelete.js +0 -9
- package/extensions/eventHandlers/UserAfterDelete.js.map +0 -1
- package/extensions/eventHandlers/UserAfterUpdate.d.ts +0 -10
- package/extensions/eventHandlers/UserAfterUpdate.js +0 -9
- package/extensions/eventHandlers/UserAfterUpdate.js.map +0 -1
- package/extensions/eventHandlers/UserBeforeCreate.d.ts +0 -10
- package/extensions/eventHandlers/UserBeforeCreate.js +0 -9
- package/extensions/eventHandlers/UserBeforeCreate.js.map +0 -1
- package/extensions/eventHandlers/UserBeforeDelete.d.ts +0 -10
- package/extensions/eventHandlers/UserBeforeDelete.js +0 -9
- package/extensions/eventHandlers/UserBeforeDelete.js.map +0 -1
- package/extensions/eventHandlers/UserBeforeUpdate.d.ts +0 -10
- package/extensions/eventHandlers/UserBeforeUpdate.js +0 -9
- package/extensions/eventHandlers/UserBeforeUpdate.js.map +0 -1
- package/extensions/eventHandlers/index.d.ts +0 -34
- package/extensions/eventHandlers/index.js +0 -49
- package/extensions/eventHandlers/index.js.map +0 -1
- package/extensions/index.d.ts +0 -58
- package/extensions/index.js +0 -49
- package/extensions/index.js.map +0 -1
- /package/exports/api/{buildParams.d.ts → build-params.d.ts} +0 -0
- /package/exports/api/{eventPublisher.d.ts → event-publisher.d.ts} +0 -0
- /package/exports/api/{keyValueStore.d.ts → key-value-store.d.ts} +0 -0
|
@@ -19,7 +19,7 @@ class UpdateApiKeyUseCaseImpl {
|
|
|
19
19
|
}
|
|
20
20
|
const validation = updateApiKeyInputSchema.safeParse(input);
|
|
21
21
|
if (!validation.success) {
|
|
22
|
-
return Result.fail(new ApiKeyValidationError(validation.error.
|
|
22
|
+
return Result.fail(new ApiKeyValidationError(validation.error.issues[0].message));
|
|
23
23
|
}
|
|
24
24
|
const existingResult = await this.repository.get(id);
|
|
25
25
|
if (existingResult.isFail()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Result","UpdateApiKeyUseCase","UpdateApiKeyUseCaseAbstraction","ApiKeysRepository","IdentityContext","EventPublisher","updateApiKeyInputSchema","ApiKeyBeforeUpdateEvent","ApiKeyAfterUpdateEvent","ApiKeyNotAuthorizedError","ApiKeyValidationError","UpdateApiKeyUseCaseImpl","constructor","repository","identityContext","eventPublisher","execute","id","input","hasPermission","getPermission","fail","validation","safeParse","success","error","
|
|
1
|
+
{"version":3,"names":["Result","UpdateApiKeyUseCase","UpdateApiKeyUseCaseAbstraction","ApiKeysRepository","IdentityContext","EventPublisher","updateApiKeyInputSchema","ApiKeyBeforeUpdateEvent","ApiKeyAfterUpdateEvent","ApiKeyNotAuthorizedError","ApiKeyValidationError","UpdateApiKeyUseCaseImpl","constructor","repository","identityContext","eventPublisher","execute","id","input","hasPermission","getPermission","fail","validation","safeParse","success","error","issues","message","existingResult","get","isFail","existingApiKey","value","updatedApiKey","data","publish","original","updated","result","update","ok","createImplementation","implementation","dependencies"],"sources":["UpdateApiKeyUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { UpdateApiKeyUseCase as UpdateApiKeyUseCaseAbstraction } from \"./abstractions.js\";\nimport { ApiKeysRepository } from \"../shared/abstractions.js\";\nimport { IdentityContext } from \"../../IdentityContext/abstractions.js\";\nimport { EventPublisher } from \"~/features/eventPublisher/index.js\";\nimport { updateApiKeyInputSchema } from \"../shared/schemas.js\";\nimport { ApiKeyBeforeUpdateEvent, ApiKeyAfterUpdateEvent } from \"./events.js\";\nimport type { ApiKey, UpdateApiKeyInput } from \"../shared/types.js\";\nimport { ApiKeyNotAuthorizedError, ApiKeyValidationError } from \"../shared/errors.js\";\n\nclass UpdateApiKeyUseCaseImpl implements UpdateApiKeyUseCaseAbstraction.Interface {\n private repository: ApiKeysRepository.Interface;\n private identityContext: IdentityContext.Interface;\n private eventPublisher: EventPublisher.Interface;\n\n constructor(\n repository: ApiKeysRepository.Interface,\n identityContext: IdentityContext.Interface,\n eventPublisher: EventPublisher.Interface\n ) {\n this.repository = repository;\n this.identityContext = identityContext;\n this.eventPublisher = eventPublisher;\n }\n\n async execute(\n id: string,\n input: UpdateApiKeyInput\n ): Promise<Result<ApiKey, UpdateApiKeyUseCaseAbstraction.Error>> {\n const hasPermission = await this.identityContext.getPermission(\"security.apiKey\");\n if (!hasPermission) {\n return Result.fail(new ApiKeyNotAuthorizedError());\n }\n\n const validation = updateApiKeyInputSchema.safeParse(input);\n if (!validation.success) {\n return Result.fail(new ApiKeyValidationError(validation.error.issues[0].message));\n }\n\n const existingResult = await this.repository.get(id);\n if (existingResult.isFail()) {\n return Result.fail(existingResult.error);\n }\n\n const existingApiKey = existingResult.value;\n\n const updatedApiKey: ApiKey = {\n ...existingApiKey,\n ...validation.data\n };\n\n await this.eventPublisher.publish(\n new ApiKeyBeforeUpdateEvent({\n original: existingApiKey,\n updated: updatedApiKey,\n input: validation.data\n })\n );\n\n const result = await this.repository.update(updatedApiKey);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(\n new ApiKeyAfterUpdateEvent({\n original: existingApiKey,\n updated: updatedApiKey,\n input: validation.data\n })\n );\n\n return Result.ok(updatedApiKey);\n }\n}\n\nexport const UpdateApiKeyUseCase = UpdateApiKeyUseCaseAbstraction.createImplementation({\n implementation: UpdateApiKeyUseCaseImpl,\n dependencies: [ApiKeysRepository, IdentityContext, EventPublisher]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,mBAAmB,IAAIC,8BAA8B;AAC9D,SAASC,iBAAiB;AAC1B,SAASC,eAAe;AACxB,SAASC,cAAc;AACvB,SAASC,uBAAuB;AAChC,SAASC,uBAAuB,EAAEC,sBAAsB;AAExD,SAASC,wBAAwB,EAAEC,qBAAqB;AAExD,MAAMC,uBAAuB,CAAqD;EAK9EC,WAAWA,CACPC,UAAuC,EACvCC,eAA0C,EAC1CC,cAAwC,EAC1C;IACE,IAAI,CAACF,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,eAAe,GAAGA,eAAe;IACtC,IAAI,CAACC,cAAc,GAAGA,cAAc;EACxC;EAEA,MAAMC,OAAOA,CACTC,EAAU,EACVC,KAAwB,EACqC;IAC7D,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACL,eAAe,CAACM,aAAa,CAAC,iBAAiB,CAAC;IACjF,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOnB,MAAM,CAACqB,IAAI,CAAC,IAAIZ,wBAAwB,CAAC,CAAC,CAAC;IACtD;IAEA,MAAMa,UAAU,GAAGhB,uBAAuB,CAACiB,SAAS,CAACL,KAAK,CAAC;IAC3D,IAAI,CAACI,UAAU,CAACE,OAAO,EAAE;MACrB,OAAOxB,MAAM,CAACqB,IAAI,CAAC,IAAIX,qBAAqB,CAACY,UAAU,CAACG,KAAK,CAACC,MAAM,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC;IACrF;IAEA,MAAMC,cAAc,GAAG,MAAM,IAAI,CAACf,UAAU,CAACgB,GAAG,CAACZ,EAAE,CAAC;IACpD,IAAIW,cAAc,CAACE,MAAM,CAAC,CAAC,EAAE;MACzB,OAAO9B,MAAM,CAACqB,IAAI,CAACO,cAAc,CAACH,KAAK,CAAC;IAC5C;IAEA,MAAMM,cAAc,GAAGH,cAAc,CAACI,KAAK;IAE3C,MAAMC,aAAqB,GAAG;MAC1B,GAAGF,cAAc;MACjB,GAAGT,UAAU,CAACY;IAClB,CAAC;IAED,MAAM,IAAI,CAACnB,cAAc,CAACoB,OAAO,CAC7B,IAAI5B,uBAAuB,CAAC;MACxB6B,QAAQ,EAAEL,cAAc;MACxBM,OAAO,EAAEJ,aAAa;MACtBf,KAAK,EAAEI,UAAU,CAACY;IACtB,CAAC,CACL,CAAC;IAED,MAAMI,MAAM,GAAG,MAAM,IAAI,CAACzB,UAAU,CAAC0B,MAAM,CAACN,aAAa,CAAC;IAE1D,IAAIK,MAAM,CAACR,MAAM,CAAC,CAAC,EAAE;MACjB,OAAO9B,MAAM,CAACqB,IAAI,CAACiB,MAAM,CAACb,KAAK,CAAC;IACpC;IAEA,MAAM,IAAI,CAACV,cAAc,CAACoB,OAAO,CAC7B,IAAI3B,sBAAsB,CAAC;MACvB4B,QAAQ,EAAEL,cAAc;MACxBM,OAAO,EAAEJ,aAAa;MACtBf,KAAK,EAAEI,UAAU,CAACY;IACtB,CAAC,CACL,CAAC;IAED,OAAOlC,MAAM,CAACwC,EAAE,CAACP,aAAa,CAAC;EACnC;AACJ;AAEA,OAAO,MAAMhC,mBAAmB,GAAGC,8BAA8B,CAACuC,oBAAoB,CAAC;EACnFC,cAAc,EAAE/B,uBAAuB;EACvCgC,YAAY,EAAE,CAACxC,iBAAiB,EAAEC,eAAe,EAAEC,cAAc;AACrE,CAAC,CAAC","ignoreList":[]}
|
|
@@ -5,8 +5,8 @@ export declare class ApiKeyBeforeUpdateEvent extends DomainEvent<ApiKeyBeforeUpd
|
|
|
5
5
|
eventType: "apiKey.beforeUpdate";
|
|
6
6
|
getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<ApiKeyBeforeUpdateEvent>>;
|
|
7
7
|
}
|
|
8
|
-
export declare const
|
|
9
|
-
export declare namespace
|
|
8
|
+
export declare const ApiKeyBeforeUpdateEventHandler: import("@webiny/di").Abstraction<IEventHandler<ApiKeyBeforeUpdateEvent>>;
|
|
9
|
+
export declare namespace ApiKeyBeforeUpdateEventHandler {
|
|
10
10
|
type Interface = IEventHandler<ApiKeyBeforeUpdateEvent>;
|
|
11
11
|
type Event = ApiKeyBeforeUpdateEvent;
|
|
12
12
|
}
|
|
@@ -14,8 +14,8 @@ export declare class ApiKeyAfterUpdateEvent extends DomainEvent<ApiKeyAfterUpdat
|
|
|
14
14
|
eventType: "apiKey.afterUpdate";
|
|
15
15
|
getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<ApiKeyAfterUpdateEvent>>;
|
|
16
16
|
}
|
|
17
|
-
export declare const
|
|
18
|
-
export declare namespace
|
|
17
|
+
export declare const ApiKeyAfterUpdateEventHandler: import("@webiny/di").Abstraction<IEventHandler<ApiKeyAfterUpdateEvent>>;
|
|
18
|
+
export declare namespace ApiKeyAfterUpdateEventHandler {
|
|
19
19
|
type Interface = IEventHandler<ApiKeyAfterUpdateEvent>;
|
|
20
20
|
type Event = ApiKeyAfterUpdateEvent;
|
|
21
21
|
}
|
|
@@ -3,16 +3,16 @@ import { DomainEvent } from "../../../eventPublisher/index.js";
|
|
|
3
3
|
export class ApiKeyBeforeUpdateEvent extends DomainEvent {
|
|
4
4
|
eventType = "apiKey.beforeUpdate";
|
|
5
5
|
getHandlerAbstraction() {
|
|
6
|
-
return
|
|
6
|
+
return ApiKeyBeforeUpdateEventHandler;
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
export const
|
|
9
|
+
export const ApiKeyBeforeUpdateEventHandler = createAbstraction("ApiKeyBeforeUpdateEventHandler");
|
|
10
10
|
export class ApiKeyAfterUpdateEvent extends DomainEvent {
|
|
11
11
|
eventType = "apiKey.afterUpdate";
|
|
12
12
|
getHandlerAbstraction() {
|
|
13
|
-
return
|
|
13
|
+
return ApiKeyAfterUpdateEventHandler;
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
export const
|
|
16
|
+
export const ApiKeyAfterUpdateEventHandler = createAbstraction("ApiKeyAfterUpdateEventHandler");
|
|
17
17
|
|
|
18
18
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createAbstraction","DomainEvent","ApiKeyBeforeUpdateEvent","eventType","getHandlerAbstraction","
|
|
1
|
+
{"version":3,"names":["createAbstraction","DomainEvent","ApiKeyBeforeUpdateEvent","eventType","getHandlerAbstraction","ApiKeyBeforeUpdateEventHandler","ApiKeyAfterUpdateEvent","ApiKeyAfterUpdateEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { DomainEvent } from \"~/features/eventPublisher/index.js\";\nimport type { IEventHandler } from \"~/features/eventPublisher/index.js\";\nimport type { ApiKeyBeforeUpdatePayload, ApiKeyAfterUpdatePayload } from \"./abstractions.js\";\n\nexport class ApiKeyBeforeUpdateEvent extends DomainEvent<ApiKeyBeforeUpdatePayload> {\n eventType = \"apiKey.beforeUpdate\" as const;\n\n getHandlerAbstraction() {\n return ApiKeyBeforeUpdateEventHandler;\n }\n}\n\nexport const ApiKeyBeforeUpdateEventHandler = createAbstraction<\n IEventHandler<ApiKeyBeforeUpdateEvent>\n>(\"ApiKeyBeforeUpdateEventHandler\");\n\nexport namespace ApiKeyBeforeUpdateEventHandler {\n export type Interface = IEventHandler<ApiKeyBeforeUpdateEvent>;\n export type Event = ApiKeyBeforeUpdateEvent;\n}\n\nexport class ApiKeyAfterUpdateEvent extends DomainEvent<ApiKeyAfterUpdatePayload> {\n eventType = \"apiKey.afterUpdate\" as const;\n\n getHandlerAbstraction() {\n return ApiKeyAfterUpdateEventHandler;\n }\n}\n\nexport const ApiKeyAfterUpdateEventHandler = createAbstraction<\n IEventHandler<ApiKeyAfterUpdateEvent>\n>(\"ApiKeyAfterUpdateEventHandler\");\n\nexport namespace ApiKeyAfterUpdateEventHandler {\n export type Interface = IEventHandler<ApiKeyAfterUpdateEvent>;\n export type Event = ApiKeyAfterUpdateEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AACvD,SAASC,WAAW;AAIpB,OAAO,MAAMC,uBAAuB,SAASD,WAAW,CAA4B;EAChFE,SAAS,GAAG,qBAAqB;EAEjCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,8BAA8B;EACzC;AACJ;AAEA,OAAO,MAAMA,8BAA8B,GAAGL,iBAAiB,CAE7D,gCAAgC,CAAC;AAOnC,OAAO,MAAMM,sBAAsB,SAASL,WAAW,CAA2B;EAC9EE,SAAS,GAAG,oBAAoB;EAEhCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,6BAA6B;EACxC;AACJ;AAEA,OAAO,MAAMA,6BAA6B,GAAGP,iBAAiB,CAE5D,+BAA+B,CAAC","ignoreList":[]}
|
|
@@ -5,87 +5,26 @@ export declare const createApiKeyInputSchema: z.ZodObject<{
|
|
|
5
5
|
description: z.ZodString;
|
|
6
6
|
permissions: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
7
7
|
name: z.ZodString;
|
|
8
|
-
},
|
|
9
|
-
|
|
10
|
-
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
11
|
-
name: z.ZodString;
|
|
12
|
-
}, z.ZodTypeAny, "passthrough">>, "many">>>;
|
|
13
|
-
}, "strip", z.ZodTypeAny, {
|
|
14
|
-
permissions: z.objectOutputType<{
|
|
15
|
-
name: z.ZodString;
|
|
16
|
-
}, z.ZodTypeAny, "passthrough">[];
|
|
17
|
-
name: string;
|
|
18
|
-
description: string;
|
|
19
|
-
slug: string;
|
|
20
|
-
}, {
|
|
21
|
-
name: string;
|
|
22
|
-
description: string;
|
|
23
|
-
slug: string;
|
|
24
|
-
permissions?: z.objectInputType<{
|
|
25
|
-
name: z.ZodString;
|
|
26
|
-
}, z.ZodTypeAny, "passthrough">[] | undefined;
|
|
27
|
-
}>;
|
|
8
|
+
}, z.core.$loose>>>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
28
10
|
export declare const updateApiKeyInputSchema: z.ZodObject<{
|
|
29
11
|
name: z.ZodOptional<z.ZodString>;
|
|
30
12
|
description: z.ZodOptional<z.ZodString>;
|
|
31
13
|
permissions: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
32
14
|
name: z.ZodString;
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
36
|
-
name: z.ZodString;
|
|
37
|
-
}, z.ZodTypeAny, "passthrough">>, "many">>>;
|
|
38
|
-
}, "strip", z.ZodTypeAny, {
|
|
39
|
-
permissions: z.objectOutputType<{
|
|
40
|
-
name: z.ZodString;
|
|
41
|
-
}, z.ZodTypeAny, "passthrough">[];
|
|
42
|
-
name?: string | undefined;
|
|
43
|
-
description?: string | undefined;
|
|
44
|
-
}, {
|
|
45
|
-
permissions?: z.objectInputType<{
|
|
46
|
-
name: z.ZodString;
|
|
47
|
-
}, z.ZodTypeAny, "passthrough">[] | undefined;
|
|
48
|
-
name?: string | undefined;
|
|
49
|
-
description?: string | undefined;
|
|
50
|
-
}>;
|
|
15
|
+
}, z.core.$loose>>>>;
|
|
16
|
+
}, z.core.$strip>;
|
|
51
17
|
export declare const listApiKeysInputSchema: z.ZodObject<{
|
|
52
18
|
where: z.ZodOptional<z.ZodObject<{
|
|
53
19
|
name: z.ZodOptional<z.ZodString>;
|
|
54
20
|
name_contains: z.ZodOptional<z.ZodString>;
|
|
55
21
|
description: z.ZodOptional<z.ZodString>;
|
|
56
22
|
description_contains: z.ZodOptional<z.ZodString>;
|
|
57
|
-
},
|
|
58
|
-
name?: string | undefined;
|
|
59
|
-
description?: string | undefined;
|
|
60
|
-
name_contains?: string | undefined;
|
|
61
|
-
description_contains?: string | undefined;
|
|
62
|
-
}, {
|
|
63
|
-
name?: string | undefined;
|
|
64
|
-
description?: string | undefined;
|
|
65
|
-
name_contains?: string | undefined;
|
|
66
|
-
description_contains?: string | undefined;
|
|
67
|
-
}>>;
|
|
23
|
+
}, z.core.$strip>>;
|
|
68
24
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
69
25
|
after: z.ZodOptional<z.ZodString>;
|
|
70
|
-
sort: z.ZodOptional<z.ZodArray<z.ZodEnum<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
description?: string | undefined;
|
|
76
|
-
name_contains?: string | undefined;
|
|
77
|
-
description_contains?: string | undefined;
|
|
78
|
-
} | undefined;
|
|
79
|
-
limit?: number | undefined;
|
|
80
|
-
after?: string | undefined;
|
|
81
|
-
}, {
|
|
82
|
-
sort?: ("createdOn_ASC" | "createdOn_DESC")[] | undefined;
|
|
83
|
-
where?: {
|
|
84
|
-
name?: string | undefined;
|
|
85
|
-
description?: string | undefined;
|
|
86
|
-
name_contains?: string | undefined;
|
|
87
|
-
description_contains?: string | undefined;
|
|
88
|
-
} | undefined;
|
|
89
|
-
limit?: number | undefined;
|
|
90
|
-
after?: string | undefined;
|
|
91
|
-
}>;
|
|
26
|
+
sort: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
27
|
+
createdOn_ASC: "createdOn_ASC";
|
|
28
|
+
createdOn_DESC: "createdOn_DESC";
|
|
29
|
+
}>>>;
|
|
30
|
+
}, z.core.$strip>;
|
|
@@ -3,16 +3,16 @@ export const createApiKeyInputSchema = z.object({
|
|
|
3
3
|
name: z.string().min(1),
|
|
4
4
|
slug: z.string().min(1),
|
|
5
5
|
description: z.string(),
|
|
6
|
-
permissions: z.array(z.
|
|
6
|
+
permissions: z.array(z.looseObject({
|
|
7
7
|
name: z.string()
|
|
8
|
-
})
|
|
8
|
+
})).optional().default([])
|
|
9
9
|
});
|
|
10
10
|
export const updateApiKeyInputSchema = z.object({
|
|
11
11
|
name: z.string().min(1).optional(),
|
|
12
12
|
description: z.string().optional(),
|
|
13
|
-
permissions: z.array(z.
|
|
13
|
+
permissions: z.array(z.looseObject({
|
|
14
14
|
name: z.string()
|
|
15
|
-
})
|
|
15
|
+
})).optional().default([])
|
|
16
16
|
});
|
|
17
17
|
export const listApiKeysInputSchema = z.object({
|
|
18
18
|
where: z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["z","createApiKeyInputSchema","object","name","string","min","slug","description","permissions","array","
|
|
1
|
+
{"version":3,"names":["z","createApiKeyInputSchema","object","name","string","min","slug","description","permissions","array","looseObject","optional","default","updateApiKeyInputSchema","listApiKeysInputSchema","where","name_contains","description_contains","limit","number","int","positive","max","after","sort","enum"],"sources":["schemas.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const createApiKeyInputSchema = z.object({\n name: z.string().min(1),\n slug: z.string().min(1),\n description: z.string(),\n permissions: z\n .array(z.looseObject({ name: z.string() }))\n .optional()\n .default([])\n});\n\nexport const updateApiKeyInputSchema = z.object({\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n permissions: z\n .array(z.looseObject({ name: z.string() }))\n .optional()\n .default([])\n});\n\nexport const listApiKeysInputSchema = z.object({\n where: z\n .object({\n name: z.string().optional(),\n name_contains: z.string().optional(),\n description: z.string().optional(),\n description_contains: z.string().optional()\n })\n .optional(),\n limit: z.number().int().positive().max(100).optional(),\n after: z.string().optional(),\n sort: z.array(z.enum([\"createdOn_ASC\", \"createdOn_DESC\"])).optional()\n});\n"],"mappings":"AAAA,SAASA,CAAC,QAAQ,KAAK;AAEvB,OAAO,MAAMC,uBAAuB,GAAGD,CAAC,CAACE,MAAM,CAAC;EAC5CC,IAAI,EAAEH,CAAC,CAACI,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC;EACvBC,IAAI,EAAEN,CAAC,CAACI,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC;EACvBE,WAAW,EAAEP,CAAC,CAACI,MAAM,CAAC,CAAC;EACvBI,WAAW,EAAER,CAAC,CACTS,KAAK,CAACT,CAAC,CAACU,WAAW,CAAC;IAAEP,IAAI,EAAEH,CAAC,CAACI,MAAM,CAAC;EAAE,CAAC,CAAC,CAAC,CAC1CO,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE;AACnB,CAAC,CAAC;AAEF,OAAO,MAAMC,uBAAuB,GAAGb,CAAC,CAACE,MAAM,CAAC;EAC5CC,IAAI,EAAEH,CAAC,CAACI,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC,CAACM,QAAQ,CAAC,CAAC;EAClCJ,WAAW,EAAEP,CAAC,CAACI,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC,CAAC;EAClCH,WAAW,EAAER,CAAC,CACTS,KAAK,CAACT,CAAC,CAACU,WAAW,CAAC;IAAEP,IAAI,EAAEH,CAAC,CAACI,MAAM,CAAC;EAAE,CAAC,CAAC,CAAC,CAC1CO,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE;AACnB,CAAC,CAAC;AAEF,OAAO,MAAME,sBAAsB,GAAGd,CAAC,CAACE,MAAM,CAAC;EAC3Ca,KAAK,EAAEf,CAAC,CACHE,MAAM,CAAC;IACJC,IAAI,EAAEH,CAAC,CAACI,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC,CAAC;IAC3BK,aAAa,EAAEhB,CAAC,CAACI,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC,CAAC;IACpCJ,WAAW,EAAEP,CAAC,CAACI,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC,CAAC;IAClCM,oBAAoB,EAAEjB,CAAC,CAACI,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC;EAC9C,CAAC,CAAC,CACDA,QAAQ,CAAC,CAAC;EACfO,KAAK,EAAElB,CAAC,CAACmB,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,CAACC,GAAG,CAAC,GAAG,CAAC,CAACX,QAAQ,CAAC,CAAC;EACtDY,KAAK,EAAEvB,CAAC,CAACI,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC,CAAC;EAC5Ba,IAAI,EAAExB,CAAC,CAACS,KAAK,CAACT,CAAC,CAACyB,IAAI,CAAC,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAACd,QAAQ,CAAC;AACxE,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Reply } from "@webiny/handler";
|
|
2
|
-
import {
|
|
2
|
+
import { AfterAuthenticationEventHandler } from "../../../../features/security/authentication/AuthenticationContext/index.js";
|
|
3
3
|
import { AuthenticationContext } from "../../../../features/security/authentication/AuthenticationContext/index.js";
|
|
4
|
-
declare class SetIdTokenCookieImpl implements
|
|
4
|
+
declare class SetIdTokenCookieImpl implements AfterAuthenticationEventHandler.Interface {
|
|
5
5
|
private authenticationContext;
|
|
6
6
|
private reply;
|
|
7
7
|
constructor(authenticationContext: AuthenticationContext.Interface, reply: Reply.Interface);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import jwt from "jsonwebtoken";
|
|
2
2
|
import { createImplementation } from "@webiny/feature/api";
|
|
3
3
|
import { Reply } from "@webiny/handler";
|
|
4
|
-
import {
|
|
4
|
+
import { AfterAuthenticationEventHandler } from "./index.js";
|
|
5
5
|
import { AuthenticationContext } from "./index.js";
|
|
6
6
|
const get24HoursFromNow = () => {
|
|
7
7
|
const oneHour = 1000 * 60 * 60;
|
|
@@ -44,7 +44,7 @@ class SetIdTokenCookieImpl {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
export const SetIdTokenCookie = createImplementation({
|
|
47
|
-
abstraction:
|
|
47
|
+
abstraction: AfterAuthenticationEventHandler,
|
|
48
48
|
implementation: SetIdTokenCookieImpl,
|
|
49
49
|
dependencies: [AuthenticationContext, Reply]
|
|
50
50
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["jwt","createImplementation","Reply","
|
|
1
|
+
{"version":3,"names":["jwt","createImplementation","Reply","AfterAuthenticationEventHandler","AuthenticationContext","get24HoursFromNow","oneHour","Date","getTime","toDate","timestamp","SetIdTokenCookieImpl","constructor","authenticationContext","reply","handle","token","getAuthToken","tokenData","decode","json","expiresOn","exp","setCookie","path","expires","sameSite","secure","httpOnly","header","SetIdTokenCookie","abstraction","implementation","dependencies"],"sources":["SetIdTokenCookie.ts"],"sourcesContent":["import jwt from \"jsonwebtoken\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { Reply } from \"@webiny/handler\";\nimport { AfterAuthenticationEventHandler } from \"~/features/security/authentication/AuthenticationContext/index.js\";\nimport { AuthenticationContext } from \"~/features/security/authentication/AuthenticationContext/index.js\";\n\nconst get24HoursFromNow = () => {\n const oneHour = 1000 * 60 * 60;\n return new Date(new Date().getTime() + oneHour * 24);\n};\n\nconst toDate = (timestamp: number | undefined) => {\n return timestamp ? new Date(timestamp * 1000) : get24HoursFromNow();\n};\n\nclass SetIdTokenCookieImpl implements AfterAuthenticationEventHandler.Interface {\n constructor(\n private authenticationContext: AuthenticationContext.Interface,\n private reply: Reply.Interface\n ) {}\n\n async handle(): Promise<void> {\n const token = this.authenticationContext.getAuthToken();\n\n if (!token) {\n return;\n }\n\n // Attempt to acquire expiration from the token; fall back to \"expire in 24 hours\".\n // In most cases the token will be a JWT token, but it can also be a custom token, or an API key.\n const tokenData = jwt.decode(token, { json: true });\n const expiresOn = tokenData ? toDate(tokenData.exp) : get24HoursFromNow();\n\n // @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie\n this.reply.setCookie(\"wby-id-token\", token, {\n path: \"/\",\n expires: expiresOn,\n // Allow this cookie to be sent with cross-origin requests.\n sameSite: \"none\",\n // Only send this cookie to the server when HTTPS is used.\n // NOTE: `https` requirement is ignored for `localhost.\n secure: true,\n // Forbids JavaScript from accessing the cookie.\n httpOnly: true\n });\n\n this.reply.header(\"cache-control\", `no-cache=\"Set-Cookie\"`);\n }\n}\n\nexport const SetIdTokenCookie = createImplementation({\n abstraction: AfterAuthenticationEventHandler,\n implementation: SetIdTokenCookieImpl,\n dependencies: [AuthenticationContext, Reply]\n});\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,cAAc;AAC9B,SAASC,oBAAoB,QAAQ,qBAAqB;AAC1D,SAASC,KAAK,QAAQ,iBAAiB;AACvC,SAASC,+BAA+B;AACxC,SAASC,qBAAqB;AAE9B,MAAMC,iBAAiB,GAAGA,CAAA,KAAM;EAC5B,MAAMC,OAAO,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE;EAC9B,OAAO,IAAIC,IAAI,CAAC,IAAIA,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,GAAGF,OAAO,GAAG,EAAE,CAAC;AACxD,CAAC;AAED,MAAMG,MAAM,GAAIC,SAA6B,IAAK;EAC9C,OAAOA,SAAS,GAAG,IAAIH,IAAI,CAACG,SAAS,GAAG,IAAI,CAAC,GAAGL,iBAAiB,CAAC,CAAC;AACvE,CAAC;AAED,MAAMM,oBAAoB,CAAsD;EAC5EC,WAAWA,CACCC,qBAAsD,EACtDC,KAAsB,EAChC;IAAA,KAFUD,qBAAsD,GAAtDA,qBAAsD;IAAA,KACtDC,KAAsB,GAAtBA,KAAsB;EAC/B;EAEH,MAAMC,MAAMA,CAAA,EAAkB;IAC1B,MAAMC,KAAK,GAAG,IAAI,CAACH,qBAAqB,CAACI,YAAY,CAAC,CAAC;IAEvD,IAAI,CAACD,KAAK,EAAE;MACR;IACJ;;IAEA;IACA;IACA,MAAME,SAAS,GAAGlB,GAAG,CAACmB,MAAM,CAACH,KAAK,EAAE;MAAEI,IAAI,EAAE;IAAK,CAAC,CAAC;IACnD,MAAMC,SAAS,GAAGH,SAAS,GAAGT,MAAM,CAACS,SAAS,CAACI,GAAG,CAAC,GAAGjB,iBAAiB,CAAC,CAAC;;IAEzE;IACA,IAAI,CAACS,KAAK,CAACS,SAAS,CAAC,cAAc,EAAEP,KAAK,EAAE;MACxCQ,IAAI,EAAE,GAAG;MACTC,OAAO,EAAEJ,SAAS;MAClB;MACAK,QAAQ,EAAE,MAAM;MAChB;MACA;MACAC,MAAM,EAAE,IAAI;MACZ;MACAC,QAAQ,EAAE;IACd,CAAC,CAAC;IAEF,IAAI,CAACd,KAAK,CAACe,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;EAC/D;AACJ;AAEA,OAAO,MAAMC,gBAAgB,GAAG7B,oBAAoB,CAAC;EACjD8B,WAAW,EAAE5B,+BAA+B;EAC5C6B,cAAc,EAAErB,oBAAoB;EACpCsB,YAAY,EAAE,CAAC7B,qBAAqB,EAAEF,KAAK;AAC/C,CAAC,CAAC","ignoreList":[]}
|
|
@@ -8,8 +8,8 @@ export declare class BeforeAuthenticationEvent extends DomainEvent<BeforeAuthent
|
|
|
8
8
|
eventType: "authentication.beforeAuthentication";
|
|
9
9
|
getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<BeforeAuthenticationEvent>>;
|
|
10
10
|
}
|
|
11
|
-
export declare const
|
|
12
|
-
export declare namespace
|
|
11
|
+
export declare const BeforeAuthenticationEventHandler: import("@webiny/di").Abstraction<IEventHandler<BeforeAuthenticationEvent>>;
|
|
12
|
+
export declare namespace BeforeAuthenticationEventHandler {
|
|
13
13
|
type Interface = IEventHandler<BeforeAuthenticationEvent>;
|
|
14
14
|
type Event = BeforeAuthenticationEvent;
|
|
15
15
|
}
|
|
@@ -21,8 +21,8 @@ export declare class AfterAuthenticationEvent extends DomainEvent<AfterAuthentic
|
|
|
21
21
|
eventType: "authentication.afterAuthentication";
|
|
22
22
|
getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<AfterAuthenticationEvent>>;
|
|
23
23
|
}
|
|
24
|
-
export declare const
|
|
25
|
-
export declare namespace
|
|
24
|
+
export declare const AfterAuthenticationEventHandler: import("@webiny/di").Abstraction<IEventHandler<AfterAuthenticationEvent>>;
|
|
25
|
+
export declare namespace AfterAuthenticationEventHandler {
|
|
26
26
|
type Interface = IEventHandler<AfterAuthenticationEvent>;
|
|
27
27
|
type Event = AfterAuthenticationEvent;
|
|
28
28
|
}
|
|
@@ -3,16 +3,16 @@ import { createAbstraction } from "@webiny/feature/api";
|
|
|
3
3
|
export class BeforeAuthenticationEvent extends DomainEvent {
|
|
4
4
|
eventType = "authentication.beforeAuthentication";
|
|
5
5
|
getHandlerAbstraction() {
|
|
6
|
-
return
|
|
6
|
+
return BeforeAuthenticationEventHandler;
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
export const
|
|
9
|
+
export const BeforeAuthenticationEventHandler = createAbstraction("BeforeAuthenticationEventHandler");
|
|
10
10
|
export class AfterAuthenticationEvent extends DomainEvent {
|
|
11
11
|
eventType = "authentication.afterAuthentication";
|
|
12
12
|
getHandlerAbstraction() {
|
|
13
|
-
return
|
|
13
|
+
return AfterAuthenticationEventHandler;
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
export const
|
|
16
|
+
export const AfterAuthenticationEventHandler = createAbstraction("AfterAuthenticationEventHandler");
|
|
17
17
|
|
|
18
18
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DomainEvent","createAbstraction","BeforeAuthenticationEvent","eventType","getHandlerAbstraction","
|
|
1
|
+
{"version":3,"names":["DomainEvent","createAbstraction","BeforeAuthenticationEvent","eventType","getHandlerAbstraction","BeforeAuthenticationEventHandler","AfterAuthenticationEvent","AfterAuthenticationEventHandler"],"sources":["events.ts"],"sourcesContent":["import { DomainEvent } from \"~/features/eventPublisher/index.js\";\nimport { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"~/features/eventPublisher/index.js\";\nimport type { Identity } from \"~/features/security/IdentityContext/Identity.js\";\n\nexport interface BeforeAuthenticationPayload {\n token: string;\n}\n\nexport class BeforeAuthenticationEvent extends DomainEvent<BeforeAuthenticationPayload> {\n eventType = \"authentication.beforeAuthentication\" as const;\n\n getHandlerAbstraction() {\n return BeforeAuthenticationEventHandler;\n }\n}\n\nexport const BeforeAuthenticationEventHandler = createAbstraction<\n IEventHandler<BeforeAuthenticationEvent>\n>(\"BeforeAuthenticationEventHandler\");\n\nexport namespace BeforeAuthenticationEventHandler {\n export type Interface = IEventHandler<BeforeAuthenticationEvent>;\n export type Event = BeforeAuthenticationEvent;\n}\n\nexport interface AfterAuthenticationPayload {\n identity: Identity;\n token: string;\n}\n\nexport class AfterAuthenticationEvent extends DomainEvent<AfterAuthenticationPayload> {\n eventType = \"authentication.afterAuthentication\" as const;\n\n getHandlerAbstraction() {\n return AfterAuthenticationEventHandler;\n }\n}\n\nexport const AfterAuthenticationEventHandler = createAbstraction<\n IEventHandler<AfterAuthenticationEvent>\n>(\"AfterAuthenticationEventHandler\");\n\nexport namespace AfterAuthenticationEventHandler {\n export type Interface = IEventHandler<AfterAuthenticationEvent>;\n export type Event = AfterAuthenticationEvent;\n}\n"],"mappings":"AAAA,SAASA,WAAW;AACpB,SAASC,iBAAiB,QAAQ,qBAAqB;AAQvD,OAAO,MAAMC,yBAAyB,SAASF,WAAW,CAA8B;EACpFG,SAAS,GAAG,qCAAqC;EAEjDC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,gCAAgC;EAC3C;AACJ;AAEA,OAAO,MAAMA,gCAAgC,GAAGJ,iBAAiB,CAE/D,kCAAkC,CAAC;AAYrC,OAAO,MAAMK,wBAAwB,SAASN,WAAW,CAA6B;EAClFG,SAAS,GAAG,oCAAoC;EAEhDC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,+BAA+B;EAC1C;AACJ;AAEA,OAAO,MAAMA,+BAA+B,GAAGN,iBAAiB,CAE9D,iCAAiC,CAAC","ignoreList":[]}
|
|
@@ -8,8 +8,8 @@ export declare class AfterLoginEvent extends DomainEvent<AfterLoginPayload> {
|
|
|
8
8
|
eventType: "login.afterLogin";
|
|
9
9
|
getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<AfterLoginEvent>>;
|
|
10
10
|
}
|
|
11
|
-
export declare const
|
|
12
|
-
export declare namespace
|
|
11
|
+
export declare const AfterLoginEventHandler: import("@webiny/di").Abstraction<IEventHandler<AfterLoginEvent>>;
|
|
12
|
+
export declare namespace AfterLoginEventHandler {
|
|
13
13
|
type Interface = IEventHandler<AfterLoginEvent>;
|
|
14
14
|
type Event = AfterLoginEvent;
|
|
15
15
|
}
|
|
@@ -3,9 +3,9 @@ import { createAbstraction } from "@webiny/feature/api";
|
|
|
3
3
|
export class AfterLoginEvent extends DomainEvent {
|
|
4
4
|
eventType = "login.afterLogin";
|
|
5
5
|
getHandlerAbstraction() {
|
|
6
|
-
return
|
|
6
|
+
return AfterLoginEventHandler;
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
export const
|
|
9
|
+
export const AfterLoginEventHandler = createAbstraction("AfterLoginEventHandler");
|
|
10
10
|
|
|
11
11
|
//# sourceMappingURL=abstractions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DomainEvent","createAbstraction","AfterLoginEvent","eventType","getHandlerAbstraction","
|
|
1
|
+
{"version":3,"names":["DomainEvent","createAbstraction","AfterLoginEvent","eventType","getHandlerAbstraction","AfterLoginEventHandler"],"sources":["abstractions.ts"],"sourcesContent":["import { DomainEvent } from \"~/features/eventPublisher/index.js\";\nimport type { IEventHandler } from \"~/features/eventPublisher/index.js\";\nimport { createAbstraction } from \"@webiny/feature/api\";\nimport { Identity } from \"~/features/security/IdentityContext/index.js\";\n\nexport interface AfterLoginPayload {\n identity: Identity;\n}\n\nexport class AfterLoginEvent extends DomainEvent<AfterLoginPayload> {\n eventType = \"login.afterLogin\" as const;\n\n getHandlerAbstraction() {\n return AfterLoginEventHandler;\n }\n}\n\nexport const AfterLoginEventHandler =\n createAbstraction<IEventHandler<AfterLoginEvent>>(\"AfterLoginEventHandler\");\n\nexport namespace AfterLoginEventHandler {\n export type Interface = IEventHandler<AfterLoginEvent>;\n export type Event = AfterLoginEvent;\n}\n"],"mappings":"AAAA,SAASA,WAAW;AAEpB,SAASC,iBAAiB,QAAQ,qBAAqB;AAOvD,OAAO,MAAMC,eAAe,SAASF,WAAW,CAAoB;EAChEG,SAAS,GAAG,kBAAkB;EAE9BC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,sBAAsB;EACjC;AACJ;AAEA,OAAO,MAAMA,sBAAsB,GAC/BJ,iBAAiB,CAAiC,wBAAwB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PermissionSchemaConfig } from "./types.js";
|
|
2
|
+
import type { Permissions } from "./types.js";
|
|
3
|
+
export declare function createPermissions<const S extends PermissionSchemaConfig>(schema: S): {
|
|
4
|
+
Abstraction: import("@webiny/di").Abstraction<Permissions<S>>;
|
|
5
|
+
Implementation: import("@webiny/di").Constructor<Permissions<S>> & {
|
|
6
|
+
__abstraction: import("@webiny/di").Abstraction<Permissions<S>>;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
+
import { IdentityContext } from "../IdentityContext/index.js";
|
|
3
|
+
function buildEntityMap(schema) {
|
|
4
|
+
const map = new Map();
|
|
5
|
+
for (const entity of schema.entities ?? []) {
|
|
6
|
+
const actions = new Set();
|
|
7
|
+
for (const action of entity.actions ?? []) {
|
|
8
|
+
actions.add(action.name);
|
|
9
|
+
}
|
|
10
|
+
map.set(entity.id, {
|
|
11
|
+
permission: entity.permission,
|
|
12
|
+
actions,
|
|
13
|
+
hasOwn: entity.scopes.includes("own")
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return map;
|
|
17
|
+
}
|
|
18
|
+
function getEntity(entityMap, entityId) {
|
|
19
|
+
const entity = entityMap.get(entityId);
|
|
20
|
+
if (!entity) {
|
|
21
|
+
throw new Error(`Unknown entity "${entityId}" in permission schema.`);
|
|
22
|
+
}
|
|
23
|
+
return entity;
|
|
24
|
+
}
|
|
25
|
+
export function createPermissions(schema) {
|
|
26
|
+
const entityMap = buildEntityMap(schema);
|
|
27
|
+
const fullAccessName = `${schema.prefix}.*`;
|
|
28
|
+
class SchemaPermissions {
|
|
29
|
+
constructor(identityContext) {
|
|
30
|
+
this.identityContext = identityContext;
|
|
31
|
+
}
|
|
32
|
+
async canAccess(entityId, item) {
|
|
33
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
if (await this.hasFullSchemaAccess()) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
const entity = getEntity(entityMap, entityId);
|
|
40
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
41
|
+
if (!permissions.length) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
// No item — just check entity-level access.
|
|
45
|
+
if (item === undefined) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
// Item provided — if all permissions require own, verify ownership.
|
|
49
|
+
const ownOnly = !permissions.some(p => !p.own);
|
|
50
|
+
if (!ownOnly) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
const identity = this.identityContext.getIdentity();
|
|
54
|
+
return item.createdBy?.id === identity.id;
|
|
55
|
+
}
|
|
56
|
+
async onlyOwnRecords(entityId) {
|
|
57
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (await this.hasFullSchemaAccess()) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const entity = getEntity(entityMap, entityId);
|
|
64
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
65
|
+
if (!permissions.length) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return !permissions.some(p => !p.own);
|
|
69
|
+
}
|
|
70
|
+
async canRead(entityId) {
|
|
71
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
if (await this.hasFullSchemaAccess()) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
const entity = getEntity(entityMap, entityId);
|
|
78
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
79
|
+
if (!permissions.length) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return permissions.some(permission => {
|
|
83
|
+
if (typeof permission.rwd !== "string") {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return permission.rwd.includes("r");
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async canCreate(entityId) {
|
|
90
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
if (await this.hasFullSchemaAccess()) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
const entity = getEntity(entityMap, entityId);
|
|
97
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
98
|
+
if (!permissions.length) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return permissions.some(permission => {
|
|
102
|
+
if (typeof permission.rwd !== "string") {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return permission.rwd.includes("w");
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async canEdit(entityId, item) {
|
|
109
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
if (await this.hasFullSchemaAccess()) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
const entity = getEntity(entityMap, entityId);
|
|
116
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
117
|
+
if (!permissions.length) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
const identity = this.identityContext.getIdentity();
|
|
121
|
+
return permissions.some(permission => {
|
|
122
|
+
if (permission.own) {
|
|
123
|
+
// No item provided (new/unsaved) — allow access.
|
|
124
|
+
if (!item?.createdBy) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return item.createdBy.id === identity.id;
|
|
128
|
+
}
|
|
129
|
+
if (typeof permission.rwd !== "string") {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
return permission.rwd.includes("w");
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async canDelete(entityId, item) {
|
|
136
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
if (await this.hasFullSchemaAccess()) {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
const entity = getEntity(entityMap, entityId);
|
|
143
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
144
|
+
if (!permissions.length) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
const identity = this.identityContext.getIdentity();
|
|
148
|
+
return permissions.some(permission => {
|
|
149
|
+
if (permission.own) {
|
|
150
|
+
return item?.createdBy?.id === identity.id;
|
|
151
|
+
}
|
|
152
|
+
if (typeof permission.rwd !== "string") {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
return permission.rwd.includes("d");
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
async canPublish(entityId) {
|
|
159
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
if (await this.hasFullSchemaAccess()) {
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
const entity = getEntity(entityMap, entityId);
|
|
166
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
167
|
+
if (!permissions.length) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
return permissions.some(permission => {
|
|
171
|
+
return permission.pw?.includes("p");
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
async canUnpublish(entityId) {
|
|
175
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
if (await this.hasFullSchemaAccess()) {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
const entity = getEntity(entityMap, entityId);
|
|
182
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
183
|
+
if (!permissions.length) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
return permissions.some(permission => {
|
|
187
|
+
return permission.pw?.includes("u");
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
async canAction(action, entityId) {
|
|
191
|
+
if (await this.identityContext.hasFullAccess()) {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
if (await this.hasFullSchemaAccess()) {
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
const entity = getEntity(entityMap, entityId);
|
|
198
|
+
const permissions = await this.getEntityPermissions(entity.permission);
|
|
199
|
+
if (!permissions.length) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
return permissions.some(permission => {
|
|
203
|
+
return permission[action] === true;
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
async getEntityPermissions(entityPermission) {
|
|
207
|
+
const permissions = await this.identityContext.getPermissions(entityPermission);
|
|
208
|
+
if (permissions.length) {
|
|
209
|
+
return permissions;
|
|
210
|
+
}
|
|
211
|
+
// Fall back to the schema wildcard (e.g. "test.*") — its flags apply to all entities.
|
|
212
|
+
const wildcard = await this.identityContext.getPermission(fullAccessName);
|
|
213
|
+
return wildcard ? [wildcard] : [];
|
|
214
|
+
}
|
|
215
|
+
async hasFullSchemaAccess() {
|
|
216
|
+
const permission = await this.identityContext.getPermission(fullAccessName);
|
|
217
|
+
if (!permission) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
// Only treat as full access if the permission has no `rwd` flag.
|
|
221
|
+
// A permission like { name: "wb.*", rwd: "r" } should NOT grant full access.
|
|
222
|
+
const keys = Object.keys(permission).filter(k => k !== "name");
|
|
223
|
+
const hasRwd = keys.includes("rwd");
|
|
224
|
+
|
|
225
|
+
// It's full-access only if there's no `rwd` flag.
|
|
226
|
+
return !hasRwd;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const Abstraction = createAbstraction(`${schema.prefix}:Permissions`);
|
|
230
|
+
const Implementation = Abstraction.createImplementation({
|
|
231
|
+
implementation: SchemaPermissions,
|
|
232
|
+
dependencies: [IdentityContext]
|
|
233
|
+
});
|
|
234
|
+
return {
|
|
235
|
+
Abstraction,
|
|
236
|
+
Implementation
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
//# sourceMappingURL=createPermissions.js.map
|