@webiny/tenant-manager 0.0.0-unstable.61c048f412
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 +12 -0
- package/TenantManager.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenant.d.ts +6 -0
- package/admin/CurrentTenant/CurrentTenant.js +34 -0
- package/admin/CurrentTenant/CurrentTenant.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantGateway.d.ts +12 -0
- package/admin/CurrentTenant/CurrentTenantGateway.js +44 -0
- package/admin/CurrentTenant/CurrentTenantGateway.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.d.ts +12 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.js +30 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantRepository.d.ts +15 -0
- package/admin/CurrentTenant/CurrentTenantRepository.js +37 -0
- package/admin/CurrentTenant/CurrentTenantRepository.js.map +1 -0
- package/admin/CurrentTenant/abstractions.d.ts +31 -0
- package/admin/CurrentTenant/abstractions.js +15 -0
- package/admin/CurrentTenant/abstractions.js.map +1 -0
- package/admin/CurrentTenant/feature.d.ts +3 -0
- package/admin/CurrentTenant/feature.js +20 -0
- package/admin/CurrentTenant/feature.js.map +1 -0
- package/admin/CurrentTenant/useCurrentTenant.d.ts +4 -0
- package/admin/CurrentTenant/useCurrentTenant.js +23 -0
- package/admin/CurrentTenant/useCurrentTenant.js.map +1 -0
- package/admin/CurrentTenantProvider.d.ts +2 -0
- package/admin/CurrentTenantProvider.js +12 -0
- package/admin/CurrentTenantProvider.js.map +1 -0
- package/admin/DisableTenant/DisableTenantGateway.d.ts +11 -0
- package/admin/DisableTenant/DisableTenantGateway.js +43 -0
- package/admin/DisableTenant/DisableTenantGateway.js.map +1 -0
- package/admin/DisableTenant/DisableTenantRepository.d.ts +10 -0
- package/admin/DisableTenant/DisableTenantRepository.js +15 -0
- package/admin/DisableTenant/DisableTenantRepository.js.map +1 -0
- package/admin/DisableTenant/DisableTenantUseCase.d.ts +10 -0
- package/admin/DisableTenant/DisableTenantUseCase.js +15 -0
- package/admin/DisableTenant/DisableTenantUseCase.js.map +1 -0
- package/admin/DisableTenant/abstractions.d.ts +21 -0
- package/admin/DisableTenant/abstractions.js +15 -0
- package/admin/DisableTenant/abstractions.js.map +1 -0
- package/admin/DisableTenant/feature.d.ts +3 -0
- package/admin/DisableTenant/feature.js +20 -0
- package/admin/DisableTenant/feature.js.map +1 -0
- package/admin/DisableTenant/index.d.ts +2 -0
- package/admin/DisableTenant/index.js +4 -0
- package/admin/DisableTenant/index.js.map +1 -0
- package/admin/DisableTenant/useDisableTenant.d.ts +4 -0
- package/admin/DisableTenant/useDisableTenant.js +27 -0
- package/admin/DisableTenant/useDisableTenant.js.map +1 -0
- package/admin/EnableTenant/EnableTenantGateway.d.ts +11 -0
- package/admin/EnableTenant/EnableTenantGateway.js +43 -0
- package/admin/EnableTenant/EnableTenantGateway.js.map +1 -0
- package/admin/EnableTenant/EnableTenantRepository.d.ts +10 -0
- package/admin/EnableTenant/EnableTenantRepository.js +15 -0
- package/admin/EnableTenant/EnableTenantRepository.js.map +1 -0
- package/admin/EnableTenant/EnableTenantUseCase.d.ts +10 -0
- package/admin/EnableTenant/EnableTenantUseCase.js +15 -0
- package/admin/EnableTenant/EnableTenantUseCase.js.map +1 -0
- package/admin/EnableTenant/abstractions.d.ts +21 -0
- package/admin/EnableTenant/abstractions.js +15 -0
- package/admin/EnableTenant/abstractions.js.map +1 -0
- package/admin/EnableTenant/feature.d.ts +3 -0
- package/admin/EnableTenant/feature.js +20 -0
- package/admin/EnableTenant/feature.js.map +1 -0
- package/admin/EnableTenant/index.d.ts +2 -0
- package/admin/EnableTenant/index.js +4 -0
- package/admin/EnableTenant/index.js.map +1 -0
- package/admin/EnableTenant/useEnableTenant.d.ts +4 -0
- package/admin/EnableTenant/useEnableTenant.js +23 -0
- package/admin/EnableTenant/useEnableTenant.js.map +1 -0
- package/admin/Extension.d.ts +2 -0
- package/admin/Extension.js +47 -0
- package/admin/Extension.js.map +1 -0
- package/admin/IsRootTenant.d.ts +13 -0
- package/admin/IsRootTenant.js +37 -0
- package/admin/IsRootTenant.js.map +1 -0
- package/admin/Permissions/LegacyPermissionRenderer.d.ts +1 -0
- package/admin/Permissions/LegacyPermissionRenderer.js +29 -0
- package/admin/Permissions/LegacyPermissionRenderer.js.map +1 -0
- package/admin/Permissions/TenantManagerPermissions.d.ts +11 -0
- package/admin/Permissions/TenantManagerPermissions.js +75 -0
- package/admin/Permissions/TenantManagerPermissions.js.map +1 -0
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.d.ts +8 -0
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js +42 -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 +19 -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 +39 -0
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js.map +1 -0
- package/admin/TenantEntryList/FolderNameCell.d.ts +7 -0
- package/admin/TenantEntryList/FolderNameCell.js +29 -0
- package/admin/TenantEntryList/FolderNameCell.js.map +1 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.d.ts +7 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js +19 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js.map +1 -0
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.d.ts +16 -0
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js +17 -0
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js.map +1 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.d.ts +5 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js +46 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js.map +1 -0
- package/admin/TenantEntryList/ManageTenant.d.ts +7 -0
- package/admin/TenantEntryList/ManageTenant.js +21 -0
- package/admin/TenantEntryList/ManageTenant.js.map +1 -0
- package/admin/TenantEntryList/TenantCell.d.ts +2 -0
- package/admin/TenantEntryList/TenantCell.js +39 -0
- package/admin/TenantEntryList/TenantCell.js.map +1 -0
- package/admin/TenantEntryList/TenantNameCell.d.ts +2 -0
- package/admin/TenantEntryList/TenantNameCell.js +54 -0
- package/admin/TenantEntryList/TenantNameCell.js.map +1 -0
- package/admin/TenantEntryList.d.ts +2 -0
- package/admin/TenantEntryList.js +71 -0
- package/admin/TenantEntryList.js.map +1 -0
- package/admin/TenantSelector.d.ts +2 -0
- package/admin/TenantSelector.js +22 -0
- package/admin/TenantSelector.js.map +1 -0
- package/admin/types.d.ts +7 -0
- package/admin/types.js +3 -0
- package/admin/types.js.map +1 -0
- package/api/Extension.d.ts +1 -0
- package/api/Extension.js +42 -0
- package/api/Extension.js.map +1 -0
- package/api/domain/TenantId.d.ts +3 -0
- package/api/domain/TenantId.js +12 -0
- package/api/domain/TenantId.js.map +1 -0
- package/api/domain/TenantModel.d.ts +11 -0
- package/api/domain/TenantModel.js +46 -0
- package/api/domain/TenantModel.js.map +1 -0
- package/api/domain/TenantModelExtension.d.ts +10 -0
- package/api/domain/TenantModelExtension.js +4 -0
- package/api/domain/TenantModelExtension.js.map +1 -0
- package/api/domain/errors.d.ts +33 -0
- package/api/domain/errors.js +63 -0
- package/api/domain/errors.js.map +1 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.d.ts +8 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.js +34 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.js.map +1 -0
- package/api/features/AddCmsPermissions/feature.d.ts +1 -0
- package/api/features/AddCmsPermissions/feature.js +10 -0
- package/api/features/AddCmsPermissions/feature.js.map +1 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.d.ts +22 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js +90 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js.map +1 -0
- package/api/features/CreateAndInstallTenant/abstractions.d.ts +24 -0
- package/api/features/CreateAndInstallTenant/abstractions.js +9 -0
- package/api/features/CreateAndInstallTenant/abstractions.js.map +1 -0
- package/api/features/CreateAndInstallTenant/feature.d.ts +1 -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 +48 -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 +44 -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 +11 -0
- package/api/features/CreateTenant/abstractions.js.map +1 -0
- package/api/features/CreateTenant/feature.d.ts +1 -0
- package/api/features/CreateTenant/feature.js +15 -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 +37 -0
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js.map +1 -0
- package/api/features/DeleteTenantOnEntryDelete/feature.d.ts +1 -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 +66 -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 +4 -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 +18 -0
- package/api/features/DisableTenant/events.js.map +1 -0
- package/api/features/DisableTenant/feature.d.ts +1 -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 +68 -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 +4 -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 +18 -0
- package/api/features/EnableTenant/events.js.map +1 -0
- package/api/features/EnableTenant/feature.d.ts +1 -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 +29 -0
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js.map +1 -0
- package/api/features/GetCurrentTenant/abstractions.d.ts +22 -0
- package/api/features/GetCurrentTenant/abstractions.js +10 -0
- package/api/features/GetCurrentTenant/abstractions.js.map +1 -0
- package/api/features/GetCurrentTenant/feature.d.ts +1 -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 +49 -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 +27 -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 +15 -0
- package/api/features/GetTenantById/abstractions.js.map +1 -0
- package/api/features/GetTenantById/feature.d.ts +1 -0
- package/api/features/GetTenantById/feature.js +15 -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 +58 -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 +15 -0
- package/api/features/UpdateTenant/abstractions.js.map +1 -0
- package/api/features/UpdateTenant/feature.d.ts +1 -0
- package/api/features/UpdateTenant/feature.js +15 -0
- package/api/features/UpdateTenant/feature.js.map +1 -0
- package/api/graphql/CreateTenantSchema.d.ts +14 -0
- package/api/graphql/CreateTenantSchema.js +77 -0
- package/api/graphql/CreateTenantSchema.js.map +1 -0
- package/api/graphql/DisableTenantSchema.d.ts +8 -0
- package/api/graphql/DisableTenantSchema.js +35 -0
- package/api/graphql/DisableTenantSchema.js.map +1 -0
- package/api/graphql/EnableTenantSchema.d.ts +8 -0
- package/api/graphql/EnableTenantSchema.js +35 -0
- package/api/graphql/EnableTenantSchema.js.map +1 -0
- package/api/graphql/GetCurrentTenantSchema.d.ts +8 -0
- package/api/graphql/GetCurrentTenantSchema.js +59 -0
- package/api/graphql/GetCurrentTenantSchema.js.map +1 -0
- package/api/graphql/InstallTenantSchema.d.ts +8 -0
- package/api/graphql/InstallTenantSchema.js +54 -0
- package/api/graphql/InstallTenantSchema.js.map +1 -0
- package/exports/api/tenant-manager.d.ts +2 -0
- package/exports/api/tenant-manager.js +3 -0
- package/exports/api/tenant-manager.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +3 -0
- package/index.js.map +1 -0
- package/package.json +46 -0
- package/shared/Tenant.d.ts +21 -0
- package/shared/Tenant.js +26 -0
- package/shared/Tenant.js.map +1 -0
- package/shared/constants.d.ts +1 -0
- package/shared/constants.js +3 -0
- package/shared/constants.js.map +1 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { TenantCreationError, TenantModelNotFoundError } from "../../domain/errors.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
|
+
import { TENANT_MODEL_ID } from "../../../shared/constants.js";
|
|
7
|
+
class CreateTenantRepository {
|
|
8
|
+
constructor(getModelUseCase, createEntryUseCase) {
|
|
9
|
+
this.getModelUseCase = getModelUseCase;
|
|
10
|
+
this.createEntryUseCase = createEntryUseCase;
|
|
11
|
+
}
|
|
12
|
+
async execute(tenant) {
|
|
13
|
+
try {
|
|
14
|
+
// Get the tenant model
|
|
15
|
+
const modelResult = await this.getModelUseCase.execute(TENANT_MODEL_ID);
|
|
16
|
+
if (modelResult.isFail()) {
|
|
17
|
+
return Result.fail(new TenantModelNotFoundError());
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Prepare tenant values with default isInstalled: false
|
|
21
|
+
const tenantValues = {
|
|
22
|
+
name: tenant.values.name,
|
|
23
|
+
status: tenant.values.status,
|
|
24
|
+
description: tenant.values.description,
|
|
25
|
+
isInstalled: false,
|
|
26
|
+
extensions: tenant.values.extensions || {}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// Create the tenant entry
|
|
30
|
+
const createResult = await this.createEntryUseCase.execute(modelResult.value, {
|
|
31
|
+
id: tenant.id,
|
|
32
|
+
values: tenantValues
|
|
33
|
+
});
|
|
34
|
+
if (createResult.isFail()) {
|
|
35
|
+
return Result.fail(new TenantCreationError(createResult.error));
|
|
36
|
+
}
|
|
37
|
+
return Result.ok(tenant);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
return Result.fail(new TenantCreationError(error));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export default RepositoryAbstraction.createImplementation({
|
|
44
|
+
implementation: CreateTenantRepository,
|
|
45
|
+
dependencies: [GetModelUseCase, CreateEntryUseCase]
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=CreateTenantRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TenantCreationError","TenantModelNotFoundError","CreateTenantRepository","RepositoryAbstraction","Result","CreateEntryUseCase","GetModelUseCase","TENANT_MODEL_ID","constructor","getModelUseCase","createEntryUseCase","execute","tenant","modelResult","isFail","fail","tenantValues","name","values","status","description","isInstalled","extensions","createResult","value","id","error","ok","createImplementation","implementation","dependencies"],"sources":["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"],"mappings":"AACA,SAASA,mBAAmB,EAAEC,wBAAwB;AACtD,SAASC,sBAAsB,IAAIC,qBAAqB;AACxD,SAASC,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,kBAAkB,QAAQ,mDAAmD;AACtF,SAASC,eAAe,QAAQ,gDAAgD;AAChF,SAASC,eAAe;AAExB,MAAML,sBAAsB,CAA4C;EACpEM,WAAWA,CACCC,eAA0C,EAC1CC,kBAAgD,EAC1D;IAAA,KAFUD,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,kBAAgD,GAAhDA,kBAAgD;EACzD;EAEH,MAAMC,OAAOA,CAACC,MAAc,EAAwD;IAChF,IAAI;MACA;MACA,MAAMC,WAAW,GAAG,MAAM,IAAI,CAACJ,eAAe,CAACE,OAAO,CAACJ,eAAe,CAAC;MACvE,IAAIM,WAAW,CAACC,MAAM,CAAC,CAAC,EAAE;QACtB,OAAOV,MAAM,CAACW,IAAI,CAAC,IAAId,wBAAwB,CAAC,CAAC,CAAC;MACtD;;MAEA;MACA,MAAMe,YAA0B,GAAG;QAC/BC,IAAI,EAAEL,MAAM,CAACM,MAAM,CAACD,IAAI;QACxBE,MAAM,EAAEP,MAAM,CAACM,MAAM,CAACC,MAAM;QAC5BC,WAAW,EAAER,MAAM,CAACM,MAAM,CAACE,WAAW;QACtCC,WAAW,EAAE,KAAK;QAClBC,UAAU,EAAEV,MAAM,CAACM,MAAM,CAACI,UAAU,IAAI,CAAC;MAC7C,CAAC;;MAED;MACA,MAAMC,YAAY,GAAG,MAAM,IAAI,CAACb,kBAAkB,CAACC,OAAO,CAACE,WAAW,CAACW,KAAK,EAAE;QAC1EC,EAAE,EAAEb,MAAM,CAACa,EAAE;QACbP,MAAM,EAAEF;MACZ,CAAC,CAAC;MAEF,IAAIO,YAAY,CAACT,MAAM,CAAC,CAAC,EAAE;QACvB,OAAOV,MAAM,CAACW,IAAI,CAAC,IAAIf,mBAAmB,CAACuB,YAAY,CAACG,KAAK,CAAC,CAAC;MACnE;MAEA,OAAOtB,MAAM,CAACuB,EAAE,CAACf,MAAM,CAAC;IAC5B,CAAC,CAAC,OAAOc,KAAK,EAAE;MACZ,OAAOtB,MAAM,CAACW,IAAI,CAAC,IAAIf,mBAAmB,CAAC0B,KAAc,CAAC,CAAC;IAC/D;EACJ;AACJ;AAEA,eAAevB,qBAAqB,CAACyB,oBAAoB,CAAC;EACtDC,cAAc,EAAE3B,sBAAsB;EACtC4B,YAAY,EAAE,CAACxB,eAAe,EAAED,kBAAkB;AACtD,CAAC,CAAC","ignoreList":[]}
|
|
@@ -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,44 @@
|
|
|
1
|
+
import { CreateTenantUseCase as UseCaseAbstraction, CreateTenantRepository } 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 {
|
|
8
|
+
constructor(identityContext, repository) {
|
|
9
|
+
this.identityContext = identityContext;
|
|
10
|
+
this.repository = repository;
|
|
11
|
+
}
|
|
12
|
+
async execute(input) {
|
|
13
|
+
// Authorization checks
|
|
14
|
+
const identity = this.identityContext.getIdentity();
|
|
15
|
+
if (!identity.isAdmin() || !this.identityContext.getPermission("tm.tenant")) {
|
|
16
|
+
return Result.fail(new NotAuthorizedError({
|
|
17
|
+
message: "Not authorized to create tenants!"
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
const tenant = Tenant.from({
|
|
21
|
+
id: TenantId.from(input.id),
|
|
22
|
+
values: {
|
|
23
|
+
name: input.name,
|
|
24
|
+
description: input.description || "(no description)",
|
|
25
|
+
extensions: input.extensions ?? {},
|
|
26
|
+
status: "disabled",
|
|
27
|
+
isInstalled: false
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Create the tenant
|
|
32
|
+
const result = await this.repository.execute(tenant);
|
|
33
|
+
if (result.isFail()) {
|
|
34
|
+
return Result.fail(result.error);
|
|
35
|
+
}
|
|
36
|
+
return Result.ok(result.value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export default UseCaseAbstraction.createImplementation({
|
|
40
|
+
implementation: CreateTenantUseCase,
|
|
41
|
+
dependencies: [IdentityContext, CreateTenantRepository]
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=CreateTenantUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CreateTenantUseCase","UseCaseAbstraction","CreateTenantRepository","Result","IdentityContext","NotAuthorizedError","Tenant","TenantId","constructor","identityContext","repository","execute","input","identity","getIdentity","isAdmin","getPermission","fail","message","tenant","from","id","values","name","description","extensions","status","isInstalled","result","isFail","error","ok","value","createImplementation","implementation","dependencies"],"sources":["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 const identity = this.identityContext.getIdentity();\n if (!identity.isAdmin() || !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"],"mappings":"AAAA,SACIA,mBAAmB,IAAIC,kBAAkB,EAEzCC,sBAAsB;AAE1B,SAASC,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,eAAe,QAAQ,0CAA0C;AAC1E,SAASC,kBAAkB,QAAQ,qDAAqD;AACxF,SAASC,MAAM;AACf,SAASC,QAAQ;AAEjB,MAAMP,mBAAmB,CAAyC;EAC9DQ,WAAWA,CACCC,eAA0C,EAC1CC,UAA4C,EACtD;IAAA,KAFUD,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,UAA4C,GAA5CA,UAA4C;EACrD;EAEH,MAAMC,OAAOA,CAACC,KAAyB,EAAqD;IACxF;IACA,MAAMC,QAAQ,GAAG,IAAI,CAACJ,eAAe,CAACK,WAAW,CAAC,CAAC;IACnD,IAAI,CAACD,QAAQ,CAACE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAACN,eAAe,CAACO,aAAa,CAAC,WAAW,CAAC,EAAE;MACzE,OAAOb,MAAM,CAACc,IAAI,CACd,IAAIZ,kBAAkB,CAAC;QACnBa,OAAO,EAAE;MACb,CAAC,CACL,CAAC;IACL;IAEA,MAAMC,MAAM,GAAGb,MAAM,CAACc,IAAI,CAAC;MACvBC,EAAE,EAAEd,QAAQ,CAACa,IAAI,CAACR,KAAK,CAACS,EAAE,CAAC;MAC3BC,MAAM,EAAE;QACJC,IAAI,EAAEX,KAAK,CAACW,IAAI;QAChBC,WAAW,EAAEZ,KAAK,CAACY,WAAW,IAAI,kBAAkB;QACpDC,UAAU,EAAEb,KAAK,CAACa,UAAU,IAAI,CAAC,CAAC;QAClCC,MAAM,EAAE,UAAU;QAClBC,WAAW,EAAE;MACjB;IACJ,CAAC,CAAC;;IAEF;IACA,MAAMC,MAAM,GAAG,MAAM,IAAI,CAAClB,UAAU,CAACC,OAAO,CAACQ,MAAM,CAAC;IACpD,IAAIS,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAO1B,MAAM,CAACc,IAAI,CAACW,MAAM,CAACE,KAAK,CAAC;IACpC;IAEA,OAAO3B,MAAM,CAAC4B,EAAE,CAACH,MAAM,CAACI,KAAK,CAAC;EAClC;AACJ;AAEA,eAAe/B,kBAAkB,CAACgC,oBAAoB,CAAC;EACnDC,cAAc,EAAElC,mBAAmB;EACnCmC,YAAY,EAAE,CAAC/B,eAAe,EAAEF,sBAAsB;AAC1D,CAAC,CAAC","ignoreList":[]}
|
|
@@ -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,11 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
+
|
|
3
|
+
// USE CASE
|
|
4
|
+
|
|
5
|
+
export const CreateTenantUseCase = createAbstraction("TenantManager/CreateTenantUseCase");
|
|
6
|
+
|
|
7
|
+
// REPOSITORY
|
|
8
|
+
|
|
9
|
+
export const CreateTenantRepository = createAbstraction("TenantManager/CreateTenantRepository");
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createAbstraction","CreateTenantUseCase","CreateTenantRepository"],"sources":["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"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAUvD;;AAuBA,OAAO,MAAMC,mBAAmB,GAAGD,iBAAiB,CAChD,mCACJ,CAAC;;AAQD;;AAcA,OAAO,MAAME,sBAAsB,GAAGF,iBAAiB,CACnD,sCACJ,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CreateTenantFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import CreateTenantUseCase from "./CreateTenantUseCase.js";
|
|
3
|
+
import CreateTenantRepository from "./CreateTenantRepository.js";
|
|
4
|
+
export const CreateTenantFeature = createFeature({
|
|
5
|
+
name: "CreateTenant",
|
|
6
|
+
register(container) {
|
|
7
|
+
// Register use case (transient scope)
|
|
8
|
+
container.register(CreateTenantUseCase);
|
|
9
|
+
|
|
10
|
+
// Register repository (singleton scope)
|
|
11
|
+
container.register(CreateTenantRepository).inSingletonScope();
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createFeature","CreateTenantUseCase","CreateTenantRepository","CreateTenantFeature","name","register","container","inSingletonScope"],"sources":["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"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,OAAOC,mBAAmB;AAC1B,OAAOC,sBAAsB;AAE7B,OAAO,MAAMC,mBAAmB,GAAGH,aAAa,CAAC;EAC7CI,IAAI,EAAE,cAAc;EACpBC,QAAQA,CAACC,SAAS,EAAE;IAChB;IACAA,SAAS,CAACD,QAAQ,CAACJ,mBAAmB,CAAC;;IAEvC;IACAK,SAAS,CAACD,QAAQ,CAACH,sBAAsB,CAAC,CAACK,gBAAgB,CAAC,CAAC;EACjE;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -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,37 @@
|
|
|
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 {
|
|
10
|
+
entry,
|
|
11
|
+
model
|
|
12
|
+
} = event.payload;
|
|
13
|
+
|
|
14
|
+
// Only handle tenant model deletions
|
|
15
|
+
if (model.modelId !== TENANT_MODEL_ID) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Only handle permanent deletions
|
|
20
|
+
if (!event.payload.permanent) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
// Delete the tenant from api-core
|
|
25
|
+
await this.deleteTenant.execute(entry.entryId);
|
|
26
|
+
} catch (error) {
|
|
27
|
+
// Log error but don't throw - we don't want to prevent CMS deletion
|
|
28
|
+
console.error(`Failed to delete tenant ${entry.entryId}!`, error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export default EntryAfterDeleteEventHandler.createImplementation({
|
|
33
|
+
implementation: DeleteTenantOnEntryDeleteHandler,
|
|
34
|
+
dependencies: [DeleteTenantUseCase]
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=DeleteTenantOnEntryDeleteHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EntryAfterDeleteEventHandler","DeleteTenantUseCase","TENANT_MODEL_ID","DeleteTenantOnEntryDeleteHandler","constructor","deleteTenant","handle","event","entry","model","payload","modelId","permanent","execute","entryId","error","console","createImplementation","implementation","dependencies"],"sources":["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"],"mappings":"AAAA,SAASA,4BAA4B,QAAQ,sEAAsE;AACnH,SAASC,mBAAmB,QAAQ,gDAAgD;AACpF,SAASC,eAAe;AAExB,MAAMC,gCAAgC,CAAmD;EACrFC,WAAWA,CAASC,YAA2C,EAAE;IAAA,KAA7CA,YAA2C,GAA3CA,YAA2C;EAAG;EAElE,MAAMC,MAAMA,CAACC,KAAyC,EAAiB;IACnE,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAGF,KAAK,CAACG,OAAO;;IAEtC;IACA,IAAID,KAAK,CAACE,OAAO,KAAKT,eAAe,EAAE;MACnC;IACJ;;IAEA;IACA,IAAI,CAACK,KAAK,CAACG,OAAO,CAACE,SAAS,EAAE;MAC1B;IACJ;IAEA,IAAI;MACA;MACA,MAAM,IAAI,CAACP,YAAY,CAACQ,OAAO,CAACL,KAAK,CAACM,OAAO,CAAC;IAClD,CAAC,CAAC,OAAOC,KAAK,EAAE;MACZ;MACAC,OAAO,CAACD,KAAK,CAAC,2BAA2BP,KAAK,CAACM,OAAO,GAAG,EAAEC,KAAK,CAAC;IACrE;EACJ;AACJ;AAEA,eAAef,4BAA4B,CAACiB,oBAAoB,CAAC;EAC7DC,cAAc,EAAEf,gCAAgC;EAChDgB,YAAY,EAAE,CAAClB,mBAAmB;AACtC,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DeleteTenantOnEntryDeleteFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import DeleteTenantOnEntryDeleteHandler from "./DeleteTenantOnEntryDeleteHandler.js";
|
|
3
|
+
export const DeleteTenantOnEntryDeleteFeature = createFeature({
|
|
4
|
+
name: "DeleteTenantOnEntryDelete",
|
|
5
|
+
register(container) {
|
|
6
|
+
// Register the event handler
|
|
7
|
+
container.register(DeleteTenantOnEntryDeleteHandler);
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createFeature","DeleteTenantOnEntryDeleteHandler","DeleteTenantOnEntryDeleteFeature","name","register","container"],"sources":["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"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,OAAOC,gCAAgC;AAEvC,OAAO,MAAMC,gCAAgC,GAAGF,aAAa,CAAC;EAC1DG,IAAI,EAAE,2BAA2B;EACjCC,QAAQA,CAACC,SAAS,EAAE;IAChB;IACAA,SAAS,CAACD,QAAQ,CAACH,gCAAgC,CAAC;EACxD;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -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";
|
|
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,66 @@
|
|
|
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";
|
|
5
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
6
|
+
import { UpdateTenantUseCase as ApiCoreUpdateTenant } from "@webiny/api-core/features/tenancy/UpdateTenant";
|
|
7
|
+
import { UpdateTenantUseCase as TenantManagerUpdateTenant } from "../UpdateTenant/abstractions.js";
|
|
8
|
+
import { GetTenantByIdUseCase } from "../GetTenantById/abstractions.js";
|
|
9
|
+
import { TenantBeforeDisableEvent, TenantAfterDisableEvent } from "./events.js";
|
|
10
|
+
import { TenantPersistenceError } from "../../domain/errors.js";
|
|
11
|
+
class 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
|
+
// Authorization checks
|
|
21
|
+
const identity = this.identityContext.getIdentity();
|
|
22
|
+
if (!identity.isAdmin() || !this.identityContext.getPermission("tm.tenant")) {
|
|
23
|
+
return Result.fail(new NotAuthorizedError());
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Get current tenant to verify it exists
|
|
27
|
+
const getTenantResult = await this.tmGetTenantById.execute(tenantId);
|
|
28
|
+
if (getTenantResult.isFail()) {
|
|
29
|
+
return Result.fail(getTenantResult.error);
|
|
30
|
+
}
|
|
31
|
+
const tenant = getTenantResult.value;
|
|
32
|
+
|
|
33
|
+
// Publish before event
|
|
34
|
+
await this.eventPublisher.publish(new TenantBeforeDisableEvent({
|
|
35
|
+
tenant
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
// Update api-core tenant first
|
|
39
|
+
const apiCoreResult = await this.coreUpdateTenant.execute(tenantId, {
|
|
40
|
+
status: "disabled"
|
|
41
|
+
});
|
|
42
|
+
if (apiCoreResult.isFail()) {
|
|
43
|
+
return Result.fail(new TenantPersistenceError(new Error(`Failed to update api-core tenant: ${apiCoreResult.error}`)));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Update tenant-manager CMS entry
|
|
47
|
+
const updateResult = await this.tmUpdateTenant.execute(tenantId, {
|
|
48
|
+
status: "disabled"
|
|
49
|
+
});
|
|
50
|
+
if (updateResult.isFail()) {
|
|
51
|
+
return Result.fail(updateResult.error);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Publish after event
|
|
55
|
+
await this.eventPublisher.publish(new TenantAfterDisableEvent({
|
|
56
|
+
tenant: updateResult.value
|
|
57
|
+
}));
|
|
58
|
+
return Result.ok();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export default UseCaseAbstraction.createImplementation({
|
|
62
|
+
implementation: DisableTenantUseCase,
|
|
63
|
+
dependencies: [IdentityContext, EventPublisher, ApiCoreUpdateTenant, TenantManagerUpdateTenant, GetTenantByIdUseCase]
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=DisableTenantUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DisableTenantUseCase","UseCaseAbstraction","Result","IdentityContext","EventPublisher","NotAuthorizedError","UpdateTenantUseCase","ApiCoreUpdateTenant","TenantManagerUpdateTenant","GetTenantByIdUseCase","TenantBeforeDisableEvent","TenantAfterDisableEvent","TenantPersistenceError","constructor","identityContext","eventPublisher","coreUpdateTenant","tmUpdateTenant","tmGetTenantById","execute","tenantId","identity","getIdentity","isAdmin","getPermission","fail","getTenantResult","isFail","error","tenant","value","publish","apiCoreResult","status","Error","updateResult","ok","createImplementation","implementation","dependencies"],"sources":["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\";\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 const identity = this.identityContext.getIdentity();\n if (!identity.isAdmin() || !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"],"mappings":"AAAA,SAASA,oBAAoB,IAAIC,kBAAkB;AACnD,SAASC,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,eAAe,QAAQ,0CAA0C;AAC1E,SAASC,cAAc,QAAQ,0CAA0C;AACzE,SAASC,kBAAkB,QAAQ,qDAAqD;AACxF,SAASC,mBAAmB,IAAIC,mBAAmB,QAAQ,gDAAgD;AAC3G,SAASD,mBAAmB,IAAIE,yBAAyB;AACzD,SAASC,oBAAoB;AAC7B,SAASC,wBAAwB,EAAEC,uBAAuB;AAC1D,SAASC,sBAAsB;AAE/B,MAAMZ,oBAAoB,CAAyC;EAC/Da,WAAWA,CACCC,eAA0C,EAC1CC,cAAwC,EACxCC,gBAA+C,EAC/CC,cAAmD,EACnDC,eAA+C,EACzD;IAAA,KALUJ,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,cAAwC,GAAxCA,cAAwC;IAAA,KACxCC,gBAA+C,GAA/CA,gBAA+C;IAAA,KAC/CC,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,eAA+C,GAA/CA,eAA+C;EACxD;EAEH,MAAMC,OAAOA,CAACC,QAAgB,EAAmD;IAC7E;IACA,MAAMC,QAAQ,GAAG,IAAI,CAACP,eAAe,CAACQ,WAAW,CAAC,CAAC;IACnD,IAAI,CAACD,QAAQ,CAACE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAACT,eAAe,CAACU,aAAa,CAAC,WAAW,CAAC,EAAE;MACzE,OAAOtB,MAAM,CAACuB,IAAI,CAAC,IAAIpB,kBAAkB,CAAC,CAAC,CAAC;IAChD;;IAEA;IACA,MAAMqB,eAAe,GAAG,MAAM,IAAI,CAACR,eAAe,CAACC,OAAO,CAACC,QAAQ,CAAC;IACpE,IAAIM,eAAe,CAACC,MAAM,CAAC,CAAC,EAAE;MAC1B,OAAOzB,MAAM,CAACuB,IAAI,CAACC,eAAe,CAACE,KAAK,CAAC;IAC7C;IAEA,MAAMC,MAAM,GAAGH,eAAe,CAACI,KAAK;;IAEpC;IACA,MAAM,IAAI,CAACf,cAAc,CAACgB,OAAO,CAAC,IAAIrB,wBAAwB,CAAC;MAAEmB;IAAO,CAAC,CAAC,CAAC;;IAE3E;IACA,MAAMG,aAAa,GAAG,MAAM,IAAI,CAAChB,gBAAgB,CAACG,OAAO,CAACC,QAAQ,EAAE;MAChEa,MAAM,EAAE;IACZ,CAAC,CAAC;IACF,IAAID,aAAa,CAACL,MAAM,CAAC,CAAC,EAAE;MACxB,OAAOzB,MAAM,CAACuB,IAAI,CACd,IAAIb,sBAAsB,CACtB,IAAIsB,KAAK,CAAC,qCAAqCF,aAAa,CAACJ,KAAK,EAAE,CACxE,CACJ,CAAC;IACL;;IAEA;IACA,MAAMO,YAAY,GAAG,MAAM,IAAI,CAAClB,cAAc,CAACE,OAAO,CAACC,QAAQ,EAAE;MAC7Da,MAAM,EAAE;IACZ,CAAC,CAAC;IAEF,IAAIE,YAAY,CAACR,MAAM,CAAC,CAAC,EAAE;MACvB,OAAOzB,MAAM,CAACuB,IAAI,CAACU,YAAY,CAACP,KAAK,CAAC;IAC1C;;IAEA;IACA,MAAM,IAAI,CAACb,cAAc,CAACgB,OAAO,CAC7B,IAAIpB,uBAAuB,CAAC;MAAEkB,MAAM,EAAEM,YAAY,CAACL;IAAM,CAAC,CAC9D,CAAC;IAED,OAAO5B,MAAM,CAACkC,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,eAAenC,kBAAkB,CAACoC,oBAAoB,CAAC;EACnDC,cAAc,EAAEtC,oBAAoB;EACpCuC,YAAY,EAAE,CACVpC,eAAe,EACfC,cAAc,EACdG,mBAAmB,EACnBC,yBAAyB,EACzBC,oBAAoB;AAE5B,CAAC,CAAC","ignoreList":[]}
|
|
@@ -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,"names":["createAbstraction","DisableTenantUseCase"],"sources":["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"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAsBvD,OAAO,MAAMC,oBAAoB,GAAGD,iBAAiB,CACjD,oCACJ,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
|
|
2
|
+
import type { IEventHandler } from "@webiny/api-core/features/EventPublisher";
|
|
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,18 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
+
import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
|
|
3
|
+
export class TenantBeforeDisableEvent extends DomainEvent {
|
|
4
|
+
eventType = "tenant.beforeDisable";
|
|
5
|
+
getHandlerAbstraction() {
|
|
6
|
+
return TenantBeforeDisableEventHandler;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export const TenantBeforeDisableEventHandler = createAbstraction("TenantManager/TenantBeforeDisableEventHandler");
|
|
10
|
+
export class TenantAfterDisableEvent extends DomainEvent {
|
|
11
|
+
eventType = "tenant.afterDisable";
|
|
12
|
+
getHandlerAbstraction() {
|
|
13
|
+
return TenantAfterDisableEventHandler;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export const TenantAfterDisableEventHandler = createAbstraction("TenantManager/TenantAfterDisableEventHandler");
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createAbstraction","DomainEvent","TenantBeforeDisableEvent","eventType","getHandlerAbstraction","TenantBeforeDisableEventHandler","TenantAfterDisableEvent","TenantAfterDisableEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\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"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AACvD,SAASC,WAAW,QAAQ,0CAA0C;AAYtE,OAAO,MAAMC,wBAAwB,SAASD,WAAW,CAA6B;EAClFE,SAAS,GAAG,sBAAsB;EAElCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,+BAA+B;EAC1C;AACJ;AAEA,OAAO,MAAMA,+BAA+B,GAAGL,iBAAiB,CAE9D,+CAA+C,CAAC;AAOlD,OAAO,MAAMM,uBAAuB,SAASL,WAAW,CAA4B;EAChFE,SAAS,GAAG,qBAAqB;EAEjCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,8BAA8B;EACzC;AACJ;AAEA,OAAO,MAAMA,8BAA8B,GAAGP,iBAAiB,CAE7D,8CAA8C,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DisableTenantFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import DisableTenantUseCase from "./DisableTenantUseCase.js";
|
|
3
|
+
export const DisableTenantFeature = createFeature({
|
|
4
|
+
name: "DisableTenant",
|
|
5
|
+
register(container) {
|
|
6
|
+
// Register use case (transient scope)
|
|
7
|
+
container.register(DisableTenantUseCase);
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createFeature","DisableTenantUseCase","DisableTenantFeature","name","register","container"],"sources":["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"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,OAAOC,oBAAoB;AAE3B,OAAO,MAAMC,oBAAoB,GAAGF,aAAa,CAAC;EAC9CG,IAAI,EAAE,eAAe;EACrBC,QAAQA,CAACC,SAAS,EAAE;IAChB;IACAA,SAAS,CAACD,QAAQ,CAACH,oBAAoB,CAAC;EAC5C;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -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";
|
|
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;
|
|
@@ -0,0 +1,68 @@
|
|
|
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";
|
|
5
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
6
|
+
import { UpdateTenantUseCase as ApiCoreUpdateTenant } from "@webiny/api-core/features/tenancy/UpdateTenant";
|
|
7
|
+
import { UpdateTenantUseCase as TenantManagerUpdateTenant } from "../UpdateTenant/abstractions.js";
|
|
8
|
+
import { GetTenantByIdUseCase } from "../GetTenantById/abstractions.js";
|
|
9
|
+
import { TenantBeforeEnableEvent, TenantAfterEnableEvent } from "./events.js";
|
|
10
|
+
import { TenantPersistenceError } from "../../domain/errors.js";
|
|
11
|
+
class EnableTenantUseCase {
|
|
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
|
+
// Authorization checks
|
|
21
|
+
const identity = this.identityContext.getIdentity();
|
|
22
|
+
if (!identity.isAdmin() || !this.identityContext.getPermission("tm.tenant")) {
|
|
23
|
+
return Result.fail(new NotAuthorizedError({
|
|
24
|
+
message: "Not authorized to enable tenants."
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Get current tenant to verify it exists
|
|
29
|
+
const getTenantResult = await this.tmGetTenantById.execute(tenantId);
|
|
30
|
+
if (getTenantResult.isFail()) {
|
|
31
|
+
return Result.fail(getTenantResult.error);
|
|
32
|
+
}
|
|
33
|
+
const tenant = getTenantResult.value;
|
|
34
|
+
|
|
35
|
+
// Publish before event
|
|
36
|
+
await this.eventPublisher.publish(new TenantBeforeEnableEvent({
|
|
37
|
+
tenant
|
|
38
|
+
}));
|
|
39
|
+
|
|
40
|
+
// Update api-core tenant first
|
|
41
|
+
const apiCoreResult = await this.coreUpdateTenant.execute(tenantId, {
|
|
42
|
+
status: "enabled"
|
|
43
|
+
});
|
|
44
|
+
if (apiCoreResult.isFail()) {
|
|
45
|
+
return Result.fail(new TenantPersistenceError(new Error(`Failed to update api-core tenant: ${apiCoreResult.error}`)));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Update tenant-manager CMS entry
|
|
49
|
+
const updatedTenantResult = await this.tmUpdateTenant.execute(tenantId, {
|
|
50
|
+
status: "enabled"
|
|
51
|
+
});
|
|
52
|
+
if (updatedTenantResult.isFail()) {
|
|
53
|
+
return Result.fail(updatedTenantResult.error);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Publish after event
|
|
57
|
+
await this.eventPublisher.publish(new TenantAfterEnableEvent({
|
|
58
|
+
tenant: updatedTenantResult.value
|
|
59
|
+
}));
|
|
60
|
+
return Result.ok();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export default UseCaseAbstraction.createImplementation({
|
|
64
|
+
implementation: EnableTenantUseCase,
|
|
65
|
+
dependencies: [IdentityContext, EventPublisher, ApiCoreUpdateTenant, TenantManagerUpdateTenant, GetTenantByIdUseCase]
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=EnableTenantUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EnableTenantUseCase","UseCaseAbstraction","Result","IdentityContext","EventPublisher","NotAuthorizedError","UpdateTenantUseCase","ApiCoreUpdateTenant","TenantManagerUpdateTenant","GetTenantByIdUseCase","TenantBeforeEnableEvent","TenantAfterEnableEvent","TenantPersistenceError","constructor","identityContext","eventPublisher","coreUpdateTenant","tmUpdateTenant","tmGetTenantById","execute","tenantId","identity","getIdentity","isAdmin","getPermission","fail","message","getTenantResult","isFail","error","tenant","value","publish","apiCoreResult","status","Error","updatedTenantResult","ok","createImplementation","implementation","dependencies"],"sources":["EnableTenantUseCase.ts"],"sourcesContent":["import { EnableTenantUseCase 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\";\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 { TenantBeforeEnableEvent, TenantAfterEnableEvent } from \"./events.js\";\nimport { TenantPersistenceError } from \"../../domain/errors.js\";\n\nclass EnableTenantUseCase 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 const identity = this.identityContext.getIdentity();\n if (!identity.isAdmin() || !this.identityContext.getPermission(\"tm.tenant\")) {\n return Result.fail(\n new NotAuthorizedError({ message: \"Not authorized to enable tenants.\" })\n );\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 TenantBeforeEnableEvent({ tenant }));\n\n // Update api-core tenant first\n const apiCoreResult = await this.coreUpdateTenant.execute(tenantId, {\n status: \"enabled\"\n });\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 updatedTenantResult = await this.tmUpdateTenant.execute(tenantId, {\n status: \"enabled\"\n });\n\n if (updatedTenantResult.isFail()) {\n return Result.fail(updatedTenantResult.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(\n new TenantAfterEnableEvent({ tenant: updatedTenantResult.value })\n );\n\n return Result.ok();\n }\n}\n\nexport default UseCaseAbstraction.createImplementation({\n implementation: EnableTenantUseCase,\n dependencies: [\n IdentityContext,\n EventPublisher,\n ApiCoreUpdateTenant,\n TenantManagerUpdateTenant,\n GetTenantByIdUseCase\n ]\n});\n"],"mappings":"AAAA,SAASA,mBAAmB,IAAIC,kBAAkB;AAClD,SAASC,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,eAAe,QAAQ,0CAA0C;AAC1E,SAASC,cAAc,QAAQ,0CAA0C;AACzE,SAASC,kBAAkB,QAAQ,qDAAqD;AACxF,SAASC,mBAAmB,IAAIC,mBAAmB,QAAQ,gDAAgD;AAC3G,SAASD,mBAAmB,IAAIE,yBAAyB;AACzD,SAASC,oBAAoB;AAC7B,SAASC,uBAAuB,EAAEC,sBAAsB;AACxD,SAASC,sBAAsB;AAE/B,MAAMZ,mBAAmB,CAAyC;EAC9Da,WAAWA,CACCC,eAA0C,EAC1CC,cAAwC,EACxCC,gBAA+C,EAC/CC,cAAmD,EACnDC,eAA+C,EACzD;IAAA,KALUJ,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,cAAwC,GAAxCA,cAAwC;IAAA,KACxCC,gBAA+C,GAA/CA,gBAA+C;IAAA,KAC/CC,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,eAA+C,GAA/CA,eAA+C;EACxD;EAEH,MAAMC,OAAOA,CAACC,QAAgB,EAAmD;IAC7E;IACA,MAAMC,QAAQ,GAAG,IAAI,CAACP,eAAe,CAACQ,WAAW,CAAC,CAAC;IACnD,IAAI,CAACD,QAAQ,CAACE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAACT,eAAe,CAACU,aAAa,CAAC,WAAW,CAAC,EAAE;MACzE,OAAOtB,MAAM,CAACuB,IAAI,CACd,IAAIpB,kBAAkB,CAAC;QAAEqB,OAAO,EAAE;MAAoC,CAAC,CAC3E,CAAC;IACL;;IAEA;IACA,MAAMC,eAAe,GAAG,MAAM,IAAI,CAACT,eAAe,CAACC,OAAO,CAACC,QAAQ,CAAC;IACpE,IAAIO,eAAe,CAACC,MAAM,CAAC,CAAC,EAAE;MAC1B,OAAO1B,MAAM,CAACuB,IAAI,CAACE,eAAe,CAACE,KAAK,CAAC;IAC7C;IAEA,MAAMC,MAAM,GAAGH,eAAe,CAACI,KAAK;;IAEpC;IACA,MAAM,IAAI,CAAChB,cAAc,CAACiB,OAAO,CAAC,IAAItB,uBAAuB,CAAC;MAAEoB;IAAO,CAAC,CAAC,CAAC;;IAE1E;IACA,MAAMG,aAAa,GAAG,MAAM,IAAI,CAACjB,gBAAgB,CAACG,OAAO,CAACC,QAAQ,EAAE;MAChEc,MAAM,EAAE;IACZ,CAAC,CAAC;IAEF,IAAID,aAAa,CAACL,MAAM,CAAC,CAAC,EAAE;MACxB,OAAO1B,MAAM,CAACuB,IAAI,CACd,IAAIb,sBAAsB,CACtB,IAAIuB,KAAK,CAAC,qCAAqCF,aAAa,CAACJ,KAAK,EAAE,CACxE,CACJ,CAAC;IACL;;IAEA;IACA,MAAMO,mBAAmB,GAAG,MAAM,IAAI,CAACnB,cAAc,CAACE,OAAO,CAACC,QAAQ,EAAE;MACpEc,MAAM,EAAE;IACZ,CAAC,CAAC;IAEF,IAAIE,mBAAmB,CAACR,MAAM,CAAC,CAAC,EAAE;MAC9B,OAAO1B,MAAM,CAACuB,IAAI,CAACW,mBAAmB,CAACP,KAAK,CAAC;IACjD;;IAEA;IACA,MAAM,IAAI,CAACd,cAAc,CAACiB,OAAO,CAC7B,IAAIrB,sBAAsB,CAAC;MAAEmB,MAAM,EAAEM,mBAAmB,CAACL;IAAM,CAAC,CACpE,CAAC;IAED,OAAO7B,MAAM,CAACmC,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,eAAepC,kBAAkB,CAACqC,oBAAoB,CAAC;EACnDC,cAAc,EAAEvC,mBAAmB;EACnCwC,YAAY,EAAE,CACVrC,eAAe,EACfC,cAAc,EACdG,mBAAmB,EACnBC,yBAAyB,EACzBC,oBAAoB;AAE5B,CAAC,CAAC","ignoreList":[]}
|