@webiny/tenant-manager 6.3.0 → 6.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/TenantManager.js +8 -9
- package/TenantManager.js.map +1 -1
- package/admin/CurrentTenant/CurrentTenant.js +15 -24
- package/admin/CurrentTenant/CurrentTenant.js.map +1 -1
- package/admin/CurrentTenant/CurrentTenantGateway.js +18 -19
- package/admin/CurrentTenant/CurrentTenantGateway.js.map +1 -1
- package/admin/CurrentTenant/CurrentTenantPresenter.js +26 -23
- package/admin/CurrentTenant/CurrentTenantPresenter.js.map +1 -1
- package/admin/CurrentTenant/CurrentTenantRepository.js +30 -29
- package/admin/CurrentTenant/CurrentTenantRepository.js.map +1 -1
- package/admin/CurrentTenant/abstractions.js +4 -12
- package/admin/CurrentTenant/abstractions.js.map +1 -1
- package/admin/CurrentTenant/feature.js +15 -14
- package/admin/CurrentTenant/feature.js.map +1 -1
- package/admin/CurrentTenant/useCurrentTenant.js +11 -16
- package/admin/CurrentTenant/useCurrentTenant.js.map +1 -1
- package/admin/CurrentTenantProvider.js +5 -8
- package/admin/CurrentTenantProvider.js.map +1 -1
- package/admin/DisableTenant/DisableTenantGateway.js +21 -22
- package/admin/DisableTenant/DisableTenantGateway.js.map +1 -1
- package/admin/DisableTenant/DisableTenantRepository.js +13 -10
- package/admin/DisableTenant/DisableTenantRepository.js.map +1 -1
- package/admin/DisableTenant/DisableTenantUseCase.js +13 -10
- package/admin/DisableTenant/DisableTenantUseCase.js.map +1 -1
- package/admin/DisableTenant/abstractions.js +4 -12
- package/admin/DisableTenant/abstractions.js.map +1 -1
- package/admin/DisableTenant/feature.js +15 -14
- package/admin/DisableTenant/feature.js.map +1 -1
- package/admin/DisableTenant/index.js +0 -2
- package/admin/DisableTenant/useDisableTenant.js +20 -20
- package/admin/DisableTenant/useDisableTenant.js.map +1 -1
- package/admin/EnableTenant/EnableTenantGateway.js +21 -22
- package/admin/EnableTenant/EnableTenantGateway.js.map +1 -1
- package/admin/EnableTenant/EnableTenantRepository.js +13 -10
- package/admin/EnableTenant/EnableTenantRepository.js.map +1 -1
- package/admin/EnableTenant/EnableTenantUseCase.js +13 -10
- package/admin/EnableTenant/EnableTenantUseCase.js.map +1 -1
- package/admin/EnableTenant/abstractions.js +4 -12
- package/admin/EnableTenant/abstractions.js.map +1 -1
- package/admin/EnableTenant/feature.js +15 -14
- package/admin/EnableTenant/feature.js.map +1 -1
- package/admin/EnableTenant/index.js +0 -2
- package/admin/EnableTenant/useEnableTenant.js +19 -18
- package/admin/EnableTenant/useEnableTenant.js.map +1 -1
- package/admin/Extension.js +32 -36
- package/admin/Extension.js.map +1 -1
- package/admin/IsRootTenant.js +14 -32
- package/admin/IsRootTenant.js.map +1 -1
- package/admin/SecurityPermission.js +11 -14
- package/admin/SecurityPermission.js.map +1 -1
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js +36 -37
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js.map +1 -1
- package/admin/TenantEntryList/EnableTenant/EnableTenant.js +10 -14
- package/admin/TenantEntryList/EnableTenant/EnableTenant.js.map +1 -1
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js +34 -33
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js.map +1 -1
- package/admin/TenantEntryList/FolderNameCell.js +19 -24
- package/admin/TenantEntryList/FolderNameCell.js.map +1 -1
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js +10 -14
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js.map +1 -1
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js +3 -2
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js.map +1 -1
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js +34 -38
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js.map +1 -1
- package/admin/TenantEntryList/ManageTenant.js +15 -16
- package/admin/TenantEntryList/ManageTenant.js.map +1 -1
- package/admin/TenantEntryList/TenantCell.js +15 -30
- package/admin/TenantEntryList/TenantCell.js.map +1 -1
- package/admin/TenantEntryList/TenantNameCell.js +35 -45
- package/admin/TenantEntryList/TenantNameCell.js.map +1 -1
- package/admin/TenantEntryList.js +43 -60
- package/admin/TenantEntryList.js.map +1 -1
- package/admin/TenantSelector.js +31 -35
- package/admin/TenantSelector.js.map +1 -1
- package/admin/domain/permissionsSchema.js +4 -3
- package/admin/domain/permissionsSchema.js.map +1 -1
- package/admin/features/permissions/abstractions.js +2 -1
- package/admin/features/permissions/abstractions.js.map +1 -1
- package/admin/features/permissions/feature.js +2 -1
- package/admin/features/permissions/feature.js.map +1 -1
- package/admin/types.js +0 -3
- package/api/Extension.js +20 -23
- package/api/Extension.js.map +1 -1
- package/api/domain/TenantId.js +5 -7
- package/api/domain/TenantId.js.map +1 -1
- package/api/domain/TenantModel.js +59 -37
- package/api/domain/TenantModel.js.map +1 -1
- package/api/domain/TenantModelExtension.js +2 -2
- package/api/domain/TenantModelExtension.js.map +1 -1
- package/api/domain/errors.js +49 -54
- package/api/domain/errors.js.map +1 -1
- package/api/features/AddCmsPermissions/AddCmsPermissions.js +40 -31
- package/api/features/AddCmsPermissions/AddCmsPermissions.js.map +1 -1
- package/api/features/AddCmsPermissions/feature.js +6 -5
- package/api/features/AddCmsPermissions/feature.js.map +1 -1
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js +67 -85
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js.map +1 -1
- package/api/features/CreateAndInstallTenant/abstractions.js +2 -6
- package/api/features/CreateAndInstallTenant/abstractions.js.map +1 -1
- package/api/features/CreateAndInstallTenant/feature.js +6 -6
- package/api/features/CreateAndInstallTenant/feature.js.map +1 -1
- package/api/features/CreateTenant/CreateTenantRepository.js +33 -38
- package/api/features/CreateTenant/CreateTenantRepository.js.map +1 -1
- package/api/features/CreateTenant/CreateTenantUseCase.js +29 -32
- package/api/features/CreateTenant/CreateTenantUseCase.js.map +1 -1
- package/api/features/CreateTenant/abstractions.js +3 -8
- package/api/features/CreateTenant/abstractions.js.map +1 -1
- package/api/features/CreateTenant/feature.js +7 -9
- package/api/features/CreateTenant/feature.js.map +1 -1
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js +17 -27
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js.map +1 -1
- package/api/features/DeleteTenantOnEntryDelete/feature.js +6 -6
- package/api/features/DeleteTenantOnEntryDelete/feature.js.map +1 -1
- package/api/features/DisableTenant/DisableTenantUseCase.js +41 -53
- package/api/features/DisableTenant/DisableTenantUseCase.js.map +1 -1
- package/api/features/DisableTenant/abstractions.js +2 -1
- package/api/features/DisableTenant/abstractions.js.map +1 -1
- package/api/features/DisableTenant/events.js +17 -12
- package/api/features/DisableTenant/events.js.map +1 -1
- package/api/features/DisableTenant/feature.js +6 -6
- package/api/features/DisableTenant/feature.js.map +1 -1
- package/api/features/EnableTenant/EnableTenantUseCase.js +43 -55
- package/api/features/EnableTenant/EnableTenantUseCase.js.map +1 -1
- package/api/features/EnableTenant/abstractions.js +2 -1
- package/api/features/EnableTenant/abstractions.js.map +1 -1
- package/api/features/EnableTenant/events.js +17 -12
- package/api/features/EnableTenant/events.js.map +1 -1
- package/api/features/EnableTenant/feature.js +6 -6
- package/api/features/EnableTenant/feature.js.map +1 -1
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js +21 -24
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js.map +1 -1
- package/api/features/GetCurrentTenant/abstractions.js +2 -7
- package/api/features/GetCurrentTenant/abstractions.js.map +1 -1
- package/api/features/GetCurrentTenant/feature.js +6 -6
- package/api/features/GetCurrentTenant/feature.js.map +1 -1
- package/api/features/GetTenantById/GetTenantByIdRepository.js +31 -36
- package/api/features/GetTenantById/GetTenantByIdRepository.js.map +1 -1
- package/api/features/GetTenantById/GetTenantByIdUseCase.js +15 -19
- package/api/features/GetTenantById/GetTenantByIdUseCase.js.map +1 -1
- package/api/features/GetTenantById/abstractions.js +3 -12
- package/api/features/GetTenantById/abstractions.js.map +1 -1
- package/api/features/GetTenantById/feature.js +7 -9
- package/api/features/GetTenantById/feature.js.map +1 -1
- package/api/features/UpdateTenant/UpdateTenantRepository.js +40 -47
- package/api/features/UpdateTenant/UpdateTenantRepository.js.map +1 -1
- package/api/features/UpdateTenant/UpdateTenantUseCase.js +15 -15
- package/api/features/UpdateTenant/UpdateTenantUseCase.js.map +1 -1
- package/api/features/UpdateTenant/abstractions.js +3 -12
- package/api/features/UpdateTenant/abstractions.js.map +1 -1
- package/api/features/UpdateTenant/feature.js +7 -9
- package/api/features/UpdateTenant/feature.js.map +1 -1
- package/api/graphql/CreateTenantSchema.js +53 -55
- package/api/graphql/CreateTenantSchema.js.map +1 -1
- package/api/graphql/DisableTenantSchema.js +20 -24
- package/api/graphql/DisableTenantSchema.js.map +1 -1
- package/api/graphql/EnableTenantSchema.js +20 -24
- package/api/graphql/EnableTenantSchema.js.map +1 -1
- package/api/graphql/GetCurrentTenantSchema.js +24 -28
- package/api/graphql/GetCurrentTenantSchema.js.map +1 -1
- package/api/graphql/InstallTenantSchema.js +26 -33
- package/api/graphql/InstallTenantSchema.js.map +1 -1
- package/exports/admin/tenancy.js +1 -5
- package/exports/api/tenant-manager.js +0 -2
- package/index.js +0 -2
- package/package.json +16 -16
- package/shared/Tenant.js +23 -22
- package/shared/Tenant.js.map +1 -1
- package/shared/constants.js +2 -1
- package/shared/constants.js.map +1 -1
- package/admin/DisableTenant/index.js.map +0 -1
- package/admin/EnableTenant/index.js.map +0 -1
- package/admin/types.js.map +0 -1
- package/exports/admin/tenancy.js.map +0 -1
- package/exports/api/tenant-manager.js.map +0 -1
- package/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* CreateAndInstallTenant Use Case
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export const CreateAndInstallTenantUseCase = createAbstraction("TenantManager/CreateAndInstallTenantUseCase");
|
|
2
|
+
const CreateAndInstallTenantUseCase = createAbstraction("TenantManager/CreateAndInstallTenantUseCase");
|
|
3
|
+
export { CreateAndInstallTenantUseCase };
|
|
8
4
|
|
|
9
5
|
//# sourceMappingURL=abstractions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
2
|
import CreateAndInstallTenantUseCase from "./CreateAndInstallTenantUseCase.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
3
|
+
const CreateAndInstallTenantFeature = createFeature({
|
|
4
|
+
name: "CreateAndInstallTenant",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(CreateAndInstallTenantUseCase);
|
|
7
|
+
}
|
|
9
8
|
});
|
|
9
|
+
export { CreateAndInstallTenantFeature };
|
|
10
10
|
|
|
11
11
|
//# sourceMappingURL=feature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -1,48 +1,43 @@
|
|
|
1
1
|
import { TenantCreationError, TenantModelNotFoundError } from "../../domain/errors.js";
|
|
2
|
-
import { CreateTenantRepository
|
|
2
|
+
import { CreateTenantRepository } from "./abstractions.js";
|
|
3
3
|
import { Result } from "@webiny/feature/api";
|
|
4
4
|
import { CreateEntryUseCase } from "@webiny/api-headless-cms/exports/api/cms/entry.js";
|
|
5
5
|
import { GetModelUseCase } from "@webiny/api-headless-cms/exports/api/cms/model";
|
|
6
6
|
import { TENANT_MODEL_ID } from "../../../shared/constants.js";
|
|
7
|
-
class
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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));
|
|
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
|
+
}
|
|
40
32
|
}
|
|
41
|
-
}
|
|
42
33
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
34
|
+
const CreateTenant_CreateTenantRepository = CreateTenantRepository.createImplementation({
|
|
35
|
+
implementation: CreateTenantRepository_CreateTenantRepository,
|
|
36
|
+
dependencies: [
|
|
37
|
+
GetModelUseCase,
|
|
38
|
+
CreateEntryUseCase
|
|
39
|
+
]
|
|
46
40
|
});
|
|
41
|
+
export default CreateTenant_CreateTenantRepository;
|
|
47
42
|
|
|
48
43
|
//# sourceMappingURL=CreateTenantRepository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -1,43 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CreateTenantRepository, CreateTenantUseCase } from "./abstractions.js";
|
|
2
2
|
import { Result } from "@webiny/feature/api";
|
|
3
3
|
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
4
4
|
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
5
5
|
import { Tenant } from "../../../shared/Tenant.js";
|
|
6
6
|
import { TenantId } from "../../domain/TenantId.js";
|
|
7
|
-
class
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
async execute(input) {
|
|
13
|
-
// Authorization checks
|
|
14
|
-
if (!this.identityContext.getPermission("tm.tenant")) {
|
|
15
|
-
return Result.fail(new NotAuthorizedError({
|
|
16
|
-
message: "Not authorized to create tenants!"
|
|
17
|
-
}));
|
|
7
|
+
class CreateTenantUseCase_CreateTenantUseCase {
|
|
8
|
+
constructor(identityContext, repository){
|
|
9
|
+
this.identityContext = identityContext;
|
|
10
|
+
this.repository = repository;
|
|
18
11
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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);
|
|
34
29
|
}
|
|
35
|
-
return Result.ok(result.value);
|
|
36
|
-
}
|
|
37
30
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
const CreateTenant_CreateTenantUseCase = CreateTenantUseCase.createImplementation({
|
|
32
|
+
implementation: CreateTenantUseCase_CreateTenantUseCase,
|
|
33
|
+
dependencies: [
|
|
34
|
+
IdentityContext,
|
|
35
|
+
CreateTenantRepository
|
|
36
|
+
]
|
|
41
37
|
});
|
|
38
|
+
export default CreateTenant_CreateTenantUseCase;
|
|
42
39
|
|
|
43
40
|
//# sourceMappingURL=CreateTenantUseCase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export const CreateTenantUseCase = createAbstraction("TenantManager/CreateTenantUseCase");
|
|
6
|
-
|
|
7
|
-
// REPOSITORY
|
|
8
|
-
|
|
9
|
-
export const CreateTenantRepository = createAbstraction("TenantManager/CreateTenantRepository");
|
|
2
|
+
const CreateTenantUseCase = createAbstraction("TenantManager/CreateTenantUseCase");
|
|
3
|
+
const CreateTenantRepository = createAbstraction("TenantManager/CreateTenantRepository");
|
|
4
|
+
export { CreateTenantRepository, CreateTenantUseCase };
|
|
10
5
|
|
|
11
6
|
//# sourceMappingURL=abstractions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
2
|
import CreateTenantUseCase from "./CreateTenantUseCase.js";
|
|
3
3
|
import CreateTenantRepository from "./CreateTenantRepository.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
// Register repository (singleton scope)
|
|
11
|
-
container.register(CreateTenantRepository).inSingletonScope();
|
|
12
|
-
}
|
|
4
|
+
const CreateTenantFeature = createFeature({
|
|
5
|
+
name: "CreateTenant",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(CreateTenantUseCase);
|
|
8
|
+
container.register(CreateTenantRepository).inSingletonScope();
|
|
9
|
+
}
|
|
13
10
|
});
|
|
11
|
+
export { CreateTenantFeature };
|
|
14
12
|
|
|
15
13
|
//# sourceMappingURL=feature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -2,36 +2,26 @@ import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/
|
|
|
2
2
|
import { DeleteTenantUseCase } from "@webiny/api-core/features/tenancy/DeleteTenant";
|
|
3
3
|
import { TENANT_MODEL_ID } from "../../../shared/constants.js";
|
|
4
4
|
class DeleteTenantOnEntryDeleteHandler {
|
|
5
|
-
|
|
6
|
-
|
|
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;
|
|
5
|
+
constructor(deleteTenant){
|
|
6
|
+
this.deleteTenant = deleteTenant;
|
|
22
7
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
+
}
|
|
29
17
|
}
|
|
30
|
-
}
|
|
31
18
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
const DeleteTenantOnEntryDelete_DeleteTenantOnEntryDeleteHandler = EntryAfterDeleteEventHandler.createImplementation({
|
|
20
|
+
implementation: DeleteTenantOnEntryDeleteHandler,
|
|
21
|
+
dependencies: [
|
|
22
|
+
DeleteTenantUseCase
|
|
23
|
+
]
|
|
35
24
|
});
|
|
25
|
+
export default DeleteTenantOnEntryDelete_DeleteTenantOnEntryDeleteHandler;
|
|
36
26
|
|
|
37
27
|
//# sourceMappingURL=DeleteTenantOnEntryDeleteHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
2
|
import DeleteTenantOnEntryDeleteHandler from "./DeleteTenantOnEntryDeleteHandler.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
3
|
+
const DeleteTenantOnEntryDeleteFeature = createFeature({
|
|
4
|
+
name: "DeleteTenantOnEntryDelete",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(DeleteTenantOnEntryDeleteHandler);
|
|
7
|
+
}
|
|
9
8
|
});
|
|
9
|
+
export { DeleteTenantOnEntryDeleteFeature };
|
|
10
10
|
|
|
11
11
|
//# sourceMappingURL=feature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
|
@@ -1,65 +1,53 @@
|
|
|
1
|
-
import { DisableTenantUseCase
|
|
1
|
+
import { DisableTenantUseCase } from "./abstractions.js";
|
|
2
2
|
import { Result } from "@webiny/feature/api";
|
|
3
3
|
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
4
4
|
import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
5
5
|
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
6
|
-
import { UpdateTenantUseCase
|
|
7
|
-
import { UpdateTenantUseCase as
|
|
6
|
+
import { UpdateTenantUseCase } from "@webiny/api-core/features/tenancy/UpdateTenant";
|
|
7
|
+
import { UpdateTenantUseCase as abstractions_js_UpdateTenantUseCase } from "../UpdateTenant/abstractions.js";
|
|
8
8
|
import { GetTenantByIdUseCase } from "../GetTenantById/abstractions.js";
|
|
9
|
-
import {
|
|
9
|
+
import { TenantAfterDisableEvent, TenantBeforeDisableEvent } from "./events.js";
|
|
10
10
|
import { TenantPersistenceError } from "../../domain/errors.js";
|
|
11
|
-
class
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
async execute(tenantId) {
|
|
20
|
-
// Authorization checks
|
|
21
|
-
if (!this.identityContext.getPermission("tm.tenant")) {
|
|
22
|
-
return Result.fail(new NotAuthorizedError());
|
|
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;
|
|
23
18
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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();
|
|
43
39
|
}
|
|
44
|
-
|
|
45
|
-
// Update tenant-manager CMS entry
|
|
46
|
-
const updateResult = await this.tmUpdateTenant.execute(tenantId, {
|
|
47
|
-
status: "disabled"
|
|
48
|
-
});
|
|
49
|
-
if (updateResult.isFail()) {
|
|
50
|
-
return Result.fail(updateResult.error);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Publish after event
|
|
54
|
-
await this.eventPublisher.publish(new TenantAfterDisableEvent({
|
|
55
|
-
tenant: updateResult.value
|
|
56
|
-
}));
|
|
57
|
-
return Result.ok();
|
|
58
|
-
}
|
|
59
40
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
+
]
|
|
63
50
|
});
|
|
51
|
+
export default DisableTenant_DisableTenantUseCase;
|
|
64
52
|
|
|
65
53
|
//# sourceMappingURL=DisableTenantUseCase.js.map
|