@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.
Files changed (175) hide show
  1. package/TenantManager.js +8 -9
  2. package/TenantManager.js.map +1 -1
  3. package/admin/CurrentTenant/CurrentTenant.js +15 -24
  4. package/admin/CurrentTenant/CurrentTenant.js.map +1 -1
  5. package/admin/CurrentTenant/CurrentTenantGateway.js +18 -19
  6. package/admin/CurrentTenant/CurrentTenantGateway.js.map +1 -1
  7. package/admin/CurrentTenant/CurrentTenantPresenter.js +26 -23
  8. package/admin/CurrentTenant/CurrentTenantPresenter.js.map +1 -1
  9. package/admin/CurrentTenant/CurrentTenantRepository.js +30 -29
  10. package/admin/CurrentTenant/CurrentTenantRepository.js.map +1 -1
  11. package/admin/CurrentTenant/abstractions.js +4 -12
  12. package/admin/CurrentTenant/abstractions.js.map +1 -1
  13. package/admin/CurrentTenant/feature.js +15 -14
  14. package/admin/CurrentTenant/feature.js.map +1 -1
  15. package/admin/CurrentTenant/useCurrentTenant.js +11 -16
  16. package/admin/CurrentTenant/useCurrentTenant.js.map +1 -1
  17. package/admin/CurrentTenantProvider.js +5 -8
  18. package/admin/CurrentTenantProvider.js.map +1 -1
  19. package/admin/DisableTenant/DisableTenantGateway.js +21 -22
  20. package/admin/DisableTenant/DisableTenantGateway.js.map +1 -1
  21. package/admin/DisableTenant/DisableTenantRepository.js +13 -10
  22. package/admin/DisableTenant/DisableTenantRepository.js.map +1 -1
  23. package/admin/DisableTenant/DisableTenantUseCase.js +13 -10
  24. package/admin/DisableTenant/DisableTenantUseCase.js.map +1 -1
  25. package/admin/DisableTenant/abstractions.js +4 -12
  26. package/admin/DisableTenant/abstractions.js.map +1 -1
  27. package/admin/DisableTenant/feature.js +15 -14
  28. package/admin/DisableTenant/feature.js.map +1 -1
  29. package/admin/DisableTenant/index.js +0 -2
  30. package/admin/DisableTenant/useDisableTenant.js +20 -20
  31. package/admin/DisableTenant/useDisableTenant.js.map +1 -1
  32. package/admin/EnableTenant/EnableTenantGateway.js +21 -22
  33. package/admin/EnableTenant/EnableTenantGateway.js.map +1 -1
  34. package/admin/EnableTenant/EnableTenantRepository.js +13 -10
  35. package/admin/EnableTenant/EnableTenantRepository.js.map +1 -1
  36. package/admin/EnableTenant/EnableTenantUseCase.js +13 -10
  37. package/admin/EnableTenant/EnableTenantUseCase.js.map +1 -1
  38. package/admin/EnableTenant/abstractions.js +4 -12
  39. package/admin/EnableTenant/abstractions.js.map +1 -1
  40. package/admin/EnableTenant/feature.js +15 -14
  41. package/admin/EnableTenant/feature.js.map +1 -1
  42. package/admin/EnableTenant/index.js +0 -2
  43. package/admin/EnableTenant/useEnableTenant.js +19 -18
  44. package/admin/EnableTenant/useEnableTenant.js.map +1 -1
  45. package/admin/Extension.js +32 -36
  46. package/admin/Extension.js.map +1 -1
  47. package/admin/IsRootTenant.js +14 -32
  48. package/admin/IsRootTenant.js.map +1 -1
  49. package/admin/SecurityPermission.js +11 -14
  50. package/admin/SecurityPermission.js.map +1 -1
  51. package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js +36 -37
  52. package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js.map +1 -1
  53. package/admin/TenantEntryList/EnableTenant/EnableTenant.js +10 -14
  54. package/admin/TenantEntryList/EnableTenant/EnableTenant.js.map +1 -1
  55. package/admin/TenantEntryList/EnableTenant/useEnableTenant.js +34 -33
  56. package/admin/TenantEntryList/EnableTenant/useEnableTenant.js.map +1 -1
  57. package/admin/TenantEntryList/FolderNameCell.js +19 -24
  58. package/admin/TenantEntryList/FolderNameCell.js.map +1 -1
  59. package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js +10 -14
  60. package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js.map +1 -1
  61. package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js +3 -2
  62. package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js.map +1 -1
  63. package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js +34 -38
  64. package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js.map +1 -1
  65. package/admin/TenantEntryList/ManageTenant.js +15 -16
  66. package/admin/TenantEntryList/ManageTenant.js.map +1 -1
  67. package/admin/TenantEntryList/TenantCell.js +15 -30
  68. package/admin/TenantEntryList/TenantCell.js.map +1 -1
  69. package/admin/TenantEntryList/TenantNameCell.js +35 -45
  70. package/admin/TenantEntryList/TenantNameCell.js.map +1 -1
  71. package/admin/TenantEntryList.js +43 -60
  72. package/admin/TenantEntryList.js.map +1 -1
  73. package/admin/TenantSelector.js +31 -35
  74. package/admin/TenantSelector.js.map +1 -1
  75. package/admin/domain/permissionsSchema.js +4 -3
  76. package/admin/domain/permissionsSchema.js.map +1 -1
  77. package/admin/features/permissions/abstractions.js +2 -1
  78. package/admin/features/permissions/abstractions.js.map +1 -1
  79. package/admin/features/permissions/feature.js +2 -1
  80. package/admin/features/permissions/feature.js.map +1 -1
  81. package/admin/types.js +0 -3
  82. package/api/Extension.js +20 -23
  83. package/api/Extension.js.map +1 -1
  84. package/api/domain/TenantId.js +5 -7
  85. package/api/domain/TenantId.js.map +1 -1
  86. package/api/domain/TenantModel.js +59 -37
  87. package/api/domain/TenantModel.js.map +1 -1
  88. package/api/domain/TenantModelExtension.js +2 -2
  89. package/api/domain/TenantModelExtension.js.map +1 -1
  90. package/api/domain/errors.js +49 -54
  91. package/api/domain/errors.js.map +1 -1
  92. package/api/features/AddCmsPermissions/AddCmsPermissions.js +40 -31
  93. package/api/features/AddCmsPermissions/AddCmsPermissions.js.map +1 -1
  94. package/api/features/AddCmsPermissions/feature.js +6 -5
  95. package/api/features/AddCmsPermissions/feature.js.map +1 -1
  96. package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js +67 -85
  97. package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js.map +1 -1
  98. package/api/features/CreateAndInstallTenant/abstractions.js +2 -6
  99. package/api/features/CreateAndInstallTenant/abstractions.js.map +1 -1
  100. package/api/features/CreateAndInstallTenant/feature.js +6 -6
  101. package/api/features/CreateAndInstallTenant/feature.js.map +1 -1
  102. package/api/features/CreateTenant/CreateTenantRepository.js +33 -38
  103. package/api/features/CreateTenant/CreateTenantRepository.js.map +1 -1
  104. package/api/features/CreateTenant/CreateTenantUseCase.js +29 -32
  105. package/api/features/CreateTenant/CreateTenantUseCase.js.map +1 -1
  106. package/api/features/CreateTenant/abstractions.js +3 -8
  107. package/api/features/CreateTenant/abstractions.js.map +1 -1
  108. package/api/features/CreateTenant/feature.js +7 -9
  109. package/api/features/CreateTenant/feature.js.map +1 -1
  110. package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js +17 -27
  111. package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js.map +1 -1
  112. package/api/features/DeleteTenantOnEntryDelete/feature.js +6 -6
  113. package/api/features/DeleteTenantOnEntryDelete/feature.js.map +1 -1
  114. package/api/features/DisableTenant/DisableTenantUseCase.js +41 -53
  115. package/api/features/DisableTenant/DisableTenantUseCase.js.map +1 -1
  116. package/api/features/DisableTenant/abstractions.js +2 -1
  117. package/api/features/DisableTenant/abstractions.js.map +1 -1
  118. package/api/features/DisableTenant/events.js +17 -12
  119. package/api/features/DisableTenant/events.js.map +1 -1
  120. package/api/features/DisableTenant/feature.js +6 -6
  121. package/api/features/DisableTenant/feature.js.map +1 -1
  122. package/api/features/EnableTenant/EnableTenantUseCase.js +43 -55
  123. package/api/features/EnableTenant/EnableTenantUseCase.js.map +1 -1
  124. package/api/features/EnableTenant/abstractions.js +2 -1
  125. package/api/features/EnableTenant/abstractions.js.map +1 -1
  126. package/api/features/EnableTenant/events.js +17 -12
  127. package/api/features/EnableTenant/events.js.map +1 -1
  128. package/api/features/EnableTenant/feature.js +6 -6
  129. package/api/features/EnableTenant/feature.js.map +1 -1
  130. package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js +21 -24
  131. package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js.map +1 -1
  132. package/api/features/GetCurrentTenant/abstractions.js +2 -7
  133. package/api/features/GetCurrentTenant/abstractions.js.map +1 -1
  134. package/api/features/GetCurrentTenant/feature.js +6 -6
  135. package/api/features/GetCurrentTenant/feature.js.map +1 -1
  136. package/api/features/GetTenantById/GetTenantByIdRepository.js +31 -36
  137. package/api/features/GetTenantById/GetTenantByIdRepository.js.map +1 -1
  138. package/api/features/GetTenantById/GetTenantByIdUseCase.js +15 -19
  139. package/api/features/GetTenantById/GetTenantByIdUseCase.js.map +1 -1
  140. package/api/features/GetTenantById/abstractions.js +3 -12
  141. package/api/features/GetTenantById/abstractions.js.map +1 -1
  142. package/api/features/GetTenantById/feature.js +7 -9
  143. package/api/features/GetTenantById/feature.js.map +1 -1
  144. package/api/features/UpdateTenant/UpdateTenantRepository.js +40 -47
  145. package/api/features/UpdateTenant/UpdateTenantRepository.js.map +1 -1
  146. package/api/features/UpdateTenant/UpdateTenantUseCase.js +15 -15
  147. package/api/features/UpdateTenant/UpdateTenantUseCase.js.map +1 -1
  148. package/api/features/UpdateTenant/abstractions.js +3 -12
  149. package/api/features/UpdateTenant/abstractions.js.map +1 -1
  150. package/api/features/UpdateTenant/feature.js +7 -9
  151. package/api/features/UpdateTenant/feature.js.map +1 -1
  152. package/api/graphql/CreateTenantSchema.js +53 -55
  153. package/api/graphql/CreateTenantSchema.js.map +1 -1
  154. package/api/graphql/DisableTenantSchema.js +20 -24
  155. package/api/graphql/DisableTenantSchema.js.map +1 -1
  156. package/api/graphql/EnableTenantSchema.js +20 -24
  157. package/api/graphql/EnableTenantSchema.js.map +1 -1
  158. package/api/graphql/GetCurrentTenantSchema.js +24 -28
  159. package/api/graphql/GetCurrentTenantSchema.js.map +1 -1
  160. package/api/graphql/InstallTenantSchema.js +26 -33
  161. package/api/graphql/InstallTenantSchema.js.map +1 -1
  162. package/exports/admin/tenancy.js +1 -5
  163. package/exports/api/tenant-manager.js +0 -2
  164. package/index.js +0 -2
  165. package/package.json +16 -16
  166. package/shared/Tenant.js +23 -22
  167. package/shared/Tenant.js.map +1 -1
  168. package/shared/constants.js +2 -1
  169. package/shared/constants.js.map +1 -1
  170. package/admin/DisableTenant/index.js.map +0 -1
  171. package/admin/EnableTenant/index.js.map +0 -1
  172. package/admin/types.js.map +0 -1
  173. package/exports/admin/tenancy.js.map +0 -1
  174. package/exports/api/tenant-manager.js.map +0 -1
  175. package/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["Result","EntryId","TenantCreationError","TenantInstallationError","TenantUpdateError","GetTenantByIdUseCase","UpdateTenantUseCase","CreateAndInstallTenantUseCase","UseCaseAbstraction","Tenancy","NotAuthorizedError","IdentityContext","constructor","identityContext","getTenantByIdUseCase","updateTenantUseCase","coreGetTenantById","coreCreateTenant","coreUpdateTenant","coreDeleteTenant","coreInstallTenant","execute","tenantId","getPermission","fail","message","entryId","from","tenantResult","id","isFail","error","tenant","value","existingTenantResult","isOk","name","values","description","status","markTenantInstalled","createTenantResult","parent","tags","createdTenant","installResult","installationInput","updateResult","isInstalled","ok","createImplementation","implementation","dependencies","CreateTenantUseCase","DeleteTenantUseCase","InstallTenantUseCase"],"sources":["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"],"mappings":"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","ignoreList":[]}
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,"names":["createAbstraction","CreateAndInstallTenantUseCase"],"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 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"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAavD;AACA;AACA;;AAkBA,OAAO,MAAMC,6BAA6B,GAAGD,iBAAiB,CAC1D,6CACJ,CAAC","ignoreList":[]}
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
- export const CreateAndInstallTenantFeature = createFeature({
4
- name: "CreateAndInstallTenant",
5
- register(container) {
6
- // Register use case (transient scope)
7
- container.register(CreateAndInstallTenantUseCase);
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,"names":["createFeature","CreateAndInstallTenantUseCase","CreateAndInstallTenantFeature","name","register","container"],"sources":["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"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,OAAOC,6BAA6B;AAEpC,OAAO,MAAMC,6BAA6B,GAAGF,aAAa,CAAC;EACvDG,IAAI,EAAE,wBAAwB;EAC9BC,QAAQA,CAACC,SAAS,EAAE;IAChB;IACAA,SAAS,CAACD,QAAQ,CAACH,6BAA6B,CAAC;EACrD;AACJ,CAAC,CAAC","ignoreList":[]}
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 as RepositoryAbstraction } from "./abstractions.js";
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 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));
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
- export default RepositoryAbstraction.createImplementation({
44
- implementation: CreateTenantRepository,
45
- dependencies: [GetModelUseCase, CreateEntryUseCase]
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,"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":[]}
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 { CreateTenantUseCase as UseCaseAbstraction, CreateTenantRepository } from "./abstractions.js";
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 CreateTenantUseCase {
8
- constructor(identityContext, repository) {
9
- this.identityContext = identityContext;
10
- this.repository = repository;
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
- const tenant = Tenant.from({
20
- id: TenantId.from(input.id),
21
- values: {
22
- name: input.name,
23
- description: input.description || "(no description)",
24
- extensions: input.extensions ?? {},
25
- status: "disabled",
26
- isInstalled: false
27
- }
28
- });
29
-
30
- // Create the tenant
31
- const result = await this.repository.execute(tenant);
32
- if (result.isFail()) {
33
- return Result.fail(result.error);
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
- export default UseCaseAbstraction.createImplementation({
39
- implementation: CreateTenantUseCase,
40
- dependencies: [IdentityContext, CreateTenantRepository]
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,"names":["CreateTenantUseCase","UseCaseAbstraction","CreateTenantRepository","Result","IdentityContext","NotAuthorizedError","Tenant","TenantId","constructor","identityContext","repository","execute","input","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 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"],"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,IAAI,CAAC,IAAI,CAACH,eAAe,CAACI,aAAa,CAAC,WAAW,CAAC,EAAE;MAClD,OAAOV,MAAM,CAACW,IAAI,CACd,IAAIT,kBAAkB,CAAC;QACnBU,OAAO,EAAE;MACb,CAAC,CACL,CAAC;IACL;IAEA,MAAMC,MAAM,GAAGV,MAAM,CAACW,IAAI,CAAC;MACvBC,EAAE,EAAEX,QAAQ,CAACU,IAAI,CAACL,KAAK,CAACM,EAAE,CAAC;MAC3BC,MAAM,EAAE;QACJC,IAAI,EAAER,KAAK,CAACQ,IAAI;QAChBC,WAAW,EAAET,KAAK,CAACS,WAAW,IAAI,kBAAkB;QACpDC,UAAU,EAAEV,KAAK,CAACU,UAAU,IAAI,CAAC,CAAC;QAClCC,MAAM,EAAE,UAAU;QAClBC,WAAW,EAAE;MACjB;IACJ,CAAC,CAAC;;IAEF;IACA,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACf,UAAU,CAACC,OAAO,CAACK,MAAM,CAAC;IACpD,IAAIS,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOvB,MAAM,CAACW,IAAI,CAACW,MAAM,CAACE,KAAK,CAAC;IACpC;IAEA,OAAOxB,MAAM,CAACyB,EAAE,CAACH,MAAM,CAACI,KAAK,CAAC;EAClC;AACJ;AAEA,eAAe5B,kBAAkB,CAAC6B,oBAAoB,CAAC;EACnDC,cAAc,EAAE/B,mBAAmB;EACnCgC,YAAY,EAAE,CAAC5B,eAAe,EAAEF,sBAAsB;AAC1D,CAAC,CAAC","ignoreList":[]}
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
- // USE CASE
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,"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":[]}
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
- 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
- }
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,"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":[]}
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
- 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;
5
+ constructor(deleteTenant){
6
+ this.deleteTenant = deleteTenant;
22
7
  }
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);
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
- export default EntryAfterDeleteEventHandler.createImplementation({
33
- implementation: DeleteTenantOnEntryDeleteHandler,
34
- dependencies: [DeleteTenantUseCase]
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,"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":[]}
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
- export const DeleteTenantOnEntryDeleteFeature = createFeature({
4
- name: "DeleteTenantOnEntryDelete",
5
- register(container) {
6
- // Register the event handler
7
- container.register(DeleteTenantOnEntryDeleteHandler);
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,"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":[]}
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 as UseCaseAbstraction } from "./abstractions.js";
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 as ApiCoreUpdateTenant } from "@webiny/api-core/features/tenancy/UpdateTenant";
7
- import { UpdateTenantUseCase as TenantManagerUpdateTenant } from "../UpdateTenant/abstractions.js";
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 { TenantBeforeDisableEvent, TenantAfterDisableEvent } from "./events.js";
9
+ import { TenantAfterDisableEvent, TenantBeforeDisableEvent } from "./events.js";
10
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
- 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
- // Get current tenant to verify it exists
26
- const getTenantResult = await this.tmGetTenantById.execute(tenantId);
27
- if (getTenantResult.isFail()) {
28
- return Result.fail(getTenantResult.error);
29
- }
30
- const tenant = getTenantResult.value;
31
-
32
- // Publish before event
33
- await this.eventPublisher.publish(new TenantBeforeDisableEvent({
34
- tenant
35
- }));
36
-
37
- // Update api-core tenant first
38
- const apiCoreResult = await this.coreUpdateTenant.execute(tenantId, {
39
- status: "disabled"
40
- });
41
- if (apiCoreResult.isFail()) {
42
- return Result.fail(new TenantPersistenceError(new Error(`Failed to update api-core tenant: ${apiCoreResult.error}`)));
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
- export default UseCaseAbstraction.createImplementation({
61
- implementation: DisableTenantUseCase,
62
- dependencies: [IdentityContext, EventPublisher, ApiCoreUpdateTenant, TenantManagerUpdateTenant, GetTenantByIdUseCase]
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