@webiny/tenant-manager 0.0.0-unstable.3c5210ad37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +36 -0
- package/README.md +11 -0
- package/TenantManager.d.ts +2 -0
- package/TenantManager.js +12 -0
- package/TenantManager.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenant.d.ts +6 -0
- package/admin/CurrentTenant/CurrentTenant.js +34 -0
- package/admin/CurrentTenant/CurrentTenant.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantGateway.d.ts +12 -0
- package/admin/CurrentTenant/CurrentTenantGateway.js +44 -0
- package/admin/CurrentTenant/CurrentTenantGateway.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.d.ts +12 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.js +30 -0
- package/admin/CurrentTenant/CurrentTenantPresenter.js.map +1 -0
- package/admin/CurrentTenant/CurrentTenantRepository.d.ts +15 -0
- package/admin/CurrentTenant/CurrentTenantRepository.js +37 -0
- package/admin/CurrentTenant/CurrentTenantRepository.js.map +1 -0
- package/admin/CurrentTenant/abstractions.d.ts +31 -0
- package/admin/CurrentTenant/abstractions.js +15 -0
- package/admin/CurrentTenant/abstractions.js.map +1 -0
- package/admin/CurrentTenant/feature.d.ts +3 -0
- package/admin/CurrentTenant/feature.js +20 -0
- package/admin/CurrentTenant/feature.js.map +1 -0
- package/admin/CurrentTenant/useCurrentTenant.d.ts +4 -0
- package/admin/CurrentTenant/useCurrentTenant.js +23 -0
- package/admin/CurrentTenant/useCurrentTenant.js.map +1 -0
- package/admin/CurrentTenantProvider.d.ts +2 -0
- package/admin/CurrentTenantProvider.js +12 -0
- package/admin/CurrentTenantProvider.js.map +1 -0
- package/admin/DisableTenant/DisableTenantGateway.d.ts +11 -0
- package/admin/DisableTenant/DisableTenantGateway.js +43 -0
- package/admin/DisableTenant/DisableTenantGateway.js.map +1 -0
- package/admin/DisableTenant/DisableTenantRepository.d.ts +10 -0
- package/admin/DisableTenant/DisableTenantRepository.js +15 -0
- package/admin/DisableTenant/DisableTenantRepository.js.map +1 -0
- package/admin/DisableTenant/DisableTenantUseCase.d.ts +10 -0
- package/admin/DisableTenant/DisableTenantUseCase.js +15 -0
- package/admin/DisableTenant/DisableTenantUseCase.js.map +1 -0
- package/admin/DisableTenant/abstractions.d.ts +21 -0
- package/admin/DisableTenant/abstractions.js +15 -0
- package/admin/DisableTenant/abstractions.js.map +1 -0
- package/admin/DisableTenant/feature.d.ts +3 -0
- package/admin/DisableTenant/feature.js +20 -0
- package/admin/DisableTenant/feature.js.map +1 -0
- package/admin/DisableTenant/index.d.ts +2 -0
- package/admin/DisableTenant/index.js +4 -0
- package/admin/DisableTenant/index.js.map +1 -0
- package/admin/DisableTenant/useDisableTenant.d.ts +4 -0
- package/admin/DisableTenant/useDisableTenant.js +27 -0
- package/admin/DisableTenant/useDisableTenant.js.map +1 -0
- package/admin/EnableTenant/EnableTenantGateway.d.ts +11 -0
- package/admin/EnableTenant/EnableTenantGateway.js +43 -0
- package/admin/EnableTenant/EnableTenantGateway.js.map +1 -0
- package/admin/EnableTenant/EnableTenantRepository.d.ts +10 -0
- package/admin/EnableTenant/EnableTenantRepository.js +15 -0
- package/admin/EnableTenant/EnableTenantRepository.js.map +1 -0
- package/admin/EnableTenant/EnableTenantUseCase.d.ts +10 -0
- package/admin/EnableTenant/EnableTenantUseCase.js +15 -0
- package/admin/EnableTenant/EnableTenantUseCase.js.map +1 -0
- package/admin/EnableTenant/abstractions.d.ts +21 -0
- package/admin/EnableTenant/abstractions.js +15 -0
- package/admin/EnableTenant/abstractions.js.map +1 -0
- package/admin/EnableTenant/feature.d.ts +3 -0
- package/admin/EnableTenant/feature.js +20 -0
- package/admin/EnableTenant/feature.js.map +1 -0
- package/admin/EnableTenant/index.d.ts +2 -0
- package/admin/EnableTenant/index.js +4 -0
- package/admin/EnableTenant/index.js.map +1 -0
- package/admin/EnableTenant/useEnableTenant.d.ts +4 -0
- package/admin/EnableTenant/useEnableTenant.js +23 -0
- package/admin/EnableTenant/useEnableTenant.js.map +1 -0
- package/admin/Extension.d.ts +2 -0
- package/admin/Extension.js +47 -0
- package/admin/Extension.js.map +1 -0
- package/admin/IsRootTenant.d.ts +13 -0
- package/admin/IsRootTenant.js +37 -0
- package/admin/IsRootTenant.js.map +1 -0
- package/admin/SecurityPermission.d.ts +2 -0
- package/admin/SecurityPermission.js +20 -0
- package/admin/SecurityPermission.js.map +1 -0
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.d.ts +8 -0
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js +42 -0
- package/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js.map +1 -0
- package/admin/TenantEntryList/EnableTenant/EnableTenant.d.ts +7 -0
- package/admin/TenantEntryList/EnableTenant/EnableTenant.js +19 -0
- package/admin/TenantEntryList/EnableTenant/EnableTenant.js.map +1 -0
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.d.ts +5 -0
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js +39 -0
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js.map +1 -0
- package/admin/TenantEntryList/FolderNameCell.d.ts +7 -0
- package/admin/TenantEntryList/FolderNameCell.js +29 -0
- package/admin/TenantEntryList/FolderNameCell.js.map +1 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.d.ts +7 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js +19 -0
- package/admin/TenantEntryList/InstallTenantButton/InstallTenant.js.map +1 -0
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.d.ts +16 -0
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js +17 -0
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js.map +1 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.d.ts +5 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js +46 -0
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js.map +1 -0
- package/admin/TenantEntryList/ManageTenant.d.ts +7 -0
- package/admin/TenantEntryList/ManageTenant.js +21 -0
- package/admin/TenantEntryList/ManageTenant.js.map +1 -0
- package/admin/TenantEntryList/TenantCell.d.ts +2 -0
- package/admin/TenantEntryList/TenantCell.js +39 -0
- package/admin/TenantEntryList/TenantCell.js.map +1 -0
- package/admin/TenantEntryList/TenantNameCell.d.ts +2 -0
- package/admin/TenantEntryList/TenantNameCell.js +54 -0
- package/admin/TenantEntryList/TenantNameCell.js.map +1 -0
- package/admin/TenantEntryList.d.ts +2 -0
- package/admin/TenantEntryList.js +71 -0
- package/admin/TenantEntryList.js.map +1 -0
- package/admin/TenantSelector.d.ts +2 -0
- package/admin/TenantSelector.js +39 -0
- package/admin/TenantSelector.js.map +1 -0
- package/admin/types.d.ts +7 -0
- package/admin/types.js +3 -0
- package/admin/types.js.map +1 -0
- package/api/Extension.d.ts +1 -0
- package/api/Extension.js +42 -0
- package/api/Extension.js.map +1 -0
- package/api/domain/TenantId.d.ts +3 -0
- package/api/domain/TenantId.js +12 -0
- package/api/domain/TenantId.js.map +1 -0
- package/api/domain/TenantModel.d.ts +11 -0
- package/api/domain/TenantModel.js +46 -0
- package/api/domain/TenantModel.js.map +1 -0
- package/api/domain/TenantModelExtension.d.ts +10 -0
- package/api/domain/TenantModelExtension.js +4 -0
- package/api/domain/TenantModelExtension.js.map +1 -0
- package/api/domain/errors.d.ts +33 -0
- package/api/domain/errors.js +63 -0
- package/api/domain/errors.js.map +1 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.d.ts +8 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.js +34 -0
- package/api/features/AddCmsPermissions/AddCmsPermissions.js.map +1 -0
- package/api/features/AddCmsPermissions/feature.d.ts +1 -0
- package/api/features/AddCmsPermissions/feature.js +10 -0
- package/api/features/AddCmsPermissions/feature.js.map +1 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.d.ts +24 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js +99 -0
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js.map +1 -0
- package/api/features/CreateAndInstallTenant/abstractions.d.ts +26 -0
- package/api/features/CreateAndInstallTenant/abstractions.js +9 -0
- package/api/features/CreateAndInstallTenant/abstractions.js.map +1 -0
- package/api/features/CreateAndInstallTenant/feature.d.ts +1 -0
- package/api/features/CreateAndInstallTenant/feature.js +11 -0
- package/api/features/CreateAndInstallTenant/feature.js.map +1 -0
- package/api/features/CreateTenant/CreateTenantRepository.d.ts +15 -0
- package/api/features/CreateTenant/CreateTenantRepository.js +48 -0
- package/api/features/CreateTenant/CreateTenantRepository.js.map +1 -0
- package/api/features/CreateTenant/CreateTenantUseCase.d.ts +14 -0
- package/api/features/CreateTenant/CreateTenantUseCase.js +43 -0
- package/api/features/CreateTenant/CreateTenantUseCase.js.map +1 -0
- package/api/features/CreateTenant/abstractions.d.ts +41 -0
- package/api/features/CreateTenant/abstractions.js +11 -0
- package/api/features/CreateTenant/abstractions.js.map +1 -0
- package/api/features/CreateTenant/feature.d.ts +1 -0
- package/api/features/CreateTenant/feature.js +15 -0
- package/api/features/CreateTenant/feature.js.map +1 -0
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.d.ts +11 -0
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js +37 -0
- package/api/features/DeleteTenantOnEntryDelete/DeleteTenantOnEntryDeleteHandler.js.map +1 -0
- package/api/features/DeleteTenantOnEntryDelete/feature.d.ts +1 -0
- package/api/features/DeleteTenantOnEntryDelete/feature.js +11 -0
- package/api/features/DeleteTenantOnEntryDelete/feature.js.map +1 -0
- package/api/features/DisableTenant/DisableTenantUseCase.d.ts +20 -0
- package/api/features/DisableTenant/DisableTenantUseCase.js +65 -0
- package/api/features/DisableTenant/DisableTenantUseCase.js.map +1 -0
- package/api/features/DisableTenant/abstractions.d.ts +19 -0
- package/api/features/DisableTenant/abstractions.js +4 -0
- package/api/features/DisableTenant/abstractions.js.map +1 -0
- package/api/features/DisableTenant/events.d.ts +27 -0
- package/api/features/DisableTenant/events.js +18 -0
- package/api/features/DisableTenant/events.js.map +1 -0
- package/api/features/DisableTenant/feature.d.ts +1 -0
- package/api/features/DisableTenant/feature.js +11 -0
- package/api/features/DisableTenant/feature.js.map +1 -0
- package/api/features/EnableTenant/EnableTenantUseCase.d.ts +20 -0
- package/api/features/EnableTenant/EnableTenantUseCase.js +67 -0
- package/api/features/EnableTenant/EnableTenantUseCase.js.map +1 -0
- package/api/features/EnableTenant/abstractions.d.ts +19 -0
- package/api/features/EnableTenant/abstractions.js +4 -0
- package/api/features/EnableTenant/abstractions.js.map +1 -0
- package/api/features/EnableTenant/events.d.ts +27 -0
- package/api/features/EnableTenant/events.js +18 -0
- package/api/features/EnableTenant/events.js.map +1 -0
- package/api/features/EnableTenant/feature.d.ts +1 -0
- package/api/features/EnableTenant/feature.js +11 -0
- package/api/features/EnableTenant/feature.js.map +1 -0
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.d.ts +17 -0
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js +35 -0
- package/api/features/GetCurrentTenant/GetCurrentTenantUseCase.js.map +1 -0
- package/api/features/GetCurrentTenant/abstractions.d.ts +24 -0
- package/api/features/GetCurrentTenant/abstractions.js +10 -0
- package/api/features/GetCurrentTenant/abstractions.js.map +1 -0
- package/api/features/GetCurrentTenant/feature.d.ts +1 -0
- package/api/features/GetCurrentTenant/feature.js +11 -0
- package/api/features/GetCurrentTenant/feature.js.map +1 -0
- package/api/features/GetTenantById/GetTenantByIdRepository.d.ts +17 -0
- package/api/features/GetTenantById/GetTenantByIdRepository.js +49 -0
- package/api/features/GetTenantById/GetTenantByIdRepository.js.map +1 -0
- package/api/features/GetTenantById/GetTenantByIdUseCase.d.ts +12 -0
- package/api/features/GetTenantById/GetTenantByIdUseCase.js +27 -0
- package/api/features/GetTenantById/GetTenantByIdUseCase.js.map +1 -0
- package/api/features/GetTenantById/abstractions.d.ts +38 -0
- package/api/features/GetTenantById/abstractions.js +15 -0
- package/api/features/GetTenantById/abstractions.js.map +1 -0
- package/api/features/GetTenantById/feature.d.ts +1 -0
- package/api/features/GetTenantById/feature.js +15 -0
- package/api/features/GetTenantById/feature.js.map +1 -0
- package/api/features/UpdateTenant/UpdateTenantRepository.d.ts +17 -0
- package/api/features/UpdateTenant/UpdateTenantRepository.js +58 -0
- package/api/features/UpdateTenant/UpdateTenantRepository.js.map +1 -0
- package/api/features/UpdateTenant/UpdateTenantUseCase.d.ts +12 -0
- package/api/features/UpdateTenant/UpdateTenantUseCase.js +21 -0
- package/api/features/UpdateTenant/UpdateTenantUseCase.js.map +1 -0
- package/api/features/UpdateTenant/abstractions.d.ts +39 -0
- package/api/features/UpdateTenant/abstractions.js +15 -0
- package/api/features/UpdateTenant/abstractions.js.map +1 -0
- package/api/features/UpdateTenant/feature.d.ts +1 -0
- package/api/features/UpdateTenant/feature.js +15 -0
- package/api/features/UpdateTenant/feature.js.map +1 -0
- package/api/graphql/CreateTenantSchema.d.ts +14 -0
- package/api/graphql/CreateTenantSchema.js +77 -0
- package/api/graphql/CreateTenantSchema.js.map +1 -0
- package/api/graphql/DisableTenantSchema.d.ts +8 -0
- package/api/graphql/DisableTenantSchema.js +35 -0
- package/api/graphql/DisableTenantSchema.js.map +1 -0
- package/api/graphql/EnableTenantSchema.d.ts +8 -0
- package/api/graphql/EnableTenantSchema.js +35 -0
- package/api/graphql/EnableTenantSchema.js.map +1 -0
- package/api/graphql/GetCurrentTenantSchema.d.ts +8 -0
- package/api/graphql/GetCurrentTenantSchema.js +53 -0
- package/api/graphql/GetCurrentTenantSchema.js.map +1 -0
- package/api/graphql/InstallTenantSchema.d.ts +8 -0
- package/api/graphql/InstallTenantSchema.js +50 -0
- package/api/graphql/InstallTenantSchema.js.map +1 -0
- package/exports/admin/tenancy.d.ts +7 -0
- package/exports/admin/tenancy.js +8 -0
- package/exports/admin/tenancy.js.map +1 -0
- package/exports/api/tenant-manager.d.ts +2 -0
- package/exports/api/tenant-manager.js +3 -0
- package/exports/api/tenant-manager.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +3 -0
- package/index.js.map +1 -0
- package/package.json +44 -0
- package/shared/Tenant.d.ts +21 -0
- package/shared/Tenant.js +26 -0
- package/shared/Tenant.js.map +1 -0
- package/shared/constants.d.ts +1 -0
- package/shared/constants.js +3 -0
- package/shared/constants.js.map +1 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EntryId } from "@webiny/api-headless-cms/exports/api/cms/entry.js";
|
|
2
|
+
export class TenantId {
|
|
3
|
+
static from(id) {
|
|
4
|
+
if (id) {
|
|
5
|
+
// Ensure we have a clean id, without the revision suffix.
|
|
6
|
+
return EntryId.from(id).id;
|
|
7
|
+
}
|
|
8
|
+
return EntryId.create().id;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=TenantId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EntryId","TenantId","from","id","create"],"sources":["TenantId.ts"],"sourcesContent":["import { EntryId } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\n\nexport class TenantId {\n static from(id?: string) {\n if (id) {\n // Ensure we have a clean id, without the revision suffix.\n return EntryId.from(id).id;\n }\n\n return EntryId.create().id;\n }\n}\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,mDAAmD;AAE3E,OAAO,MAAMC,QAAQ,CAAC;EAClB,OAAOC,IAAIA,CAACC,EAAW,EAAE;IACrB,IAAIA,EAAE,EAAE;MACJ;MACA,OAAOH,OAAO,CAACE,IAAI,CAACC,EAAE,CAAC,CAACA,EAAE;IAC9B;IAEA,OAAOH,OAAO,CAACI,MAAM,CAAC,CAAC,CAACD,EAAE;EAC9B;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ModelFactory } from "@webiny/api-headless-cms/features/modelBuilder/index.js";
|
|
2
|
+
import { TenantModelExtension } from "./TenantModelExtension.js";
|
|
3
|
+
declare class TenantModelFactory implements ModelFactory.Interface {
|
|
4
|
+
private extensions;
|
|
5
|
+
constructor(extensions: TenantModelExtension.Interface[]);
|
|
6
|
+
execute(builder: ModelFactory.Builder): Promise<import("@webiny/api-headless-cms/features/modelBuilder/index.js").PublicModelBuilder[]>;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: typeof TenantModelFactory & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-headless-cms/features/modelBuilder/abstractions.js").IModelFactory>;
|
|
10
|
+
};
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ModelFactory } from "@webiny/api-headless-cms/features/modelBuilder/index.js";
|
|
2
|
+
import { TenantModelExtension } from "./TenantModelExtension.js";
|
|
3
|
+
import { TENANT_MODEL_ID } from "../../shared/constants.js";
|
|
4
|
+
class TenantModelFactory {
|
|
5
|
+
constructor(extensions) {
|
|
6
|
+
this.extensions = extensions;
|
|
7
|
+
}
|
|
8
|
+
async execute(builder) {
|
|
9
|
+
const model = builder.public({
|
|
10
|
+
modelId: TENANT_MODEL_ID,
|
|
11
|
+
name: "Tenant",
|
|
12
|
+
group: "hidden"
|
|
13
|
+
}).description("Manage system tenants.").titleFieldId("name").icon("fas/building").singularApiName("Tenant").pluralApiName("Tenants").tags(["$publishing:false"]);
|
|
14
|
+
model.fields(fields => ({
|
|
15
|
+
name: fields.text().label("Name").description("Enter a tenant name").required().renderer("textInput"),
|
|
16
|
+
description: fields.longText().label("Description").description("Enter a short tenant description").renderer("textarea").required(),
|
|
17
|
+
status: fields.text().label("Status").defaultValue("disabled").renderer("hidden").predefinedValues([{
|
|
18
|
+
value: "enabled",
|
|
19
|
+
label: "Enabled"
|
|
20
|
+
}, {
|
|
21
|
+
value: "disabled",
|
|
22
|
+
label: "Disabled"
|
|
23
|
+
}]),
|
|
24
|
+
isInstalled: fields.boolean().label("Is installed?").renderer("hidden").defaultValue(false),
|
|
25
|
+
extensions: fields.object().renderer("passthrough")
|
|
26
|
+
})).layout([["name"], ["description"], ["extensions"]]);
|
|
27
|
+
for (const modifier of this.extensions) {
|
|
28
|
+
model.fields(fields => {
|
|
29
|
+
const extensions = fields.extend().object();
|
|
30
|
+
modifier.execute(extensions);
|
|
31
|
+
return {
|
|
32
|
+
extensions
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return [model];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export default ModelFactory.createImplementation({
|
|
40
|
+
implementation: TenantModelFactory,
|
|
41
|
+
dependencies: [[TenantModelExtension, {
|
|
42
|
+
multiple: true
|
|
43
|
+
}]]
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=TenantModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ModelFactory","TenantModelExtension","TENANT_MODEL_ID","TenantModelFactory","constructor","extensions","execute","builder","model","public","modelId","name","group","description","titleFieldId","icon","singularApiName","pluralApiName","tags","fields","text","label","required","renderer","longText","status","defaultValue","predefinedValues","value","isInstalled","boolean","object","layout","modifier","extend","createImplementation","implementation","dependencies","multiple"],"sources":["TenantModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TenantModelExtension } from \"./TenantModelExtension.js\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\n\nclass TenantModelFactory implements ModelFactory.Interface {\n constructor(private extensions: TenantModelExtension.Interface[]) {}\n\n async execute(builder: ModelFactory.Builder) {\n const model = builder\n .public({\n modelId: TENANT_MODEL_ID,\n name: \"Tenant\",\n group: \"hidden\"\n })\n .description(\"Manage system tenants.\")\n .titleFieldId(\"name\")\n .icon(\"fas/building\")\n .singularApiName(\"Tenant\")\n .pluralApiName(\"Tenants\")\n .tags([\"$publishing:false\"]);\n\n model\n .fields(fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .description(\"Enter a tenant name\")\n .required()\n .renderer(\"textInput\"),\n description: fields\n .longText()\n .label(\"Description\")\n .description(\"Enter a short tenant description\")\n .renderer(\"textarea\")\n .required(),\n status: fields\n .text()\n .label(\"Status\")\n .defaultValue(\"disabled\")\n .renderer(\"hidden\")\n .predefinedValues([\n {\n value: \"enabled\",\n label: \"Enabled\"\n },\n {\n value: \"disabled\",\n label: \"Disabled\"\n }\n ]),\n isInstalled: fields\n .boolean()\n .label(\"Is installed?\")\n .renderer(\"hidden\")\n .defaultValue(false),\n extensions: fields.object().renderer(\"passthrough\")\n }))\n .layout([[\"name\"], [\"description\"], [\"extensions\"]]);\n\n for (const modifier of this.extensions) {\n model.fields(fields => {\n const extensions = fields.extend().object();\n modifier.execute(extensions);\n\n return { extensions };\n });\n }\n\n return [model];\n }\n}\n\nexport default ModelFactory.createImplementation({\n implementation: TenantModelFactory,\n dependencies: [[TenantModelExtension, { multiple: true }]]\n});\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,yDAAyD;AACtF,SAASC,oBAAoB;AAC7B,SAASC,eAAe;AAExB,MAAMC,kBAAkB,CAAmC;EACvDC,WAAWA,CAASC,UAA4C,EAAE;IAAA,KAA9CA,UAA4C,GAA5CA,UAA4C;EAAG;EAEnE,MAAMC,OAAOA,CAACC,OAA6B,EAAE;IACzC,MAAMC,KAAK,GAAGD,OAAO,CAChBE,MAAM,CAAC;MACJC,OAAO,EAAER,eAAe;MACxBS,IAAI,EAAE,QAAQ;MACdC,KAAK,EAAE;IACX,CAAC,CAAC,CACDC,WAAW,CAAC,wBAAwB,CAAC,CACrCC,YAAY,CAAC,MAAM,CAAC,CACpBC,IAAI,CAAC,cAAc,CAAC,CACpBC,eAAe,CAAC,QAAQ,CAAC,CACzBC,aAAa,CAAC,SAAS,CAAC,CACxBC,IAAI,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAEhCV,KAAK,CACAW,MAAM,CAACA,MAAM,KAAK;MACfR,IAAI,EAAEQ,MAAM,CACPC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,MAAM,CAAC,CACbR,WAAW,CAAC,qBAAqB,CAAC,CAClCS,QAAQ,CAAC,CAAC,CACVC,QAAQ,CAAC,WAAW,CAAC;MAC1BV,WAAW,EAAEM,MAAM,CACdK,QAAQ,CAAC,CAAC,CACVH,KAAK,CAAC,aAAa,CAAC,CACpBR,WAAW,CAAC,kCAAkC,CAAC,CAC/CU,QAAQ,CAAC,UAAU,CAAC,CACpBD,QAAQ,CAAC,CAAC;MACfG,MAAM,EAAEN,MAAM,CACTC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,QAAQ,CAAC,CACfK,YAAY,CAAC,UAAU,CAAC,CACxBH,QAAQ,CAAC,QAAQ,CAAC,CAClBI,gBAAgB,CAAC,CACd;QACIC,KAAK,EAAE,SAAS;QAChBP,KAAK,EAAE;MACX,CAAC,EACD;QACIO,KAAK,EAAE,UAAU;QACjBP,KAAK,EAAE;MACX,CAAC,CACJ,CAAC;MACNQ,WAAW,EAAEV,MAAM,CACdW,OAAO,CAAC,CAAC,CACTT,KAAK,CAAC,eAAe,CAAC,CACtBE,QAAQ,CAAC,QAAQ,CAAC,CAClBG,YAAY,CAAC,KAAK,CAAC;MACxBrB,UAAU,EAAEc,MAAM,CAACY,MAAM,CAAC,CAAC,CAACR,QAAQ,CAAC,aAAa;IACtD,CAAC,CAAC,CAAC,CACFS,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAExD,KAAK,MAAMC,QAAQ,IAAI,IAAI,CAAC5B,UAAU,EAAE;MACpCG,KAAK,CAACW,MAAM,CAACA,MAAM,IAAI;QACnB,MAAMd,UAAU,GAAGc,MAAM,CAACe,MAAM,CAAC,CAAC,CAACH,MAAM,CAAC,CAAC;QAC3CE,QAAQ,CAAC3B,OAAO,CAACD,UAAU,CAAC;QAE5B,OAAO;UAAEA;QAAW,CAAC;MACzB,CAAC,CAAC;IACN;IAEA,OAAO,CAACG,KAAK,CAAC;EAClB;AACJ;AAEA,eAAeR,YAAY,CAACmC,oBAAoB,CAAC;EAC7CC,cAAc,EAAEjC,kBAAkB;EAClCkC,YAAY,EAAE,CAAC,CAACpC,oBAAoB,EAAE;IAAEqC,QAAQ,EAAE;EAAK,CAAC,CAAC;AAC7D,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IObjectFieldBuilder } from "@webiny/api-headless-cms/features/modelBuilder/fields/ObjectFieldType.js";
|
|
2
|
+
export type IExtension = Pick<IObjectFieldBuilder, "fields" | "layout">;
|
|
3
|
+
export interface ITenantModelExtension {
|
|
4
|
+
execute(extension: IExtension): void;
|
|
5
|
+
}
|
|
6
|
+
export declare const TenantModelExtension: import("@webiny/di").Abstraction<ITenantModelExtension>;
|
|
7
|
+
export declare namespace TenantModelExtension {
|
|
8
|
+
type Interface = ITenantModelExtension;
|
|
9
|
+
type Extension = IExtension;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createAbstraction","TenantModelExtension"],"sources":["TenantModelExtension.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { IObjectFieldBuilder } from \"@webiny/api-headless-cms/features/modelBuilder/fields/ObjectFieldType.js\";\n\nexport type IExtension = Pick<IObjectFieldBuilder, \"fields\" | \"layout\">;\n\nexport interface ITenantModelExtension {\n execute(extension: IExtension): void;\n}\n\nexport const TenantModelExtension =\n createAbstraction<ITenantModelExtension>(\"TenantModelExtension\");\n\nexport namespace TenantModelExtension {\n export type Interface = ITenantModelExtension;\n export type Extension = IExtension;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AASvD,OAAO,MAAMC,oBAAoB,GAC7BD,iBAAiB,CAAwB,sBAAsB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BaseError } from "@webiny/feature/api";
|
|
2
|
+
export declare class TenantNotFoundError extends BaseError {
|
|
3
|
+
readonly code: "Tenant/NotFound";
|
|
4
|
+
constructor(id: string);
|
|
5
|
+
}
|
|
6
|
+
export declare class TenantModelNotFoundError extends BaseError {
|
|
7
|
+
readonly code: "Tenant/ModelNotFound";
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
export declare class TenantPersistenceError extends BaseError<{
|
|
11
|
+
error: Error;
|
|
12
|
+
}> {
|
|
13
|
+
readonly code: "Tenant/Persist";
|
|
14
|
+
constructor(error: Error);
|
|
15
|
+
}
|
|
16
|
+
export declare class TenantCreationError extends BaseError<{
|
|
17
|
+
error: Error;
|
|
18
|
+
}> {
|
|
19
|
+
readonly code: "Tenant/Create";
|
|
20
|
+
constructor(error: Error);
|
|
21
|
+
}
|
|
22
|
+
export declare class TenantInstallationError extends BaseError<{
|
|
23
|
+
error: Error;
|
|
24
|
+
}> {
|
|
25
|
+
readonly code: "Tenant/Install";
|
|
26
|
+
constructor(error: Error);
|
|
27
|
+
}
|
|
28
|
+
export declare class TenantUpdateError extends BaseError<{
|
|
29
|
+
error: Error;
|
|
30
|
+
}> {
|
|
31
|
+
readonly code: "Tenant/Update";
|
|
32
|
+
constructor(error: Error);
|
|
33
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BaseError } from "@webiny/feature/api";
|
|
2
|
+
export class TenantNotFoundError extends BaseError {
|
|
3
|
+
code = "Tenant/NotFound";
|
|
4
|
+
constructor(id) {
|
|
5
|
+
super({
|
|
6
|
+
message: `Tenant with id "${id}" was not found!`
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class TenantModelNotFoundError extends BaseError {
|
|
11
|
+
code = "Tenant/ModelNotFound";
|
|
12
|
+
constructor() {
|
|
13
|
+
super({
|
|
14
|
+
message: `Tenant model was not found!`
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class TenantPersistenceError extends BaseError {
|
|
19
|
+
code = "Tenant/Persist";
|
|
20
|
+
constructor(error) {
|
|
21
|
+
super({
|
|
22
|
+
message: error.message,
|
|
23
|
+
data: {
|
|
24
|
+
error
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class TenantCreationError extends BaseError {
|
|
30
|
+
code = "Tenant/Create";
|
|
31
|
+
constructor(error) {
|
|
32
|
+
super({
|
|
33
|
+
message: error.message,
|
|
34
|
+
data: {
|
|
35
|
+
error
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class TenantInstallationError extends BaseError {
|
|
41
|
+
code = "Tenant/Install";
|
|
42
|
+
constructor(error) {
|
|
43
|
+
super({
|
|
44
|
+
message: error.message,
|
|
45
|
+
data: {
|
|
46
|
+
error
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class TenantUpdateError extends BaseError {
|
|
52
|
+
code = "Tenant/Update";
|
|
53
|
+
constructor(error) {
|
|
54
|
+
super({
|
|
55
|
+
message: error.message,
|
|
56
|
+
data: {
|
|
57
|
+
error
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BaseError","TenantNotFoundError","code","constructor","id","message","TenantModelNotFoundError","TenantPersistenceError","error","data","TenantCreationError","TenantInstallationError","TenantUpdateError"],"sources":["errors.ts"],"sourcesContent":["import { BaseError } from \"@webiny/feature/api\";\n\nexport class TenantNotFoundError extends BaseError {\n override readonly code = \"Tenant/NotFound\" as const;\n\n constructor(id: string) {\n super({ message: `Tenant with id \"${id}\" was not found!` });\n }\n}\n\nexport class TenantModelNotFoundError extends BaseError {\n override readonly code = \"Tenant/ModelNotFound\" as const;\n\n constructor() {\n super({ message: `Tenant model was not found!` });\n }\n}\n\nexport class TenantPersistenceError extends BaseError<{ error: Error }> {\n override readonly code = \"Tenant/Persist\" as const;\n\n constructor(error: Error) {\n super({ message: error.message, data: { error } });\n }\n}\n\nexport class TenantCreationError extends BaseError<{ error: Error }> {\n override readonly code = \"Tenant/Create\" as const;\n\n constructor(error: Error) {\n super({ message: error.message, data: { error } });\n }\n}\n\nexport class TenantInstallationError extends BaseError<{ error: Error }> {\n override readonly code = \"Tenant/Install\" as const;\n\n constructor(error: Error) {\n super({ message: error.message, data: { error } });\n }\n}\n\nexport class TenantUpdateError extends BaseError<{ error: Error }> {\n override readonly code = \"Tenant/Update\" as const;\n\n constructor(error: Error) {\n super({ message: error.message, data: { error } });\n }\n}\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,qBAAqB;AAE/C,OAAO,MAAMC,mBAAmB,SAASD,SAAS,CAAC;EAC7BE,IAAI,GAAG,iBAAiB;EAE1CC,WAAWA,CAACC,EAAU,EAAE;IACpB,KAAK,CAAC;MAAEC,OAAO,EAAE,mBAAmBD,EAAE;IAAmB,CAAC,CAAC;EAC/D;AACJ;AAEA,OAAO,MAAME,wBAAwB,SAASN,SAAS,CAAC;EAClCE,IAAI,GAAG,sBAAsB;EAE/CC,WAAWA,CAAA,EAAG;IACV,KAAK,CAAC;MAAEE,OAAO,EAAE;IAA8B,CAAC,CAAC;EACrD;AACJ;AAEA,OAAO,MAAME,sBAAsB,SAASP,SAAS,CAAmB;EAClDE,IAAI,GAAG,gBAAgB;EAEzCC,WAAWA,CAACK,KAAY,EAAE;IACtB,KAAK,CAAC;MAAEH,OAAO,EAAEG,KAAK,CAACH,OAAO;MAAEI,IAAI,EAAE;QAAED;MAAM;IAAE,CAAC,CAAC;EACtD;AACJ;AAEA,OAAO,MAAME,mBAAmB,SAASV,SAAS,CAAmB;EAC/CE,IAAI,GAAG,eAAe;EAExCC,WAAWA,CAACK,KAAY,EAAE;IACtB,KAAK,CAAC;MAAEH,OAAO,EAAEG,KAAK,CAACH,OAAO;MAAEI,IAAI,EAAE;QAAED;MAAM;IAAE,CAAC,CAAC;EACtD;AACJ;AAEA,OAAO,MAAMG,uBAAuB,SAASX,SAAS,CAAmB;EACnDE,IAAI,GAAG,gBAAgB;EAEzCC,WAAWA,CAACK,KAAY,EAAE;IACtB,KAAK,CAAC;MAAEH,OAAO,EAAEG,KAAK,CAACH,OAAO;MAAEI,IAAI,EAAE;QAAED;MAAM;IAAE,CAAC,CAAC;EACtD;AACJ;AAEA,OAAO,MAAMI,iBAAiB,SAASZ,SAAS,CAAmB;EAC7CE,IAAI,GAAG,eAAe;EAExCC,WAAWA,CAACK,KAAY,EAAE;IACtB,KAAK,CAAC;MAAEH,OAAO,EAAEG,KAAK,CAACH,OAAO;MAAEI,IAAI,EAAE;QAAED;MAAM;IAAE,CAAC,CAAC;EACtD;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PermissionTransformer } from "@webiny/api-core/features/security/authorization/AuthorizationContext/abstractions.js";
|
|
2
|
+
declare class AddCmsPermissions implements PermissionTransformer.Interface {
|
|
3
|
+
execute(permission: PermissionTransformer.Permission): PermissionTransformer.Permission | PermissionTransformer.Permission[];
|
|
4
|
+
}
|
|
5
|
+
declare const _default: typeof AddCmsPermissions & {
|
|
6
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/security/authorization/AuthorizationContext/abstractions.js").IPermissionTransformer>;
|
|
7
|
+
};
|
|
8
|
+
export default _default;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { PermissionTransformer } from "@webiny/api-core/features/security/authorization/AuthorizationContext/abstractions.js";
|
|
2
|
+
class AddCmsPermissions {
|
|
3
|
+
execute(permission) {
|
|
4
|
+
if (permission.name !== "tm.*") {
|
|
5
|
+
return permission;
|
|
6
|
+
}
|
|
7
|
+
return [permission, {
|
|
8
|
+
name: "cms.endpoint.manage"
|
|
9
|
+
}, {
|
|
10
|
+
name: "cms.contentModel",
|
|
11
|
+
own: false,
|
|
12
|
+
rwd: "r",
|
|
13
|
+
pw: "",
|
|
14
|
+
models: ["tenant"]
|
|
15
|
+
}, {
|
|
16
|
+
name: "cms.contentModelGroup",
|
|
17
|
+
own: false,
|
|
18
|
+
rwd: "r",
|
|
19
|
+
pw: "",
|
|
20
|
+
groups: ["hidden"]
|
|
21
|
+
}, {
|
|
22
|
+
name: "cms.contentEntry",
|
|
23
|
+
own: false,
|
|
24
|
+
rwd: "rwd",
|
|
25
|
+
pw: ""
|
|
26
|
+
}];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export default PermissionTransformer.createImplementation({
|
|
30
|
+
implementation: AddCmsPermissions,
|
|
31
|
+
dependencies: []
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=AddCmsPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["PermissionTransformer","AddCmsPermissions","execute","permission","name","own","rwd","pw","models","groups","createImplementation","implementation","dependencies"],"sources":["AddCmsPermissions.ts"],"sourcesContent":["import { PermissionTransformer } from \"@webiny/api-core/features/security/authorization/AuthorizationContext/abstractions.js\";\n\nclass AddCmsPermissions implements PermissionTransformer.Interface {\n execute(permission: PermissionTransformer.Permission) {\n if (permission.name !== \"tm.*\") {\n return permission;\n }\n\n return [\n permission,\n {\n name: \"cms.endpoint.manage\"\n },\n {\n name: \"cms.contentModel\",\n own: false,\n rwd: \"r\",\n pw: \"\",\n models: [\"tenant\"]\n },\n {\n name: \"cms.contentModelGroup\",\n own: false,\n rwd: \"r\",\n pw: \"\",\n groups: [\"hidden\"]\n },\n {\n name: \"cms.contentEntry\",\n own: false,\n rwd: \"rwd\",\n pw: \"\"\n }\n ];\n }\n}\n\nexport default PermissionTransformer.createImplementation({\n implementation: AddCmsPermissions,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,qBAAqB,QAAQ,uFAAuF;AAE7H,MAAMC,iBAAiB,CAA4C;EAC/DC,OAAOA,CAACC,UAA4C,EAAE;IAClD,IAAIA,UAAU,CAACC,IAAI,KAAK,MAAM,EAAE;MAC5B,OAAOD,UAAU;IACrB;IAEA,OAAO,CACHA,UAAU,EACV;MACIC,IAAI,EAAE;IACV,CAAC,EACD;MACIA,IAAI,EAAE,kBAAkB;MACxBC,GAAG,EAAE,KAAK;MACVC,GAAG,EAAE,GAAG;MACRC,EAAE,EAAE,EAAE;MACNC,MAAM,EAAE,CAAC,QAAQ;IACrB,CAAC,EACD;MACIJ,IAAI,EAAE,uBAAuB;MAC7BC,GAAG,EAAE,KAAK;MACVC,GAAG,EAAE,GAAG;MACRC,EAAE,EAAE,EAAE;MACNE,MAAM,EAAE,CAAC,QAAQ;IACrB,CAAC,EACD;MACIL,IAAI,EAAE,kBAAkB;MACxBC,GAAG,EAAE,KAAK;MACVC,GAAG,EAAE,KAAK;MACVC,EAAE,EAAE;IACR,CAAC,CACJ;EACL;AACJ;AAEA,eAAeP,qBAAqB,CAACU,oBAAoB,CAAC;EACtDC,cAAc,EAAEV,iBAAiB;EACjCW,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const AddCmsPermissionsFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import AddCmsPermissions from "./AddCmsPermissions.js";
|
|
3
|
+
export const AddCmsPermissionsFeature = createFeature({
|
|
4
|
+
name: "AddCmsPermissions",
|
|
5
|
+
register(container) {
|
|
6
|
+
container.register(AddCmsPermissions);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createFeature","AddCmsPermissions","AddCmsPermissionsFeature","name","register","container"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport AddCmsPermissions from \"./AddCmsPermissions.js\";\n\nexport const AddCmsPermissionsFeature = createFeature({\n name: \"AddCmsPermissions\",\n register(container) {\n container.register(AddCmsPermissions);\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,OAAOC,iBAAiB;AAExB,OAAO,MAAMC,wBAAwB,GAAGF,aAAa,CAAC;EAClDG,IAAI,EAAE,mBAAmB;EACzBC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACH,iBAAiB,CAAC;EACzC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { Tenant } from "../../../shared/Tenant.js";
|
|
3
|
+
import { GetTenantByIdUseCase } from "../GetTenantById/abstractions.js";
|
|
4
|
+
import { UpdateTenantUseCase } from "../UpdateTenant/abstractions.js";
|
|
5
|
+
import { CreateAndInstallTenantUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
6
|
+
import * as Tenancy from "@webiny/api-core/exports/api/tenancy.js";
|
|
7
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
8
|
+
declare class CreateAndInstallTenantUseCase implements UseCaseAbstraction.Interface {
|
|
9
|
+
private identityContext;
|
|
10
|
+
private getTenantByIdUseCase;
|
|
11
|
+
private updateTenantUseCase;
|
|
12
|
+
private coreGetTenantById;
|
|
13
|
+
private coreCreateTenant;
|
|
14
|
+
private coreUpdateTenant;
|
|
15
|
+
private coreDeleteTenant;
|
|
16
|
+
private coreInstallTenant;
|
|
17
|
+
constructor(identityContext: IdentityContext.Interface, getTenantByIdUseCase: GetTenantByIdUseCase.Interface, updateTenantUseCase: UpdateTenantUseCase.Interface, coreGetTenantById: Tenancy.GetTenantByIdUseCase.Interface, coreCreateTenant: Tenancy.CreateTenantUseCase.Interface, coreUpdateTenant: Tenancy.UpdateTenantUseCase.Interface, coreDeleteTenant: Tenancy.DeleteTenantUseCase.Interface, coreInstallTenant: Tenancy.InstallTenantUseCase.Interface);
|
|
18
|
+
execute(tenantId: string): Promise<Result<Tenant, UseCaseAbstraction.Error>>;
|
|
19
|
+
private markTenantInstalled;
|
|
20
|
+
}
|
|
21
|
+
declare const _default: typeof CreateAndInstallTenantUseCase & {
|
|
22
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICreateAndInstallTenantUseCase>;
|
|
23
|
+
};
|
|
24
|
+
export default _default;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { EntryId } from "@webiny/api-headless-cms/domain/contentEntry/EntryId.js";
|
|
3
|
+
import { TenantCreationError, TenantInstallationError, TenantUpdateError } from "../../domain/errors.js";
|
|
4
|
+
import { GetTenantByIdUseCase } from "../GetTenantById/abstractions.js";
|
|
5
|
+
import { UpdateTenantUseCase } from "../UpdateTenant/abstractions.js";
|
|
6
|
+
import { CreateAndInstallTenantUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
7
|
+
import * as Tenancy from "@webiny/api-core/exports/api/tenancy.js";
|
|
8
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
9
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
10
|
+
class CreateAndInstallTenantUseCase {
|
|
11
|
+
constructor(identityContext,
|
|
12
|
+
// Tenant manager deps
|
|
13
|
+
getTenantByIdUseCase, updateTenantUseCase,
|
|
14
|
+
// Core tenancy deps
|
|
15
|
+
coreGetTenantById, coreCreateTenant, coreUpdateTenant, coreDeleteTenant, coreInstallTenant) {
|
|
16
|
+
this.identityContext = identityContext;
|
|
17
|
+
this.getTenantByIdUseCase = getTenantByIdUseCase;
|
|
18
|
+
this.updateTenantUseCase = updateTenantUseCase;
|
|
19
|
+
this.coreGetTenantById = coreGetTenantById;
|
|
20
|
+
this.coreCreateTenant = coreCreateTenant;
|
|
21
|
+
this.coreUpdateTenant = coreUpdateTenant;
|
|
22
|
+
this.coreDeleteTenant = coreDeleteTenant;
|
|
23
|
+
this.coreInstallTenant = coreInstallTenant;
|
|
24
|
+
}
|
|
25
|
+
async execute(tenantId) {
|
|
26
|
+
// Authorization checks
|
|
27
|
+
if (!this.identityContext.getPermission("tm.tenant")) {
|
|
28
|
+
return Result.fail(new NotAuthorizedError({
|
|
29
|
+
message: "Not authorized to create tenants!"
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
const entryId = EntryId.from(tenantId);
|
|
33
|
+
|
|
34
|
+
// Get tenant details
|
|
35
|
+
const tenantResult = await this.getTenantByIdUseCase.execute(entryId.id);
|
|
36
|
+
if (tenantResult.isFail()) {
|
|
37
|
+
return Result.fail(tenantResult.error);
|
|
38
|
+
}
|
|
39
|
+
const tenant = tenantResult.value;
|
|
40
|
+
const existingTenantResult = await this.coreGetTenantById.execute(tenant.id);
|
|
41
|
+
|
|
42
|
+
// If core tenant already exists with this same ID, we mark the Tenant Manager tenant installed.
|
|
43
|
+
if (existingTenantResult.isOk()) {
|
|
44
|
+
// Update the core tenant, and set it to `active`
|
|
45
|
+
await this.coreUpdateTenant.execute(tenant.id, {
|
|
46
|
+
name: tenant.values.name,
|
|
47
|
+
description: tenant.values.description,
|
|
48
|
+
status: "enabled"
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Mark tenant installed, and exit early.
|
|
52
|
+
return this.markTenantInstalled(tenant);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Create tenant
|
|
56
|
+
const createTenantResult = await this.coreCreateTenant.execute({
|
|
57
|
+
id: entryId.id,
|
|
58
|
+
name: tenant.values.name,
|
|
59
|
+
parent: "root",
|
|
60
|
+
description: tenant.values.name,
|
|
61
|
+
tags: []
|
|
62
|
+
});
|
|
63
|
+
if (createTenantResult.isFail()) {
|
|
64
|
+
return Result.fail(new TenantCreationError(createTenantResult.error));
|
|
65
|
+
}
|
|
66
|
+
const createdTenant = createTenantResult.value;
|
|
67
|
+
|
|
68
|
+
// Install tenant
|
|
69
|
+
const installResult = await this.coreInstallTenant.execute({
|
|
70
|
+
tenant: createdTenant,
|
|
71
|
+
installationInput: []
|
|
72
|
+
});
|
|
73
|
+
if (installResult.isFail()) {
|
|
74
|
+
// Delete tenant if installation failed.
|
|
75
|
+
await this.coreDeleteTenant.execute(createdTenant.id);
|
|
76
|
+
return Result.fail(new TenantInstallationError(installResult.error));
|
|
77
|
+
}
|
|
78
|
+
return this.markTenantInstalled(tenant);
|
|
79
|
+
}
|
|
80
|
+
async markTenantInstalled(tenant) {
|
|
81
|
+
// Update tenant entry to mark as installed
|
|
82
|
+
const updateResult = await this.updateTenantUseCase.execute(tenant.id, {
|
|
83
|
+
status: "enabled",
|
|
84
|
+
isInstalled: true
|
|
85
|
+
});
|
|
86
|
+
if (updateResult.isFail()) {
|
|
87
|
+
return Result.fail(new TenantUpdateError(updateResult.error));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Return updated tenant
|
|
91
|
+
return Result.ok(updateResult.value);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export default UseCaseAbstraction.createImplementation({
|
|
95
|
+
implementation: CreateAndInstallTenantUseCase,
|
|
96
|
+
dependencies: [IdentityContext, GetTenantByIdUseCase, UpdateTenantUseCase, Tenancy.GetTenantByIdUseCase, Tenancy.CreateTenantUseCase, Tenancy.UpdateTenantUseCase, Tenancy.DeleteTenantUseCase, Tenancy.InstallTenantUseCase]
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=CreateAndInstallTenantUseCase.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
3
|
+
import type { Tenant } from "../../../shared/Tenant.js";
|
|
4
|
+
import type { TenantCreationError, TenantInstallationError, TenantUpdateError, TenantNotFoundError, TenantPersistenceError, TenantModelNotFoundError } from "../../domain/errors.js";
|
|
5
|
+
/**
|
|
6
|
+
* CreateAndInstallTenant Use Case
|
|
7
|
+
*/
|
|
8
|
+
export interface ICreateAndInstallTenantUseCase {
|
|
9
|
+
execute(tenantId: string): Promise<Result<Tenant, UseCaseError>>;
|
|
10
|
+
}
|
|
11
|
+
export interface ICreateAndInstallTenantUseCaseErrors {
|
|
12
|
+
tenantCreation: TenantCreationError;
|
|
13
|
+
tenantInstallation: TenantInstallationError;
|
|
14
|
+
notFound: TenantNotFoundError;
|
|
15
|
+
notAuthorized: NotAuthorizedError;
|
|
16
|
+
persistence: TenantPersistenceError;
|
|
17
|
+
tenantUpdate: TenantUpdateError;
|
|
18
|
+
modelNotFoundError: TenantModelNotFoundError;
|
|
19
|
+
}
|
|
20
|
+
type UseCaseError = ICreateAndInstallTenantUseCaseErrors[keyof ICreateAndInstallTenantUseCaseErrors];
|
|
21
|
+
export declare const CreateAndInstallTenantUseCase: import("@webiny/di").Abstraction<ICreateAndInstallTenantUseCase>;
|
|
22
|
+
export declare namespace CreateAndInstallTenantUseCase {
|
|
23
|
+
type Interface = ICreateAndInstallTenantUseCase;
|
|
24
|
+
type Error = UseCaseError;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CreateAndInstallTenant Use Case
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const CreateAndInstallTenantUseCase = createAbstraction("TenantManager/CreateAndInstallTenantUseCase");
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CreateAndInstallTenantFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
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
|
+
}
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Tenant } from "../../../shared/Tenant.js";
|
|
2
|
+
import { CreateTenantRepository as RepositoryAbstraction } from "./abstractions.js";
|
|
3
|
+
import { Result } from "@webiny/feature/api";
|
|
4
|
+
import { CreateEntryUseCase } from "@webiny/api-headless-cms/exports/api/cms/entry.js";
|
|
5
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/exports/api/cms/model";
|
|
6
|
+
declare class CreateTenantRepository implements RepositoryAbstraction.Interface {
|
|
7
|
+
private getModelUseCase;
|
|
8
|
+
private createEntryUseCase;
|
|
9
|
+
constructor(getModelUseCase: GetModelUseCase.Interface, createEntryUseCase: CreateEntryUseCase.Interface);
|
|
10
|
+
execute(tenant: Tenant): Promise<Result<Tenant, RepositoryAbstraction.Error>>;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: typeof CreateTenantRepository & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICreateTenantRepository>;
|
|
14
|
+
};
|
|
15
|
+
export default _default;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { TenantCreationError, TenantModelNotFoundError } from "../../domain/errors.js";
|
|
2
|
+
import { CreateTenantRepository as RepositoryAbstraction } from "./abstractions.js";
|
|
3
|
+
import { Result } from "@webiny/feature/api";
|
|
4
|
+
import { CreateEntryUseCase } from "@webiny/api-headless-cms/exports/api/cms/entry.js";
|
|
5
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/exports/api/cms/model";
|
|
6
|
+
import { TENANT_MODEL_ID } from "../../../shared/constants.js";
|
|
7
|
+
class CreateTenantRepository {
|
|
8
|
+
constructor(getModelUseCase, createEntryUseCase) {
|
|
9
|
+
this.getModelUseCase = getModelUseCase;
|
|
10
|
+
this.createEntryUseCase = createEntryUseCase;
|
|
11
|
+
}
|
|
12
|
+
async execute(tenant) {
|
|
13
|
+
try {
|
|
14
|
+
// Get the tenant model
|
|
15
|
+
const modelResult = await this.getModelUseCase.execute(TENANT_MODEL_ID);
|
|
16
|
+
if (modelResult.isFail()) {
|
|
17
|
+
return Result.fail(new TenantModelNotFoundError());
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Prepare tenant values with default isInstalled: false
|
|
21
|
+
const tenantValues = {
|
|
22
|
+
name: tenant.values.name,
|
|
23
|
+
status: tenant.values.status,
|
|
24
|
+
description: tenant.values.description,
|
|
25
|
+
isInstalled: false,
|
|
26
|
+
extensions: tenant.values.extensions || {}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// Create the tenant entry
|
|
30
|
+
const createResult = await this.createEntryUseCase.execute(modelResult.value, {
|
|
31
|
+
id: tenant.id,
|
|
32
|
+
values: tenantValues
|
|
33
|
+
});
|
|
34
|
+
if (createResult.isFail()) {
|
|
35
|
+
return Result.fail(new TenantCreationError(createResult.error));
|
|
36
|
+
}
|
|
37
|
+
return Result.ok(tenant);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
return Result.fail(new TenantCreationError(error));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export default RepositoryAbstraction.createImplementation({
|
|
44
|
+
implementation: CreateTenantRepository,
|
|
45
|
+
dependencies: [GetModelUseCase, CreateEntryUseCase]
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=CreateTenantRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TenantCreationError","TenantModelNotFoundError","CreateTenantRepository","RepositoryAbstraction","Result","CreateEntryUseCase","GetModelUseCase","TENANT_MODEL_ID","constructor","getModelUseCase","createEntryUseCase","execute","tenant","modelResult","isFail","fail","tenantValues","name","values","status","description","isInstalled","extensions","createResult","value","id","error","ok","createImplementation","implementation","dependencies"],"sources":["CreateTenantRepository.ts"],"sourcesContent":["import { Tenant, TenantValues } from \"~/shared/Tenant.js\";\nimport { TenantCreationError, TenantModelNotFoundError } from \"../../domain/errors.js\";\nimport { CreateTenantRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/exports/api/cms/model\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\n\nclass CreateTenantRepository implements RepositoryAbstraction.Interface {\n constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private createEntryUseCase: CreateEntryUseCase.Interface\n ) {}\n\n async execute(tenant: Tenant): Promise<Result<Tenant, RepositoryAbstraction.Error>> {\n try {\n // Get the tenant model\n const modelResult = await this.getModelUseCase.execute(TENANT_MODEL_ID);\n if (modelResult.isFail()) {\n return Result.fail(new TenantModelNotFoundError());\n }\n\n // Prepare tenant values with default isInstalled: false\n const tenantValues: TenantValues = {\n name: tenant.values.name,\n status: tenant.values.status,\n description: tenant.values.description,\n isInstalled: false,\n extensions: tenant.values.extensions || {}\n };\n\n // Create the tenant entry\n const createResult = await this.createEntryUseCase.execute(modelResult.value, {\n id: tenant.id,\n values: tenantValues\n });\n\n if (createResult.isFail()) {\n return Result.fail(new TenantCreationError(createResult.error));\n }\n\n return Result.ok(tenant);\n } catch (error) {\n return Result.fail(new TenantCreationError(error as Error));\n }\n }\n}\n\nexport default RepositoryAbstraction.createImplementation({\n implementation: CreateTenantRepository,\n dependencies: [GetModelUseCase, CreateEntryUseCase]\n});\n"],"mappings":"AACA,SAASA,mBAAmB,EAAEC,wBAAwB;AACtD,SAASC,sBAAsB,IAAIC,qBAAqB;AACxD,SAASC,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,kBAAkB,QAAQ,mDAAmD;AACtF,SAASC,eAAe,QAAQ,gDAAgD;AAChF,SAASC,eAAe;AAExB,MAAML,sBAAsB,CAA4C;EACpEM,WAAWA,CACCC,eAA0C,EAC1CC,kBAAgD,EAC1D;IAAA,KAFUD,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,kBAAgD,GAAhDA,kBAAgD;EACzD;EAEH,MAAMC,OAAOA,CAACC,MAAc,EAAwD;IAChF,IAAI;MACA;MACA,MAAMC,WAAW,GAAG,MAAM,IAAI,CAACJ,eAAe,CAACE,OAAO,CAACJ,eAAe,CAAC;MACvE,IAAIM,WAAW,CAACC,MAAM,CAAC,CAAC,EAAE;QACtB,OAAOV,MAAM,CAACW,IAAI,CAAC,IAAId,wBAAwB,CAAC,CAAC,CAAC;MACtD;;MAEA;MACA,MAAMe,YAA0B,GAAG;QAC/BC,IAAI,EAAEL,MAAM,CAACM,MAAM,CAACD,IAAI;QACxBE,MAAM,EAAEP,MAAM,CAACM,MAAM,CAACC,MAAM;QAC5BC,WAAW,EAAER,MAAM,CAACM,MAAM,CAACE,WAAW;QACtCC,WAAW,EAAE,KAAK;QAClBC,UAAU,EAAEV,MAAM,CAACM,MAAM,CAACI,UAAU,IAAI,CAAC;MAC7C,CAAC;;MAED;MACA,MAAMC,YAAY,GAAG,MAAM,IAAI,CAACb,kBAAkB,CAACC,OAAO,CAACE,WAAW,CAACW,KAAK,EAAE;QAC1EC,EAAE,EAAEb,MAAM,CAACa,EAAE;QACbP,MAAM,EAAEF;MACZ,CAAC,CAAC;MAEF,IAAIO,YAAY,CAACT,MAAM,CAAC,CAAC,EAAE;QACvB,OAAOV,MAAM,CAACW,IAAI,CAAC,IAAIf,mBAAmB,CAACuB,YAAY,CAACG,KAAK,CAAC,CAAC;MACnE;MAEA,OAAOtB,MAAM,CAACuB,EAAE,CAACf,MAAM,CAAC;IAC5B,CAAC,CAAC,OAAOc,KAAK,EAAE;MACZ,OAAOtB,MAAM,CAACW,IAAI,CAAC,IAAIf,mBAAmB,CAAC0B,KAAc,CAAC,CAAC;IAC/D;EACJ;AACJ;AAEA,eAAevB,qBAAqB,CAACyB,oBAAoB,CAAC;EACtDC,cAAc,EAAE3B,sBAAsB;EACtC4B,YAAY,EAAE,CAACxB,eAAe,EAAED,kBAAkB;AACtD,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CreateTenantUseCase as UseCaseAbstraction, ICreateTenantInput, CreateTenantRepository } from "./abstractions.js";
|
|
2
|
+
import { Result } from "@webiny/feature/api";
|
|
3
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
4
|
+
import { Tenant } from "../../../shared/Tenant.js";
|
|
5
|
+
declare class CreateTenantUseCase implements UseCaseAbstraction.Interface {
|
|
6
|
+
private identityContext;
|
|
7
|
+
private repository;
|
|
8
|
+
constructor(identityContext: IdentityContext.Interface, repository: CreateTenantRepository.Interface);
|
|
9
|
+
execute(input: ICreateTenantInput): Promise<Result<Tenant, UseCaseAbstraction.Error>>;
|
|
10
|
+
}
|
|
11
|
+
declare const _default: typeof CreateTenantUseCase & {
|
|
12
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICreateTenantUseCase>;
|
|
13
|
+
};
|
|
14
|
+
export default _default;
|