@webiny/tenant-manager 0.0.0-unstable.0d717d18dd
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/LICENSE +36 -0
- package/README.md +11 -0
- package/TenantManager.d.ts +2 -0
- package/TenantManager.js +11 -0
- package/TenantManager.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenant.d.ts +10 -0
- package/admin/CurrentTenant/CurrentTenant.js +25 -0
- package/admin/CurrentTenant/CurrentTenant.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantGateway.d.ts +12 -0
- package/admin/CurrentTenant/CurrentTenantGateway.js +43 -0
- package/admin/CurrentTenant/CurrentTenantGateway.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.d.ts +12 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.js +33 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantRepository.d.ts +15 -0
- package/admin/CurrentTenant/CurrentTenantRepository.js +38 -0
- package/admin/CurrentTenant/CurrentTenantRepository.js.map +1 -0
- package/admin/CurrentTenant/abstractions.d.ts +31 -0
- package/admin/CurrentTenant/abstractions.js +7 -0
- package/admin/CurrentTenant/abstractions.js.map +1 -0
- package/admin/CurrentTenant/feature.d.ts +3 -0
- package/admin/CurrentTenant/feature.js +21 -0
- package/admin/CurrentTenant/feature.js.map +1 -0
- package/admin/CurrentTenant/useCurrentTenant.d.ts +4 -0
- package/admin/CurrentTenant/useCurrentTenant.js +18 -0
- package/admin/CurrentTenant/useCurrentTenant.js.map +1 -0
- package/admin/CurrentTenantProvider.d.ts +2 -0
- package/admin/CurrentTenantProvider.js +9 -0
- package/admin/CurrentTenantProvider.js.map +1 -0
- package/admin/DisableTenant/DisableTenantGateway.d.ts +11 -0
- package/admin/DisableTenant/DisableTenantGateway.js +42 -0
- package/admin/DisableTenant/DisableTenantGateway.js.map +1 -0
- package/admin/DisableTenant/DisableTenantRepository.d.ts +12 -0
- package/admin/DisableTenant/DisableTenantRepository.js +33 -0
- package/admin/DisableTenant/DisableTenantRepository.js.map +1 -0
- package/admin/DisableTenant/DisableTenantUseCase.d.ts +10 -0
- package/admin/DisableTenant/DisableTenantUseCase.js +18 -0
- package/admin/DisableTenant/DisableTenantUseCase.js.map +1 -0
- package/admin/DisableTenant/abstractions.d.ts +21 -0
- package/admin/DisableTenant/abstractions.js +7 -0
- package/admin/DisableTenant/abstractions.js.map +1 -0
- package/admin/DisableTenant/feature.d.ts +3 -0
- package/admin/DisableTenant/feature.js +21 -0
- package/admin/DisableTenant/feature.js.map +1 -0
- package/admin/DisableTenant/index.d.ts +2 -0
- package/admin/DisableTenant/index.js +2 -0
- package/admin/DisableTenant/useDisableTenant.d.ts +4 -0
- package/admin/DisableTenant/useDisableTenant.js +18 -0
- package/admin/DisableTenant/useDisableTenant.js.map +1 -0
- package/admin/EnableTenant/EnableTenantGateway.d.ts +11 -0
- package/admin/EnableTenant/EnableTenantGateway.js +42 -0
- package/admin/EnableTenant/EnableTenantGateway.js.map +1 -0
- package/admin/EnableTenant/EnableTenantRepository.d.ts +12 -0
- package/admin/EnableTenant/EnableTenantRepository.js +33 -0
- package/admin/EnableTenant/EnableTenantRepository.js.map +1 -0
- package/admin/EnableTenant/EnableTenantUseCase.d.ts +10 -0
- package/admin/EnableTenant/EnableTenantUseCase.js +18 -0
- package/admin/EnableTenant/EnableTenantUseCase.js.map +1 -0
- package/admin/EnableTenant/abstractions.d.ts +21 -0
- package/admin/EnableTenant/abstractions.js +7 -0
- package/admin/EnableTenant/abstractions.js.map +1 -0
- package/admin/EnableTenant/feature.d.ts +3 -0
- package/admin/EnableTenant/feature.js +21 -0
- package/admin/EnableTenant/feature.js.map +1 -0
- package/admin/EnableTenant/index.d.ts +2 -0
- package/admin/EnableTenant/index.js +2 -0
- package/admin/EnableTenant/useEnableTenant.d.ts +4 -0
- package/admin/EnableTenant/useEnableTenant.js +24 -0
- package/admin/EnableTenant/useEnableTenant.js.map +1 -0
- package/admin/Extension.d.ts +2 -0
- package/admin/Extension.js +49 -0
- package/admin/Extension.js.map +1 -0
- package/admin/InstallTenant/InstallTenantGateway.d.ts +11 -0
- package/admin/InstallTenant/InstallTenantGateway.js +42 -0
- package/admin/InstallTenant/InstallTenantGateway.js.map +1 -0
- package/admin/InstallTenant/InstallTenantRepository.d.ts +12 -0
- package/admin/InstallTenant/InstallTenantRepository.js +34 -0
- package/admin/InstallTenant/InstallTenantRepository.js.map +1 -0
- package/admin/InstallTenant/InstallTenantUseCase.d.ts +10 -0
- package/admin/InstallTenant/InstallTenantUseCase.js +18 -0
- package/admin/InstallTenant/InstallTenantUseCase.js.map +1 -0
- package/admin/InstallTenant/abstractions.d.ts +21 -0
- package/admin/InstallTenant/abstractions.js +7 -0
- package/admin/InstallTenant/abstractions.js.map +1 -0
- package/admin/InstallTenant/feature.d.ts +3 -0
- package/admin/InstallTenant/feature.js +21 -0
- package/admin/InstallTenant/feature.js.map +1 -0
- package/admin/InstallTenant/index.d.ts +2 -0
- package/admin/InstallTenant/index.js +2 -0
- package/admin/InstallTenant/useInstallTenant.d.ts +4 -0
- package/admin/InstallTenant/useInstallTenant.js +24 -0
- package/admin/InstallTenant/useInstallTenant.js.map +1 -0
- package/admin/IsRootTenant.d.ts +13 -0
- package/admin/IsRootTenant.js +19 -0
- package/admin/IsRootTenant.js.map +1 -0
- package/admin/SecurityPermission.d.ts +2 -0
- package/admin/SecurityPermission.js +15 -0
- package/admin/SecurityPermission.js.map +1 -0
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.d.ts +8 -0
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js +41 -0
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js.map +1 -0
- package/admin/TenantEntryList/EnableTenant/EnableTenant.d.ts +7 -0
- package/admin/TenantEntryList/EnableTenant/EnableTenant.js +15 -0
- package/admin/TenantEntryList/EnableTenant/EnableTenant.js.map +1 -0
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.d.ts +5 -0
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js +31 -0
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js.map +1 -0
- package/admin/TenantEntryList/FolderNameCell.d.ts +7 -0
- package/admin/TenantEntryList/FolderNameCell.js +24 -0
- package/admin/TenantEntryList/FolderNameCell.js.map +1 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.d.ts +7 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js +15 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js.map +1 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.d.ts +5 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js +31 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js.map +1 -0
- package/admin/TenantEntryList/ManageTenant.d.ts +7 -0
- package/admin/TenantEntryList/ManageTenant.js +19 -0
- package/admin/TenantEntryList/ManageTenant.js.map +1 -0
- package/admin/TenantEntryList/TenantCell.d.ts +2 -0
- package/admin/TenantEntryList/TenantCell.js +24 -0
- package/admin/TenantEntryList/TenantCell.js.map +1 -0
- package/admin/TenantEntryList/TenantNameCell.d.ts +2 -0
- package/admin/TenantEntryList/TenantNameCell.js +51 -0
- package/admin/TenantEntryList/TenantNameCell.js.map +1 -0
- package/admin/TenantEntryList.d.ts +2 -0
- package/admin/TenantEntryList.js +59 -0
- package/admin/TenantEntryList.js.map +1 -0
- package/admin/TenantSelector.d.ts +2 -0
- package/admin/TenantSelector.js +35 -0
- package/admin/TenantSelector.js.map +1 -0
- package/admin/domain/permissionsSchema.d.ts +4 -0
- package/admin/domain/permissionsSchema.js +8 -0
- package/admin/domain/permissionsSchema.js.map +1 -0
- package/admin/features/permissions/abstractions.d.ts +17 -0
- package/admin/features/permissions/abstractions.js +6 -0
- package/admin/features/permissions/abstractions.js.map +1 -0
- package/admin/features/permissions/feature.d.ts +14 -0
- package/admin/features/permissions/feature.js +7 -0
- package/admin/features/permissions/feature.js.map +1 -0
- package/admin/types.d.ts +7 -0
- package/admin/types.js +0 -0
- package/api/Extension.d.ts +4 -0
- package/api/Extension.js +39 -0
- package/api/Extension.js.map +1 -0
- package/api/domain/TenantId.d.ts +3 -0
- package/api/domain/TenantId.js +10 -0
- package/api/domain/TenantId.js.map +1 -0
- package/api/domain/TenantModel.d.ts +11 -0
- package/api/domain/TenantModel.js +68 -0
- package/api/domain/TenantModel.js.map +1 -0
- package/api/domain/TenantModelExtension.d.ts +11 -0
- package/api/domain/TenantModelExtension.js +5 -0
- package/api/domain/TenantModelExtension.js.map +1 -0
- package/api/domain/errors.d.ts +33 -0
- package/api/domain/errors.js +58 -0
- package/api/domain/errors.js.map +1 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.d.ts +8 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.js +48 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.js.map +1 -0
- package/api/features/AddCmsPermissions/feature.d.ts +4 -0
- package/api/features/AddCmsPermissions/feature.js +11 -0
- package/api/features/AddCmsPermissions/feature.js.map +1 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.d.ts +24 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js +81 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js.map +1 -0
- package/api/features/CreateAndInstallTenant/abstractions.d.ts +26 -0
- package/api/features/CreateAndInstallTenant/abstractions.js +5 -0
- package/api/features/CreateAndInstallTenant/abstractions.js.map +1 -0
- package/api/features/CreateAndInstallTenant/feature.d.ts +4 -0
- package/api/features/CreateAndInstallTenant/feature.js +11 -0
- package/api/features/CreateAndInstallTenant/feature.js.map +1 -0
- package/api/features/CreateTenant/CreateTenantRepository.d.ts +15 -0
- package/api/features/CreateTenant/CreateTenantRepository.js +43 -0
- package/api/features/CreateTenant/CreateTenantRepository.js.map +1 -0
- package/api/features/CreateTenant/CreateTenantUseCase.d.ts +14 -0
- package/api/features/CreateTenant/CreateTenantUseCase.js +40 -0
- package/api/features/CreateTenant/CreateTenantUseCase.js.map +1 -0
- package/api/features/CreateTenant/abstractions.d.ts +41 -0
- package/api/features/CreateTenant/abstractions.js +6 -0
- package/api/features/CreateTenant/abstractions.js.map +1 -0
- package/api/features/CreateTenant/feature.d.ts +4 -0
- package/api/features/CreateTenant/feature.js +13 -0
- package/api/features/CreateTenant/feature.js.map +1 -0
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.d.ts +11 -0
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js +27 -0
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js.map +1 -0
- package/api/features/DeleteTenantOnEntryDelete/feature.d.ts +4 -0
- package/api/features/DeleteTenantOnEntryDelete/feature.js +11 -0
- package/api/features/DeleteTenantOnEntryDelete/feature.js.map +1 -0
- package/api/features/DisableTenant/DisableTenantUseCase.d.ts +20 -0
- package/api/features/DisableTenant/DisableTenantUseCase.js +53 -0
- package/api/features/DisableTenant/DisableTenantUseCase.js.map +1 -0
- package/api/features/DisableTenant/abstractions.d.ts +19 -0
- package/api/features/DisableTenant/abstractions.js +5 -0
- package/api/features/DisableTenant/abstractions.js.map +1 -0
- package/api/features/DisableTenant/events.d.ts +27 -0
- package/api/features/DisableTenant/events.js +23 -0
- package/api/features/DisableTenant/events.js.map +1 -0
- package/api/features/DisableTenant/feature.d.ts +4 -0
- package/api/features/DisableTenant/feature.js +11 -0
- package/api/features/DisableTenant/feature.js.map +1 -0
- package/api/features/EnableTenant/EnableTenantUseCase.d.ts +20 -0
- package/api/features/EnableTenant/EnableTenantUseCase.js +55 -0
- package/api/features/EnableTenant/EnableTenantUseCase.js.map +1 -0
- package/api/features/EnableTenant/abstractions.d.ts +19 -0
- package/api/features/EnableTenant/abstractions.js +5 -0
- package/api/features/EnableTenant/abstractions.js.map +1 -0
- package/api/features/EnableTenant/events.d.ts +27 -0
- package/api/features/EnableTenant/events.js +23 -0
- package/api/features/EnableTenant/events.js.map +1 -0
- package/api/features/EnableTenant/feature.d.ts +4 -0
- package/api/features/EnableTenant/feature.js +11 -0
- package/api/features/EnableTenant/feature.js.map +1 -0
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.d.ts +17 -0
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js +32 -0
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js.map +1 -0
- package/api/features/GetCurrentTenant/abstractions.d.ts +24 -0
- package/api/features/GetCurrentTenant/abstractions.js +5 -0
- package/api/features/GetCurrentTenant/abstractions.js.map +1 -0
- package/api/features/GetCurrentTenant/feature.d.ts +4 -0
- package/api/features/GetCurrentTenant/feature.js +11 -0
- package/api/features/GetCurrentTenant/feature.js.map +1 -0
- package/api/features/GetTenantById/GetTenantByIdRepository.d.ts +17 -0
- package/api/features/GetTenantById/GetTenantByIdRepository.js +44 -0
- package/api/features/GetTenantById/GetTenantByIdRepository.js.map +1 -0
- package/api/features/GetTenantById/GetTenantByIdUseCase.d.ts +12 -0
- package/api/features/GetTenantById/GetTenantByIdUseCase.js +23 -0
- package/api/features/GetTenantById/GetTenantByIdUseCase.js.map +1 -0
- package/api/features/GetTenantById/abstractions.d.ts +38 -0
- package/api/features/GetTenantById/abstractions.js +6 -0
- package/api/features/GetTenantById/abstractions.js.map +1 -0
- package/api/features/GetTenantById/feature.d.ts +4 -0
- package/api/features/GetTenantById/feature.js +13 -0
- package/api/features/GetTenantById/feature.js.map +1 -0
- package/api/features/UpdateTenant/UpdateTenantRepository.d.ts +17 -0
- package/api/features/UpdateTenant/UpdateTenantRepository.js +51 -0
- package/api/features/UpdateTenant/UpdateTenantRepository.js.map +1 -0
- package/api/features/UpdateTenant/UpdateTenantUseCase.d.ts +12 -0
- package/api/features/UpdateTenant/UpdateTenantUseCase.js +21 -0
- package/api/features/UpdateTenant/UpdateTenantUseCase.js.map +1 -0
- package/api/features/UpdateTenant/abstractions.d.ts +39 -0
- package/api/features/UpdateTenant/abstractions.js +6 -0
- package/api/features/UpdateTenant/abstractions.js.map +1 -0
- package/api/features/UpdateTenant/feature.d.ts +4 -0
- package/api/features/UpdateTenant/feature.js +13 -0
- package/api/features/UpdateTenant/feature.js.map +1 -0
- package/api/graphql/CreateTenantSchema.d.ts +16 -0
- package/api/graphql/CreateTenantSchema.js +83 -0
- package/api/graphql/CreateTenantSchema.js.map +1 -0
- package/api/graphql/DisableTenantSchema.d.ts +8 -0
- package/api/graphql/DisableTenantSchema.js +31 -0
- package/api/graphql/DisableTenantSchema.js.map +1 -0
- package/api/graphql/EnableTenantSchema.d.ts +8 -0
- package/api/graphql/EnableTenantSchema.js +31 -0
- package/api/graphql/EnableTenantSchema.js.map +1 -0
- package/api/graphql/GetCurrentTenantSchema.d.ts +8 -0
- package/api/graphql/GetCurrentTenantSchema.js +49 -0
- package/api/graphql/GetCurrentTenantSchema.js.map +1 -0
- package/api/graphql/InstallTenantSchema.d.ts +8 -0
- package/api/graphql/InstallTenantSchema.js +43 -0
- package/api/graphql/InstallTenantSchema.js.map +1 -0
- package/exports/admin/tenancy.d.ts +7 -0
- package/exports/admin/tenancy.js +4 -0
- package/exports/api/tenant-manager.d.ts +9 -0
- package/exports/api/tenant-manager.js +8 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +46 -0
- package/shared/Tenant.d.ts +21 -0
- package/shared/Tenant.js +27 -0
- package/shared/Tenant.js.map +1 -0
- package/shared/constants.d.ts +1 -0
- package/shared/constants.js +4 -0
- package/shared/constants.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js","sources":["../../../../src/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { EntryId } from \"@webiny/api-headless-cms/domain/contentEntry/EntryId.js\";\nimport { Tenant } from \"~/shared/Tenant.js\";\nimport {\n TenantCreationError,\n TenantInstallationError,\n TenantUpdateError\n} from \"../../domain/errors.js\";\nimport { GetTenantByIdUseCase } from \"../GetTenantById/abstractions.js\";\nimport { UpdateTenantUseCase } from \"../UpdateTenant/abstractions.js\";\nimport { CreateAndInstallTenantUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport * as Tenancy from \"@webiny/api-core/exports/api/tenancy.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/errors.js\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\n\nclass CreateAndInstallTenantUseCase implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n // Tenant manager deps\n private getTenantByIdUseCase: GetTenantByIdUseCase.Interface,\n private updateTenantUseCase: UpdateTenantUseCase.Interface,\n // Core tenancy deps\n private coreGetTenantById: Tenancy.GetTenantByIdUseCase.Interface,\n private coreCreateTenant: Tenancy.CreateTenantUseCase.Interface,\n private coreUpdateTenant: Tenancy.UpdateTenantUseCase.Interface,\n private coreDeleteTenant: Tenancy.DeleteTenantUseCase.Interface,\n private coreInstallTenant: Tenancy.InstallTenantUseCase.Interface\n ) {}\n\n async execute(tenantId: string): Promise<Result<Tenant, UseCaseAbstraction.Error>> {\n // Authorization checks\n if (!this.identityContext.getPermission(\"tm.tenant\")) {\n return Result.fail(\n new NotAuthorizedError({\n message: \"Not authorized to create tenants!\"\n })\n );\n }\n\n const entryId = EntryId.from(tenantId);\n\n // Get tenant details\n const tenantResult = await this.getTenantByIdUseCase.execute(entryId.id);\n if (tenantResult.isFail()) {\n return Result.fail(tenantResult.error);\n }\n const tenant = tenantResult.value;\n\n const existingTenantResult = await this.coreGetTenantById.execute(tenant.id);\n\n // If core tenant already exists with this same ID, we mark the Tenant Manager tenant installed.\n if (existingTenantResult.isOk()) {\n // Update the core tenant, and set it to `active`\n await this.coreUpdateTenant.execute(tenant.id, {\n name: tenant.values.name,\n description: tenant.values.description,\n status: \"enabled\"\n });\n\n // Mark tenant installed, and exit early.\n return this.markTenantInstalled(tenant);\n }\n\n // Create tenant\n const createTenantResult = await this.coreCreateTenant.execute({\n id: entryId.id,\n name: tenant.values.name,\n parent: \"root\",\n description: tenant.values.name,\n tags: []\n });\n\n if (createTenantResult.isFail()) {\n return Result.fail(new TenantCreationError(createTenantResult.error));\n }\n const createdTenant = createTenantResult.value;\n\n // Install tenant\n const installResult = await this.coreInstallTenant.execute({\n tenant: createdTenant,\n installationInput: []\n });\n\n if (installResult.isFail()) {\n // Delete tenant if installation failed.\n await this.coreDeleteTenant.execute(createdTenant.id);\n\n return Result.fail(new TenantInstallationError(installResult.error));\n }\n\n return this.markTenantInstalled(tenant);\n }\n\n private async markTenantInstalled(tenant: Tenant) {\n // Update tenant entry to mark as installed\n const updateResult = await this.updateTenantUseCase.execute(tenant.id, {\n status: \"enabled\",\n isInstalled: true\n });\n\n if (updateResult.isFail()) {\n return Result.fail(new TenantUpdateError(updateResult.error));\n }\n\n // Return updated tenant\n return Result.ok(updateResult.value);\n }\n}\n\nexport default UseCaseAbstraction.createImplementation({\n implementation: CreateAndInstallTenantUseCase,\n dependencies: [\n IdentityContext,\n GetTenantByIdUseCase,\n UpdateTenantUseCase,\n Tenancy.GetTenantByIdUseCase,\n Tenancy.CreateTenantUseCase,\n Tenancy.UpdateTenantUseCase,\n Tenancy.DeleteTenantUseCase,\n Tenancy.InstallTenantUseCase\n ]\n});\n"],"names":["CreateAndInstallTenantUseCase","identityContext","getTenantByIdUseCase","updateTenantUseCase","coreGetTenantById","coreCreateTenant","coreUpdateTenant","coreDeleteTenant","coreInstallTenant","tenantId","Result","NotAuthorizedError","entryId","EntryId","tenantResult","tenant","existingTenantResult","createTenantResult","TenantCreationError","createdTenant","installResult","TenantInstallationError","updateResult","TenantUpdateError","UseCaseAbstraction","IdentityContext","GetTenantByIdUseCase","UpdateTenantUseCase","Tenancy"],"mappings":";;;;;;;;;AAeA,MAAMA;IACF,YACYC,eAA0C,EAE1CC,oBAAoD,EACpDC,mBAAkD,EAElDC,iBAAyD,EACzDC,gBAAuD,EACvDC,gBAAuD,EACvDC,gBAAuD,EACvDC,iBAAyD,CACnE;aAVUP,eAAe,GAAfA;aAEAC,oBAAoB,GAApBA;aACAC,mBAAmB,GAAnBA;aAEAC,iBAAiB,GAAjBA;aACAC,gBAAgB,GAAhBA;aACAC,gBAAgB,GAAhBA;aACAC,gBAAgB,GAAhBA;aACAC,iBAAiB,GAAjBA;IACT;IAEH,MAAM,QAAQC,QAAgB,EAAqD;QAE/E,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,cACpC,OAAOC,OAAO,IAAI,CACd,IAAIC,mBAAmB;YACnB,SAAS;QACb;QAIR,MAAMC,UAAUC,QAAQ,IAAI,CAACJ;QAG7B,MAAMK,eAAe,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAACF,QAAQ,EAAE;QACvE,IAAIE,aAAa,MAAM,IACnB,OAAOJ,OAAO,IAAI,CAACI,aAAa,KAAK;QAEzC,MAAMC,SAASD,aAAa,KAAK;QAEjC,MAAME,uBAAuB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACD,OAAO,EAAE;QAG3E,IAAIC,qBAAqB,IAAI,IAAI;YAE7B,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAACD,OAAO,EAAE,EAAE;gBAC3C,MAAMA,OAAO,MAAM,CAAC,IAAI;gBACxB,aAAaA,OAAO,MAAM,CAAC,WAAW;gBACtC,QAAQ;YACZ;YAGA,OAAO,IAAI,CAAC,mBAAmB,CAACA;QACpC;QAGA,MAAME,qBAAqB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC3D,IAAIL,QAAQ,EAAE;YACd,MAAMG,OAAO,MAAM,CAAC,IAAI;YACxB,QAAQ;YACR,aAAaA,OAAO,MAAM,CAAC,IAAI;YAC/B,MAAM,EAAE;QACZ;QAEA,IAAIE,mBAAmB,MAAM,IACzB,OAAOP,OAAO,IAAI,CAAC,IAAIQ,oBAAoBD,mBAAmB,KAAK;QAEvE,MAAME,gBAAgBF,mBAAmB,KAAK;QAG9C,MAAMG,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YACvD,QAAQD;YACR,mBAAmB,EAAE;QACzB;QAEA,IAAIC,cAAc,MAAM,IAAI;YAExB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAACD,cAAc,EAAE;YAEpD,OAAOT,OAAO,IAAI,CAAC,IAAIW,wBAAwBD,cAAc,KAAK;QACtE;QAEA,OAAO,IAAI,CAAC,mBAAmB,CAACL;IACpC;IAEA,MAAc,oBAAoBA,MAAc,EAAE;QAE9C,MAAMO,eAAe,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAACP,OAAO,EAAE,EAAE;YACnE,QAAQ;YACR,aAAa;QACjB;QAEA,IAAIO,aAAa,MAAM,IACnB,OAAOZ,OAAO,IAAI,CAAC,IAAIa,kBAAkBD,aAAa,KAAK;QAI/D,OAAOZ,OAAO,EAAE,CAACY,aAAa,KAAK;IACvC;AACJ;AAEA,6DAAeE,8BAAAA,oBAAuC,CAAC;IACnD,gBAAgBxB;IAChB,cAAc;QACVyB;QACAC;QACAC;QACAC,mEAAAA,oBAA4B;QAC5BA,mEAAAA,mBAA2B;QAC3BA,mEAAAA,mBAA2B;QAC3BA,mEAAAA,mBAA2B;QAC3BA,mEAAAA,oBAA4B;KAC/B;AACL"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
3
|
+
import type { Tenant } from "../../../shared/Tenant.js";
|
|
4
|
+
import type { TenantCreationError, TenantInstallationError, TenantUpdateError, TenantNotFoundError, TenantPersistenceError, TenantModelNotFoundError } from "../../domain/errors.js";
|
|
5
|
+
/**
|
|
6
|
+
* CreateAndInstallTenant Use Case
|
|
7
|
+
*/
|
|
8
|
+
export interface ICreateAndInstallTenantUseCase {
|
|
9
|
+
execute(tenantId: string): Promise<Result<Tenant, UseCaseError>>;
|
|
10
|
+
}
|
|
11
|
+
export interface ICreateAndInstallTenantUseCaseErrors {
|
|
12
|
+
tenantCreation: TenantCreationError;
|
|
13
|
+
tenantInstallation: TenantInstallationError;
|
|
14
|
+
notFound: TenantNotFoundError;
|
|
15
|
+
notAuthorized: NotAuthorizedError;
|
|
16
|
+
persistence: TenantPersistenceError;
|
|
17
|
+
tenantUpdate: TenantUpdateError;
|
|
18
|
+
modelNotFoundError: TenantModelNotFoundError;
|
|
19
|
+
}
|
|
20
|
+
type UseCaseError = ICreateAndInstallTenantUseCaseErrors[keyof ICreateAndInstallTenantUseCaseErrors];
|
|
21
|
+
export declare const CreateAndInstallTenantUseCase: import("@webiny/di").Abstraction<ICreateAndInstallTenantUseCase>;
|
|
22
|
+
export declare namespace CreateAndInstallTenantUseCase {
|
|
23
|
+
type Interface = ICreateAndInstallTenantUseCase;
|
|
24
|
+
type Error = UseCaseError;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/CreateAndInstallTenant/abstractions.js","sources":["../../../../src/api/features/CreateAndInstallTenant/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/errors.js\";\nimport type { Tenant } from \"~/shared/Tenant.js\";\nimport type {\n TenantCreationError,\n TenantInstallationError,\n TenantUpdateError,\n TenantNotFoundError,\n TenantPersistenceError,\n TenantModelNotFoundError\n} from \"../../domain/errors.js\";\n\n/**\n * CreateAndInstallTenant Use Case\n */\nexport interface ICreateAndInstallTenantUseCase {\n execute(tenantId: string): Promise<Result<Tenant, UseCaseError>>;\n}\n\nexport interface ICreateAndInstallTenantUseCaseErrors {\n tenantCreation: TenantCreationError;\n tenantInstallation: TenantInstallationError;\n notFound: TenantNotFoundError;\n notAuthorized: NotAuthorizedError;\n persistence: TenantPersistenceError;\n tenantUpdate: TenantUpdateError;\n modelNotFoundError: TenantModelNotFoundError;\n}\n\ntype UseCaseError =\n ICreateAndInstallTenantUseCaseErrors[keyof ICreateAndInstallTenantUseCaseErrors];\n\nexport const CreateAndInstallTenantUseCase = createAbstraction<ICreateAndInstallTenantUseCase>(\n \"TenantManager/CreateAndInstallTenantUseCase\"\n);\n\nexport namespace CreateAndInstallTenantUseCase {\n export type Interface = ICreateAndInstallTenantUseCase;\n export type Error = UseCaseError;\n}\n"],"names":["CreateAndInstallTenantUseCase","createAbstraction"],"mappings":";AAiCO,MAAMA,gCAAgCC,kBACzC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import CreateAndInstallTenantUseCase from "./CreateAndInstallTenantUseCase.js";
|
|
3
|
+
const CreateAndInstallTenantFeature = createFeature({
|
|
4
|
+
name: "CreateAndInstallTenant",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(CreateAndInstallTenantUseCase);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { CreateAndInstallTenantFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/CreateAndInstallTenant/feature.js","sources":["../../../../src/api/features/CreateAndInstallTenant/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport CreateAndInstallTenantUseCase from \"./CreateAndInstallTenantUseCase.js\";\n\nexport const CreateAndInstallTenantFeature = createFeature({\n name: \"CreateAndInstallTenant\",\n register(container) {\n // Register use case (transient scope)\n container.register(CreateAndInstallTenantUseCase);\n }\n});\n"],"names":["CreateAndInstallTenantFeature","createFeature","container","CreateAndInstallTenantUseCase"],"mappings":";;AAGO,MAAMA,gCAAgCC,cAAc;IACvD,MAAM;IACN,UAASC,SAAS;QAEdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Tenant } from "../../../shared/Tenant.js";
|
|
2
|
+
import { CreateTenantRepository as RepositoryAbstraction } from "./abstractions.js";
|
|
3
|
+
import { Result } from "@webiny/feature/api";
|
|
4
|
+
import { CreateEntryUseCase } from "@webiny/api-headless-cms/exports/api/cms/entry.js";
|
|
5
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/exports/api/cms/model";
|
|
6
|
+
declare class CreateTenantRepository implements RepositoryAbstraction.Interface {
|
|
7
|
+
private getModelUseCase;
|
|
8
|
+
private createEntryUseCase;
|
|
9
|
+
constructor(getModelUseCase: GetModelUseCase.Interface, createEntryUseCase: CreateEntryUseCase.Interface);
|
|
10
|
+
execute(tenant: Tenant): Promise<Result<Tenant, RepositoryAbstraction.Error>>;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: typeof CreateTenantRepository & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICreateTenantRepository>;
|
|
14
|
+
};
|
|
15
|
+
export default _default;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { TenantCreationError, TenantModelNotFoundError } from "../../domain/errors.js";
|
|
2
|
+
import { CreateTenantRepository } from "./abstractions.js";
|
|
3
|
+
import { Result } from "@webiny/feature/api";
|
|
4
|
+
import { CreateEntryUseCase } from "@webiny/api-headless-cms/exports/api/cms/entry.js";
|
|
5
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/exports/api/cms/model";
|
|
6
|
+
import { TENANT_MODEL_ID } from "../../../shared/constants.js";
|
|
7
|
+
class CreateTenantRepository_CreateTenantRepository {
|
|
8
|
+
constructor(getModelUseCase, createEntryUseCase){
|
|
9
|
+
this.getModelUseCase = getModelUseCase;
|
|
10
|
+
this.createEntryUseCase = createEntryUseCase;
|
|
11
|
+
}
|
|
12
|
+
async execute(tenant) {
|
|
13
|
+
try {
|
|
14
|
+
const modelResult = await this.getModelUseCase.execute(TENANT_MODEL_ID);
|
|
15
|
+
if (modelResult.isFail()) return Result.fail(new TenantModelNotFoundError());
|
|
16
|
+
const tenantValues = {
|
|
17
|
+
name: tenant.values.name,
|
|
18
|
+
status: tenant.values.status,
|
|
19
|
+
description: tenant.values.description,
|
|
20
|
+
isInstalled: false,
|
|
21
|
+
extensions: tenant.values.extensions || {}
|
|
22
|
+
};
|
|
23
|
+
const createResult = await this.createEntryUseCase.execute(modelResult.value, {
|
|
24
|
+
id: tenant.id,
|
|
25
|
+
values: tenantValues
|
|
26
|
+
});
|
|
27
|
+
if (createResult.isFail()) return Result.fail(new TenantCreationError(createResult.error));
|
|
28
|
+
return Result.ok(tenant);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
return Result.fail(new TenantCreationError(error));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const CreateTenant_CreateTenantRepository = CreateTenantRepository.createImplementation({
|
|
35
|
+
implementation: CreateTenantRepository_CreateTenantRepository,
|
|
36
|
+
dependencies: [
|
|
37
|
+
GetModelUseCase,
|
|
38
|
+
CreateEntryUseCase
|
|
39
|
+
]
|
|
40
|
+
});
|
|
41
|
+
export default CreateTenant_CreateTenantRepository;
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=CreateTenantRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/CreateTenant/CreateTenantRepository.js","sources":["../../../../src/api/features/CreateTenant/CreateTenantRepository.ts"],"sourcesContent":["import { Tenant, TenantValues } from \"~/shared/Tenant.js\";\nimport { TenantCreationError, TenantModelNotFoundError } from \"../../domain/errors.js\";\nimport { CreateTenantRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/exports/api/cms/model\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\n\nclass CreateTenantRepository implements RepositoryAbstraction.Interface {\n constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private createEntryUseCase: CreateEntryUseCase.Interface\n ) {}\n\n async execute(tenant: Tenant): Promise<Result<Tenant, RepositoryAbstraction.Error>> {\n try {\n // Get the tenant model\n const modelResult = await this.getModelUseCase.execute(TENANT_MODEL_ID);\n if (modelResult.isFail()) {\n return Result.fail(new TenantModelNotFoundError());\n }\n\n // Prepare tenant values with default isInstalled: false\n const tenantValues: TenantValues = {\n name: tenant.values.name,\n status: tenant.values.status,\n description: tenant.values.description,\n isInstalled: false,\n extensions: tenant.values.extensions || {}\n };\n\n // Create the tenant entry\n const createResult = await this.createEntryUseCase.execute(modelResult.value, {\n id: tenant.id,\n values: tenantValues\n });\n\n if (createResult.isFail()) {\n return Result.fail(new TenantCreationError(createResult.error));\n }\n\n return Result.ok(tenant);\n } catch (error) {\n return Result.fail(new TenantCreationError(error as Error));\n }\n }\n}\n\nexport default RepositoryAbstraction.createImplementation({\n implementation: CreateTenantRepository,\n dependencies: [GetModelUseCase, CreateEntryUseCase]\n});\n"],"names":["CreateTenantRepository","getModelUseCase","createEntryUseCase","tenant","modelResult","TENANT_MODEL_ID","Result","TenantModelNotFoundError","tenantValues","createResult","TenantCreationError","error","RepositoryAbstraction","GetModelUseCase","CreateEntryUseCase"],"mappings":";;;;;;AAQA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,kBAAgD,CAC1D;aAFUD,eAAe,GAAfA;aACAC,kBAAkB,GAAlBA;IACT;IAEH,MAAM,QAAQC,MAAc,EAAwD;QAChF,IAAI;YAEA,MAAMC,cAAc,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACC;YACvD,IAAID,YAAY,MAAM,IAClB,OAAOE,OAAO,IAAI,CAAC,IAAIC;YAI3B,MAAMC,eAA6B;gBAC/B,MAAML,OAAO,MAAM,CAAC,IAAI;gBACxB,QAAQA,OAAO,MAAM,CAAC,MAAM;gBAC5B,aAAaA,OAAO,MAAM,CAAC,WAAW;gBACtC,aAAa;gBACb,YAAYA,OAAO,MAAM,CAAC,UAAU,IAAI,CAAC;YAC7C;YAGA,MAAMM,eAAe,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACL,YAAY,KAAK,EAAE;gBAC1E,IAAID,OAAO,EAAE;gBACb,QAAQK;YACZ;YAEA,IAAIC,aAAa,MAAM,IACnB,OAAOH,OAAO,IAAI,CAAC,IAAII,oBAAoBD,aAAa,KAAK;YAGjE,OAAOH,OAAO,EAAE,CAACH;QACrB,EAAE,OAAOQ,OAAO;YACZ,OAAOL,OAAO,IAAI,CAAC,IAAII,oBAAoBC;QAC/C;IACJ;AACJ;AAEA,4CAAeC,uBAAAA,oBAA0C,CAAC;IACtD,gBAAgBZ;IAChB,cAAc;QAACa;QAAiBC;KAAmB;AACvD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CreateTenantUseCase as UseCaseAbstraction, ICreateTenantInput, CreateTenantRepository } from "./abstractions.js";
|
|
2
|
+
import { Result } from "@webiny/feature/api";
|
|
3
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
4
|
+
import { Tenant } from "../../../shared/Tenant.js";
|
|
5
|
+
declare class CreateTenantUseCase implements UseCaseAbstraction.Interface {
|
|
6
|
+
private identityContext;
|
|
7
|
+
private repository;
|
|
8
|
+
constructor(identityContext: IdentityContext.Interface, repository: CreateTenantRepository.Interface);
|
|
9
|
+
execute(input: ICreateTenantInput): Promise<Result<Tenant, UseCaseAbstraction.Error>>;
|
|
10
|
+
}
|
|
11
|
+
declare const _default: typeof CreateTenantUseCase & {
|
|
12
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICreateTenantUseCase>;
|
|
13
|
+
};
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { CreateTenantRepository, CreateTenantUseCase } from "./abstractions.js";
|
|
2
|
+
import { Result } from "@webiny/feature/api";
|
|
3
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
4
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
5
|
+
import { Tenant } from "../../../shared/Tenant.js";
|
|
6
|
+
import { TenantId } from "../../domain/TenantId.js";
|
|
7
|
+
class CreateTenantUseCase_CreateTenantUseCase {
|
|
8
|
+
constructor(identityContext, repository){
|
|
9
|
+
this.identityContext = identityContext;
|
|
10
|
+
this.repository = repository;
|
|
11
|
+
}
|
|
12
|
+
async execute(input) {
|
|
13
|
+
if (!this.identityContext.getPermission("tm.tenant")) return Result.fail(new NotAuthorizedError({
|
|
14
|
+
message: "Not authorized to create tenants!"
|
|
15
|
+
}));
|
|
16
|
+
const tenant = Tenant.from({
|
|
17
|
+
id: TenantId.from(input.id),
|
|
18
|
+
values: {
|
|
19
|
+
name: input.name,
|
|
20
|
+
description: input.description || "(no description)",
|
|
21
|
+
extensions: input.extensions ?? {},
|
|
22
|
+
status: "disabled",
|
|
23
|
+
isInstalled: false
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const result = await this.repository.execute(tenant);
|
|
27
|
+
if (result.isFail()) return Result.fail(result.error);
|
|
28
|
+
return Result.ok(result.value);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const CreateTenant_CreateTenantUseCase = CreateTenantUseCase.createImplementation({
|
|
32
|
+
implementation: CreateTenantUseCase_CreateTenantUseCase,
|
|
33
|
+
dependencies: [
|
|
34
|
+
IdentityContext,
|
|
35
|
+
CreateTenantRepository
|
|
36
|
+
]
|
|
37
|
+
});
|
|
38
|
+
export default CreateTenant_CreateTenantUseCase;
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=CreateTenantUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/CreateTenant/CreateTenantUseCase.js","sources":["../../../../src/api/features/CreateTenant/CreateTenantUseCase.ts"],"sourcesContent":["import {\n CreateTenantUseCase as UseCaseAbstraction,\n ICreateTenantInput,\n CreateTenantRepository\n} from \"./abstractions.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/errors.js\";\nimport { Tenant } from \"~/shared/Tenant.js\";\nimport { TenantId } from \"~/api/domain/TenantId.js\";\n\nclass CreateTenantUseCase implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private repository: CreateTenantRepository.Interface\n ) {}\n\n async execute(input: ICreateTenantInput): Promise<Result<Tenant, UseCaseAbstraction.Error>> {\n // Authorization checks\n if (!this.identityContext.getPermission(\"tm.tenant\")) {\n return Result.fail(\n new NotAuthorizedError({\n message: \"Not authorized to create tenants!\"\n })\n );\n }\n\n const tenant = Tenant.from({\n id: TenantId.from(input.id),\n values: {\n name: input.name,\n description: input.description || \"(no description)\",\n extensions: input.extensions ?? {},\n status: \"disabled\",\n isInstalled: false\n }\n });\n\n // Create the tenant\n const result = await this.repository.execute(tenant);\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n return Result.ok(result.value);\n }\n}\n\nexport default UseCaseAbstraction.createImplementation({\n implementation: CreateTenantUseCase,\n dependencies: [IdentityContext, CreateTenantRepository]\n});\n"],"names":["CreateTenantUseCase","identityContext","repository","input","Result","NotAuthorizedError","tenant","Tenant","TenantId","result","UseCaseAbstraction","IdentityContext","CreateTenantRepository"],"mappings":";;;;;;AAWA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,UAA4C,CACtD;aAFUD,eAAe,GAAfA;aACAC,UAAU,GAAVA;IACT;IAEH,MAAM,QAAQC,KAAyB,EAAqD;QAExF,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,cACpC,OAAOC,OAAO,IAAI,CACd,IAAIC,mBAAmB;YACnB,SAAS;QACb;QAIR,MAAMC,SAASC,OAAO,IAAI,CAAC;YACvB,IAAIC,SAAS,IAAI,CAACL,MAAM,EAAE;YAC1B,QAAQ;gBACJ,MAAMA,MAAM,IAAI;gBAChB,aAAaA,MAAM,WAAW,IAAI;gBAClC,YAAYA,MAAM,UAAU,IAAI,CAAC;gBACjC,QAAQ;gBACR,aAAa;YACjB;QACJ;QAGA,MAAMM,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACH;QAC7C,IAAIG,OAAO,MAAM,IACb,OAAOL,OAAO,IAAI,CAACK,OAAO,KAAK;QAGnC,OAAOL,OAAO,EAAE,CAACK,OAAO,KAAK;IACjC;AACJ;AAEA,yCAAeC,oBAAAA,oBAAuC,CAAC;IACnD,gBAAgBV;IAChB,cAAc;QAACW;QAAiBC;KAAuB;AAC3D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
3
|
+
import { TenantCreationError, TenantModelNotFoundError, type TenantPersistenceError } from "../../../api/domain/errors.js";
|
|
4
|
+
import type { Tenant, TenantExtensions } from "../../../shared/Tenant.js";
|
|
5
|
+
export interface ICreateTenantInput {
|
|
6
|
+
id?: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
extensions: TenantExtensions;
|
|
10
|
+
}
|
|
11
|
+
export interface ICreateTenantUseCaseErrors {
|
|
12
|
+
persistence: TenantPersistenceError;
|
|
13
|
+
modelNotFoundError: TenantModelNotFoundError;
|
|
14
|
+
notAuthorized: NotAuthorizedError;
|
|
15
|
+
tenantCreation: TenantCreationError;
|
|
16
|
+
}
|
|
17
|
+
export type ICreateTenantUseCaseError = ICreateTenantUseCaseErrors[keyof ICreateTenantUseCaseErrors];
|
|
18
|
+
export interface ICreateTenantUseCase {
|
|
19
|
+
execute(input: ICreateTenantInput): Promise<Result<Tenant, ICreateTenantUseCaseError>>;
|
|
20
|
+
}
|
|
21
|
+
export declare const CreateTenantUseCase: import("@webiny/di").Abstraction<ICreateTenantUseCase>;
|
|
22
|
+
export declare namespace CreateTenantUseCase {
|
|
23
|
+
type Interface = ICreateTenantUseCase;
|
|
24
|
+
type Input = ICreateTenantInput;
|
|
25
|
+
type Error = ICreateTenantUseCaseError;
|
|
26
|
+
}
|
|
27
|
+
export interface ICreateTenantRepositoryErrors {
|
|
28
|
+
persistence: TenantPersistenceError;
|
|
29
|
+
modelNotFoundError: TenantModelNotFoundError;
|
|
30
|
+
tenantCreation: TenantCreationError;
|
|
31
|
+
}
|
|
32
|
+
type IRepositoryError = ICreateTenantRepositoryErrors[keyof ICreateTenantRepositoryErrors];
|
|
33
|
+
export interface ICreateTenantRepository {
|
|
34
|
+
execute(tenant: Tenant): Promise<Result<Tenant, IRepositoryError>>;
|
|
35
|
+
}
|
|
36
|
+
export declare const CreateTenantRepository: import("@webiny/di").Abstraction<ICreateTenantRepository>;
|
|
37
|
+
export declare namespace CreateTenantRepository {
|
|
38
|
+
type Interface = ICreateTenantRepository;
|
|
39
|
+
type Error = IRepositoryError;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
+
const CreateTenantUseCase = createAbstraction("TenantManager/CreateTenantUseCase");
|
|
3
|
+
const CreateTenantRepository = createAbstraction("TenantManager/CreateTenantRepository");
|
|
4
|
+
export { CreateTenantRepository, CreateTenantUseCase };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/CreateTenant/abstractions.js","sources":["../../../../src/api/features/CreateTenant/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/errors.js\";\nimport {\n TenantCreationError,\n TenantModelNotFoundError,\n type TenantPersistenceError\n} from \"~/api/domain/errors.js\";\nimport type { Tenant, TenantExtensions } from \"~/shared/Tenant.js\";\n\n// USE CASE\n\nexport interface ICreateTenantInput {\n id?: string;\n name: string;\n description?: string;\n extensions: TenantExtensions;\n}\n\nexport interface ICreateTenantUseCaseErrors {\n persistence: TenantPersistenceError;\n modelNotFoundError: TenantModelNotFoundError;\n notAuthorized: NotAuthorizedError;\n tenantCreation: TenantCreationError;\n}\n\nexport type ICreateTenantUseCaseError =\n ICreateTenantUseCaseErrors[keyof ICreateTenantUseCaseErrors];\n\nexport interface ICreateTenantUseCase {\n execute(input: ICreateTenantInput): Promise<Result<Tenant, ICreateTenantUseCaseError>>;\n}\n\nexport const CreateTenantUseCase = createAbstraction<ICreateTenantUseCase>(\n \"TenantManager/CreateTenantUseCase\"\n);\n\nexport namespace CreateTenantUseCase {\n export type Interface = ICreateTenantUseCase;\n export type Input = ICreateTenantInput;\n export type Error = ICreateTenantUseCaseError;\n}\n\n// REPOSITORY\n\nexport interface ICreateTenantRepositoryErrors {\n persistence: TenantPersistenceError;\n modelNotFoundError: TenantModelNotFoundError;\n tenantCreation: TenantCreationError;\n}\n\ntype IRepositoryError = ICreateTenantRepositoryErrors[keyof ICreateTenantRepositoryErrors];\n\nexport interface ICreateTenantRepository {\n execute(tenant: Tenant): Promise<Result<Tenant, IRepositoryError>>;\n}\n\nexport const CreateTenantRepository = createAbstraction<ICreateTenantRepository>(\n \"TenantManager/CreateTenantRepository\"\n);\n\nexport namespace CreateTenantRepository {\n export type Interface = ICreateTenantRepository;\n export type Error = IRepositoryError;\n}\n"],"names":["CreateTenantUseCase","createAbstraction","CreateTenantRepository"],"mappings":";AAiCO,MAAMA,sBAAsBC,kBAC/B;AAuBG,MAAMC,yBAAyBD,kBAClC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import CreateTenantUseCase from "./CreateTenantUseCase.js";
|
|
3
|
+
import CreateTenantRepository from "./CreateTenantRepository.js";
|
|
4
|
+
const CreateTenantFeature = createFeature({
|
|
5
|
+
name: "CreateTenant",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(CreateTenantUseCase);
|
|
8
|
+
container.register(CreateTenantRepository).inSingletonScope();
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
export { CreateTenantFeature };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/CreateTenant/feature.js","sources":["../../../../src/api/features/CreateTenant/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport CreateTenantUseCase from \"./CreateTenantUseCase.js\";\nimport CreateTenantRepository from \"./CreateTenantRepository.js\";\n\nexport const CreateTenantFeature = createFeature({\n name: \"CreateTenant\",\n register(container) {\n // Register use case (transient scope)\n container.register(CreateTenantUseCase);\n\n // Register repository (singleton scope)\n container.register(CreateTenantRepository).inSingletonScope();\n }\n});\n"],"names":["CreateTenantFeature","createFeature","container","CreateTenantUseCase","CreateTenantRepository"],"mappings":";;;AAIO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QAEdA,UAAU,QAAQ,CAACC;QAGnBD,UAAU,QAAQ,CAACE,wBAAwB,gBAAgB;IAC/D;AACJ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events.js";
|
|
2
|
+
import { DeleteTenantUseCase } from "@webiny/api-core/features/tenancy/DeleteTenant";
|
|
3
|
+
declare class DeleteTenantOnEntryDeleteHandler implements EntryAfterDeleteEventHandler.Interface {
|
|
4
|
+
private deleteTenant;
|
|
5
|
+
constructor(deleteTenant: DeleteTenantUseCase.Interface);
|
|
6
|
+
handle(event: EntryAfterDeleteEventHandler.Event): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: typeof DeleteTenantOnEntryDeleteHandler & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events.js").EntryAfterDeleteEvent>>;
|
|
10
|
+
};
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events.js";
|
|
2
|
+
import { DeleteTenantUseCase } from "@webiny/api-core/features/tenancy/DeleteTenant";
|
|
3
|
+
import { TENANT_MODEL_ID } from "../../../shared/constants.js";
|
|
4
|
+
class DeleteTenantOnEntryDeleteHandler {
|
|
5
|
+
constructor(deleteTenant){
|
|
6
|
+
this.deleteTenant = deleteTenant;
|
|
7
|
+
}
|
|
8
|
+
async handle(event) {
|
|
9
|
+
const { entry, model } = event.payload;
|
|
10
|
+
if (model.modelId !== TENANT_MODEL_ID) return;
|
|
11
|
+
if (!event.payload.permanent) return;
|
|
12
|
+
try {
|
|
13
|
+
await this.deleteTenant.execute(entry.entryId);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.error(`Failed to delete tenant ${entry.entryId}!`, error);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const DeleteTenantOnEntryDelete_DeleteTenantOnEntryDeleteHandler = EntryAfterDeleteEventHandler.createImplementation({
|
|
20
|
+
implementation: DeleteTenantOnEntryDeleteHandler,
|
|
21
|
+
dependencies: [
|
|
22
|
+
DeleteTenantUseCase
|
|
23
|
+
]
|
|
24
|
+
});
|
|
25
|
+
export default DeleteTenantOnEntryDelete_DeleteTenantOnEntryDeleteHandler;
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=DeleteTenantOnEntryDeleteHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js","sources":["../../../../src/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.ts"],"sourcesContent":["import { EntryAfterDeleteEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events.js\";\nimport { DeleteTenantUseCase } from \"@webiny/api-core/features/tenancy/DeleteTenant\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\n\nclass DeleteTenantOnEntryDeleteHandler implements EntryAfterDeleteEventHandler.Interface {\n constructor(private deleteTenant: DeleteTenantUseCase.Interface) {}\n\n async handle(event: EntryAfterDeleteEventHandler.Event): Promise<void> {\n const { entry, model } = event.payload;\n\n // Only handle tenant model deletions\n if (model.modelId !== TENANT_MODEL_ID) {\n return;\n }\n\n // Only handle permanent deletions\n if (!event.payload.permanent) {\n return;\n }\n\n try {\n // Delete the tenant from api-core\n await this.deleteTenant.execute(entry.entryId);\n } catch (error) {\n // Log error but don't throw - we don't want to prevent CMS deletion\n console.error(`Failed to delete tenant ${entry.entryId}!`, error);\n }\n }\n}\n\nexport default EntryAfterDeleteEventHandler.createImplementation({\n implementation: DeleteTenantOnEntryDeleteHandler,\n dependencies: [DeleteTenantUseCase]\n});\n"],"names":["DeleteTenantOnEntryDeleteHandler","deleteTenant","event","entry","model","TENANT_MODEL_ID","error","console","EntryAfterDeleteEventHandler","DeleteTenantUseCase"],"mappings":";;;AAIA,MAAMA;IACF,YAAoBC,YAA2C,CAAE;aAA7CA,YAAY,GAAZA;IAA8C;IAElE,MAAM,OAAOC,KAAyC,EAAiB;QACnE,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,MAAM,OAAO;QAGtC,IAAIE,MAAM,OAAO,KAAKC,iBAClB;QAIJ,IAAI,CAACH,MAAM,OAAO,CAAC,SAAS,EACxB;QAGJ,IAAI;YAEA,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACC,MAAM,OAAO;QACjD,EAAE,OAAOG,OAAO;YAEZC,QAAQ,KAAK,CAAC,CAAC,wBAAwB,EAAEJ,MAAM,OAAO,CAAC,CAAC,CAAC,EAAEG;QAC/D;IACJ;AACJ;AAEA,mEAAeE,6BAA6B,oBAAoB,CAAC;IAC7D,gBAAgBR;IAChB,cAAc;QAACS;KAAoB;AACvC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import DeleteTenantOnEntryDeleteHandler from "./DeleteTenantOnEntryDeleteHandler.js";
|
|
3
|
+
const DeleteTenantOnEntryDeleteFeature = createFeature({
|
|
4
|
+
name: "DeleteTenantOnEntryDelete",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(DeleteTenantOnEntryDeleteHandler);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { DeleteTenantOnEntryDeleteFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/DeleteTenantOnEntryDelete/feature.js","sources":["../../../../src/api/features/DeleteTenantOnEntryDelete/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport DeleteTenantOnEntryDeleteHandler from \"./DeleteTenantOnEntryDeleteHandler.js\";\n\nexport const DeleteTenantOnEntryDeleteFeature = createFeature({\n name: \"DeleteTenantOnEntryDelete\",\n register(container) {\n // Register the event handler\n container.register(DeleteTenantOnEntryDeleteHandler);\n }\n});\n"],"names":["DeleteTenantOnEntryDeleteFeature","createFeature","container","DeleteTenantOnEntryDeleteHandler"],"mappings":";;AAGO,MAAMA,mCAAmCC,cAAc;IAC1D,MAAM;IACN,UAASC,SAAS;QAEdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DisableTenantUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
2
|
+
import { Result } from "@webiny/feature/api";
|
|
3
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
4
|
+
import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
5
|
+
import { UpdateTenantUseCase as ApiCoreUpdateTenant } from "@webiny/api-core/features/tenancy/UpdateTenant";
|
|
6
|
+
import { UpdateTenantUseCase as TenantManagerUpdateTenant } from "../UpdateTenant/abstractions.js";
|
|
7
|
+
import { GetTenantByIdUseCase } from "../GetTenantById/abstractions.js";
|
|
8
|
+
declare class DisableTenantUseCase implements UseCaseAbstraction.Interface {
|
|
9
|
+
private identityContext;
|
|
10
|
+
private eventPublisher;
|
|
11
|
+
private coreUpdateTenant;
|
|
12
|
+
private tmUpdateTenant;
|
|
13
|
+
private tmGetTenantById;
|
|
14
|
+
constructor(identityContext: IdentityContext.Interface, eventPublisher: EventPublisher.Interface, coreUpdateTenant: ApiCoreUpdateTenant.Interface, tmUpdateTenant: TenantManagerUpdateTenant.Interface, tmGetTenantById: GetTenantByIdUseCase.Interface);
|
|
15
|
+
execute(tenantId: string): Promise<Result<void, UseCaseAbstraction.Error>>;
|
|
16
|
+
}
|
|
17
|
+
declare const _default: typeof DisableTenantUseCase & {
|
|
18
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IDisableTenantUseCase>;
|
|
19
|
+
};
|
|
20
|
+
export default _default;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DisableTenantUseCase } from "./abstractions.js";
|
|
2
|
+
import { Result } from "@webiny/feature/api";
|
|
3
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
4
|
+
import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
5
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
6
|
+
import { UpdateTenantUseCase } from "@webiny/api-core/features/tenancy/UpdateTenant";
|
|
7
|
+
import { UpdateTenantUseCase as abstractions_js_UpdateTenantUseCase } from "../UpdateTenant/abstractions.js";
|
|
8
|
+
import { GetTenantByIdUseCase } from "../GetTenantById/abstractions.js";
|
|
9
|
+
import { TenantAfterDisableEvent, TenantBeforeDisableEvent } from "./events.js";
|
|
10
|
+
import { TenantPersistenceError } from "../../domain/errors.js";
|
|
11
|
+
class DisableTenantUseCase_DisableTenantUseCase {
|
|
12
|
+
constructor(identityContext, eventPublisher, coreUpdateTenant, tmUpdateTenant, tmGetTenantById){
|
|
13
|
+
this.identityContext = identityContext;
|
|
14
|
+
this.eventPublisher = eventPublisher;
|
|
15
|
+
this.coreUpdateTenant = coreUpdateTenant;
|
|
16
|
+
this.tmUpdateTenant = tmUpdateTenant;
|
|
17
|
+
this.tmGetTenantById = tmGetTenantById;
|
|
18
|
+
}
|
|
19
|
+
async execute(tenantId) {
|
|
20
|
+
if (!this.identityContext.getPermission("tm.tenant")) return Result.fail(new NotAuthorizedError());
|
|
21
|
+
const getTenantResult = await this.tmGetTenantById.execute(tenantId);
|
|
22
|
+
if (getTenantResult.isFail()) return Result.fail(getTenantResult.error);
|
|
23
|
+
const tenant = getTenantResult.value;
|
|
24
|
+
await this.eventPublisher.publish(new TenantBeforeDisableEvent({
|
|
25
|
+
tenant
|
|
26
|
+
}));
|
|
27
|
+
const apiCoreResult = await this.coreUpdateTenant.execute(tenantId, {
|
|
28
|
+
status: "disabled"
|
|
29
|
+
});
|
|
30
|
+
if (apiCoreResult.isFail()) return Result.fail(new TenantPersistenceError(new Error(`Failed to update api-core tenant: ${apiCoreResult.error}`)));
|
|
31
|
+
const updateResult = await this.tmUpdateTenant.execute(tenantId, {
|
|
32
|
+
status: "disabled"
|
|
33
|
+
});
|
|
34
|
+
if (updateResult.isFail()) return Result.fail(updateResult.error);
|
|
35
|
+
await this.eventPublisher.publish(new TenantAfterDisableEvent({
|
|
36
|
+
tenant: updateResult.value
|
|
37
|
+
}));
|
|
38
|
+
return Result.ok();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const DisableTenant_DisableTenantUseCase = DisableTenantUseCase.createImplementation({
|
|
42
|
+
implementation: DisableTenantUseCase_DisableTenantUseCase,
|
|
43
|
+
dependencies: [
|
|
44
|
+
IdentityContext,
|
|
45
|
+
EventPublisher,
|
|
46
|
+
UpdateTenantUseCase,
|
|
47
|
+
abstractions_js_UpdateTenantUseCase,
|
|
48
|
+
GetTenantByIdUseCase
|
|
49
|
+
]
|
|
50
|
+
});
|
|
51
|
+
export default DisableTenant_DisableTenantUseCase;
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=DisableTenantUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/DisableTenant/DisableTenantUseCase.js","sources":["../../../../src/api/features/DisableTenant/DisableTenantUseCase.ts"],"sourcesContent":["import { DisableTenantUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/errors.js\";\nimport { UpdateTenantUseCase as ApiCoreUpdateTenant } from \"@webiny/api-core/features/tenancy/UpdateTenant\";\nimport { UpdateTenantUseCase as TenantManagerUpdateTenant } from \"../UpdateTenant/abstractions.js\";\nimport { GetTenantByIdUseCase } from \"../GetTenantById/abstractions.js\";\nimport { TenantBeforeDisableEvent, TenantAfterDisableEvent } from \"./events.js\";\nimport { TenantPersistenceError } from \"../../domain/errors.js\";\n\nclass DisableTenantUseCase implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private eventPublisher: EventPublisher.Interface,\n private coreUpdateTenant: ApiCoreUpdateTenant.Interface,\n private tmUpdateTenant: TenantManagerUpdateTenant.Interface,\n private tmGetTenantById: GetTenantByIdUseCase.Interface\n ) {}\n\n async execute(tenantId: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n // Authorization checks\n if (!this.identityContext.getPermission(\"tm.tenant\")) {\n return Result.fail(new NotAuthorizedError());\n }\n\n // Get current tenant to verify it exists\n const getTenantResult = await this.tmGetTenantById.execute(tenantId);\n if (getTenantResult.isFail()) {\n return Result.fail(getTenantResult.error);\n }\n\n const tenant = getTenantResult.value;\n\n // Publish before event\n await this.eventPublisher.publish(new TenantBeforeDisableEvent({ tenant }));\n\n // Update api-core tenant first\n const apiCoreResult = await this.coreUpdateTenant.execute(tenantId, {\n status: \"disabled\"\n });\n if (apiCoreResult.isFail()) {\n return Result.fail(\n new TenantPersistenceError(\n new Error(`Failed to update api-core tenant: ${apiCoreResult.error}`)\n )\n );\n }\n\n // Update tenant-manager CMS entry\n const updateResult = await this.tmUpdateTenant.execute(tenantId, {\n status: \"disabled\"\n });\n\n if (updateResult.isFail()) {\n return Result.fail(updateResult.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(\n new TenantAfterDisableEvent({ tenant: updateResult.value })\n );\n\n return Result.ok();\n }\n}\n\nexport default UseCaseAbstraction.createImplementation({\n implementation: DisableTenantUseCase,\n dependencies: [\n IdentityContext,\n EventPublisher,\n ApiCoreUpdateTenant,\n TenantManagerUpdateTenant,\n GetTenantByIdUseCase\n ]\n});\n"],"names":["DisableTenantUseCase","identityContext","eventPublisher","coreUpdateTenant","tmUpdateTenant","tmGetTenantById","tenantId","Result","NotAuthorizedError","getTenantResult","tenant","TenantBeforeDisableEvent","apiCoreResult","TenantPersistenceError","Error","updateResult","TenantAfterDisableEvent","UseCaseAbstraction","IdentityContext","EventPublisher","ApiCoreUpdateTenant","TenantManagerUpdateTenant","GetTenantByIdUseCase"],"mappings":";;;;;;;;;;AAWA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,cAAwC,EACxCC,gBAA+C,EAC/CC,cAAmD,EACnDC,eAA+C,CACzD;aALUJ,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,gBAAgB,GAAhBA;aACAC,cAAc,GAAdA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAM,QAAQC,QAAgB,EAAmD;QAE7E,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,cACpC,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAI3B,MAAMC,kBAAkB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACH;QAC3D,IAAIG,gBAAgB,MAAM,IACtB,OAAOF,OAAO,IAAI,CAACE,gBAAgB,KAAK;QAG5C,MAAMC,SAASD,gBAAgB,KAAK;QAGpC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIE,yBAAyB;YAAED;QAAO;QAGxE,MAAME,gBAAgB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAACN,UAAU;YAChE,QAAQ;QACZ;QACA,IAAIM,cAAc,MAAM,IACpB,OAAOL,OAAO,IAAI,CACd,IAAIM,uBACA,IAAIC,MAAM,CAAC,kCAAkC,EAAEF,cAAc,KAAK,EAAE;QAMhF,MAAMG,eAAe,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACT,UAAU;YAC7D,QAAQ;QACZ;QAEA,IAAIS,aAAa,MAAM,IACnB,OAAOR,OAAO,IAAI,CAACQ,aAAa,KAAK;QAIzC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,wBAAwB;YAAE,QAAQD,aAAa,KAAK;QAAC;QAG7D,OAAOR,OAAO,EAAE;IACpB;AACJ;AAEA,2CAAeU,qBAAAA,oBAAuC,CAAC;IACnD,gBAAgBjB;IAChB,cAAc;QACVkB;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
3
|
+
import { TenantModelNotFoundError, TenantNotFoundError, TenantPersistenceError } from "../../domain/errors.js";
|
|
4
|
+
export interface IDisableTenantUseCase {
|
|
5
|
+
execute(tenantId: string): Promise<Result<void, DisableTenantUseCase.Error>>;
|
|
6
|
+
}
|
|
7
|
+
export interface IDisableTenantUseCaseErrors {
|
|
8
|
+
notAuthorized: NotAuthorizedError;
|
|
9
|
+
notFound: TenantNotFoundError;
|
|
10
|
+
persistence: TenantPersistenceError;
|
|
11
|
+
modelNotFound: TenantModelNotFoundError;
|
|
12
|
+
}
|
|
13
|
+
type UseCaseError = IDisableTenantUseCaseErrors[keyof IDisableTenantUseCaseErrors];
|
|
14
|
+
export declare const DisableTenantUseCase: import("@webiny/di").Abstraction<IDisableTenantUseCase>;
|
|
15
|
+
export declare namespace DisableTenantUseCase {
|
|
16
|
+
type Interface = IDisableTenantUseCase;
|
|
17
|
+
type Error = UseCaseError;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/DisableTenant/abstractions.js","sources":["../../../../src/api/features/DisableTenant/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/errors.js\";\nimport {\n TenantModelNotFoundError,\n TenantNotFoundError,\n TenantPersistenceError\n} from \"../../domain/errors.js\";\n\nexport interface IDisableTenantUseCase {\n execute(tenantId: string): Promise<Result<void, DisableTenantUseCase.Error>>;\n}\n\nexport interface IDisableTenantUseCaseErrors {\n notAuthorized: NotAuthorizedError;\n notFound: TenantNotFoundError;\n persistence: TenantPersistenceError;\n modelNotFound: TenantModelNotFoundError;\n}\n\ntype UseCaseError = IDisableTenantUseCaseErrors[keyof IDisableTenantUseCaseErrors];\n\nexport const DisableTenantUseCase = createAbstraction<IDisableTenantUseCase>(\n \"TenantManager/DisableTenantUseCase\"\n);\n\nexport namespace DisableTenantUseCase {\n export type Interface = IDisableTenantUseCase;\n export type Error = UseCaseError;\n}\n"],"names":["DisableTenantUseCase","createAbstraction"],"mappings":";AAsBO,MAAMA,uBAAuBC,kBAChC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
2
|
+
import type { IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
3
|
+
import type { Tenant } from "../../../shared/Tenant.js";
|
|
4
|
+
export interface TenantBeforeDisablePayload {
|
|
5
|
+
tenant: Tenant;
|
|
6
|
+
}
|
|
7
|
+
export interface TenantAfterDisablePayload {
|
|
8
|
+
tenant: Tenant;
|
|
9
|
+
}
|
|
10
|
+
export declare class TenantBeforeDisableEvent extends DomainEvent<TenantBeforeDisablePayload> {
|
|
11
|
+
eventType: "tenant.beforeDisable";
|
|
12
|
+
getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<TenantBeforeDisableEvent>>;
|
|
13
|
+
}
|
|
14
|
+
export declare const TenantBeforeDisableEventHandler: import("@webiny/di").Abstraction<IEventHandler<TenantBeforeDisableEvent>>;
|
|
15
|
+
export declare namespace TenantBeforeDisableEventHandler {
|
|
16
|
+
type Interface = IEventHandler<TenantBeforeDisableEvent>;
|
|
17
|
+
type Event = TenantBeforeDisableEvent;
|
|
18
|
+
}
|
|
19
|
+
export declare class TenantAfterDisableEvent extends DomainEvent<TenantAfterDisablePayload> {
|
|
20
|
+
eventType: "tenant.afterDisable";
|
|
21
|
+
getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<TenantAfterDisableEvent>>;
|
|
22
|
+
}
|
|
23
|
+
export declare const TenantAfterDisableEventHandler: import("@webiny/di").Abstraction<IEventHandler<TenantAfterDisableEvent>>;
|
|
24
|
+
export declare namespace TenantAfterDisableEventHandler {
|
|
25
|
+
type Interface = IEventHandler<TenantAfterDisableEvent>;
|
|
26
|
+
type Event = TenantAfterDisableEvent;
|
|
27
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
+
import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
3
|
+
class TenantBeforeDisableEvent extends DomainEvent {
|
|
4
|
+
getHandlerAbstraction() {
|
|
5
|
+
return TenantBeforeDisableEventHandler;
|
|
6
|
+
}
|
|
7
|
+
constructor(...args){
|
|
8
|
+
super(...args), this.eventType = "tenant.beforeDisable";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const TenantBeforeDisableEventHandler = createAbstraction("TenantManager/TenantBeforeDisableEventHandler");
|
|
12
|
+
class TenantAfterDisableEvent extends DomainEvent {
|
|
13
|
+
getHandlerAbstraction() {
|
|
14
|
+
return TenantAfterDisableEventHandler;
|
|
15
|
+
}
|
|
16
|
+
constructor(...args){
|
|
17
|
+
super(...args), this.eventType = "tenant.afterDisable";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const TenantAfterDisableEventHandler = createAbstraction("TenantManager/TenantAfterDisableEventHandler");
|
|
21
|
+
export { TenantAfterDisableEvent, TenantAfterDisableEventHandler, TenantBeforeDisableEvent, TenantBeforeDisableEventHandler };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/DisableTenant/events.js","sources":["../../../../src/api/features/DisableTenant/events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { Tenant } from \"~/shared/Tenant.js\";\n\nexport interface TenantBeforeDisablePayload {\n tenant: Tenant;\n}\n\nexport interface TenantAfterDisablePayload {\n tenant: Tenant;\n}\n\nexport class TenantBeforeDisableEvent extends DomainEvent<TenantBeforeDisablePayload> {\n eventType = \"tenant.beforeDisable\" as const;\n\n getHandlerAbstraction() {\n return TenantBeforeDisableEventHandler;\n }\n}\n\nexport const TenantBeforeDisableEventHandler = createAbstraction<\n IEventHandler<TenantBeforeDisableEvent>\n>(\"TenantManager/TenantBeforeDisableEventHandler\");\n\nexport namespace TenantBeforeDisableEventHandler {\n export type Interface = IEventHandler<TenantBeforeDisableEvent>;\n export type Event = TenantBeforeDisableEvent;\n}\n\nexport class TenantAfterDisableEvent extends DomainEvent<TenantAfterDisablePayload> {\n eventType = \"tenant.afterDisable\" as const;\n\n getHandlerAbstraction() {\n return TenantAfterDisableEventHandler;\n }\n}\n\nexport const TenantAfterDisableEventHandler = createAbstraction<\n IEventHandler<TenantAfterDisableEvent>\n>(\"TenantManager/TenantAfterDisableEventHandler\");\n\nexport namespace TenantAfterDisableEventHandler {\n export type Interface = IEventHandler<TenantAfterDisableEvent>;\n export type Event = TenantAfterDisableEvent;\n}\n"],"names":["TenantBeforeDisableEvent","DomainEvent","TenantBeforeDisableEventHandler","createAbstraction","TenantAfterDisableEvent","TenantAfterDisableEventHandler"],"mappings":";;AAaO,MAAMA,iCAAiCC;IAG1C,wBAAwB;QACpB,OAAOC;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAEO,MAAMA,kCAAkCC,kBAE7C;AAOK,MAAMC,gCAAgCH;IAGzC,wBAAwB;QACpB,OAAOI;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAEO,MAAMA,iCAAiCF,kBAE5C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import DisableTenantUseCase from "./DisableTenantUseCase.js";
|
|
3
|
+
const DisableTenantFeature = createFeature({
|
|
4
|
+
name: "DisableTenant",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(DisableTenantUseCase);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { DisableTenantFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/DisableTenant/feature.js","sources":["../../../../src/api/features/DisableTenant/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport DisableTenantUseCase from \"./DisableTenantUseCase.js\";\n\nexport const DisableTenantFeature = createFeature({\n name: \"DisableTenant\",\n register(container) {\n // Register use case (transient scope)\n container.register(DisableTenantUseCase);\n }\n});\n"],"names":["DisableTenantFeature","createFeature","container","DisableTenantUseCase"],"mappings":";;AAGO,MAAMA,uBAAuBC,cAAc;IAC9C,MAAM;IACN,UAASC,SAAS;QAEdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EnableTenantUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
2
|
+
import { Result } from "@webiny/feature/api";
|
|
3
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
4
|
+
import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
5
|
+
import { UpdateTenantUseCase as ApiCoreUpdateTenant } from "@webiny/api-core/features/tenancy/UpdateTenant";
|
|
6
|
+
import { UpdateTenantUseCase as TenantManagerUpdateTenant } from "../UpdateTenant/abstractions.js";
|
|
7
|
+
import { GetTenantByIdUseCase } from "../GetTenantById/abstractions.js";
|
|
8
|
+
declare class EnableTenantUseCase implements UseCaseAbstraction.Interface {
|
|
9
|
+
private identityContext;
|
|
10
|
+
private eventPublisher;
|
|
11
|
+
private coreUpdateTenant;
|
|
12
|
+
private tmUpdateTenant;
|
|
13
|
+
private tmGetTenantById;
|
|
14
|
+
constructor(identityContext: IdentityContext.Interface, eventPublisher: EventPublisher.Interface, coreUpdateTenant: ApiCoreUpdateTenant.Interface, tmUpdateTenant: TenantManagerUpdateTenant.Interface, tmGetTenantById: GetTenantByIdUseCase.Interface);
|
|
15
|
+
execute(tenantId: string): Promise<Result<void, UseCaseAbstraction.Error>>;
|
|
16
|
+
}
|
|
17
|
+
declare const _default: typeof EnableTenantUseCase & {
|
|
18
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IEnableTenantUseCase>;
|
|
19
|
+
};
|
|
20
|
+
export default _default;
|