From 806912d325065bdd23b3e24ca3f51e6af49e6251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 28 May 2021 17:17:13 +0300 Subject: [PATCH 1/3] Resolved #6862: Tenant Management documentation --- docs/en/Modules/Tenant-Management.md | 55 +++++++++++++++++- .../module-tenant-management-actions.png | Bin 0 -> 9142 bytes .../module-tenant-management-new-tenant.png | Bin 0 -> 15121 bytes .../images/module-tenant-management-page.png | Bin 0 -> 21622 bytes 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 docs/en/images/module-tenant-management-actions.png create mode 100644 docs/en/images/module-tenant-management-new-tenant.png create mode 100644 docs/en/images/module-tenant-management-page.png diff --git a/docs/en/Modules/Tenant-Management.md b/docs/en/Modules/Tenant-Management.md index 73e16aee8e..8ff7c480ca 100644 --- a/docs/en/Modules/Tenant-Management.md +++ b/docs/en/Modules/Tenant-Management.md @@ -1,3 +1,56 @@ # Tenant Management Module -TODO \ No newline at end of file +[Multi-Tenancy](../Multi-Tenancy.md) is one of the core features of ABP Framework. It provides the fundamental infrastructure to build your own SaaS (Software-as-a-Service) solution. ABP's multi-tenancy system abstracts where your tenants are stored, by providing the `ITenantStore` interface. All you need to do is to implement that interface. + +**The Tenant Management module is an implementation of the the `ITenantStore` interface. It stores tenants in a database. It also provides UI to manage your tenants and their [features](../Features.md).** + +> Please **refer to the [Multi-Tenancy](../Multi-Tenancy.md) documentation** to understand the multi-tenancy system of the ABP Framework. This document focuses on the Tenant Management module. + +### About the ABP Commercial SaaS Module + +The [SaaS Module](https://commercial.abp.io/modules/Volo.Saas) is an alternative implementation of this module with more features and possibilities. It is distributed as a part of the [ABP Commercial](https://commercial.abp.io/) subscription. + +## How to Install + +This module comes as pre-installed (as NuGet packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it via NuGet packages and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. + +## User Interface + +This module adds "*Administration -> Tenant Management -> Tenants*" menu item to the main menu of the application, which opens the page shown below: + +![module-tenant-management-page](../images/module-tenant-management-page.png) + +In this page, you see the all the tenants. You can create a new tenant as shown below: + +![module-tenant-management-new-tenant](../images/module-tenant-management-new-tenant.png) + +In this modal; + +* **Name**: The unique name of the tenant. If you use subdomains for your tenants (like https://some-tenant.your-domain.com), this will be the subdomain name. +* **Admin Email Address**: Email address of the admin user for this tenant. +* **Admin Password**: The password of the admin user for this tenant. + +When you click to *Actions* button near to a tenant, you will see the actions you can take: + +![module-tenant-management-actions](../images/module-tenant-management-actions.png) + +### Managing the Tenant Features + +The Features action opens a modal to enable/disable/set [features](../Features.md) for the related tenant. Here, an example modal: + +![features-modal](../images/features-modal.png) + +### Managing the Host Features + +*Manage Host features* button is used to set features for the host side, if you use the features of your application also in the host side. + +## Internals + +This section can be used as a reference if you want to [customize](../Customizing-Application-Modules-Guide.md) this module without changing it source code. + +*TODO: Internals* + +## See Also + +* [Multi-Tenancy](../Multi-Tenancy.md) +* [ABP Commercial SaaS Module](https://docs.abp.io/en/commercial/latest/modules/saas) \ No newline at end of file diff --git a/docs/en/images/module-tenant-management-actions.png b/docs/en/images/module-tenant-management-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f01c2e932bdaf6d95a676355915f4dbeeef1a0 GIT binary patch literal 9142 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 a@S14YI?b$16y-h+psK6^DS!0pum1%lJm&HM literal 0 HcmV?d00001 diff --git a/docs/en/images/module-tenant-management-new-tenant.png b/docs/en/images/module-tenant-management-new-tenant.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9ee6ed56e858230e1c5c07edf344f5956b30ef GIT binary patch literal 15121 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/module-tenant-management-page.png b/docs/en/images/module-tenant-management-page.png new file mode 100644 index 0000000000000000000000000000000000000000..563c64aac8f53d78d58fffde9007f0a84c05089f GIT binary patch literal 21622 zcmeFZcT`l*w7!S9_}Yv%oC*1d1tnfLyfTCA?K>YO@tPSvix_vf?sA^5$L49U$$H$fl} ziJa_PRS<}%9t67l^7>_+<)f=%)L%1CH&5`6h?f zZ`-Oxzndy$XJu>Nyv7iaQ-A9iUx8V;EO2wHv?ZO4FzK~zt+zRS>%-}Gjkxu8Bqo23 z0eBivi|19(i~7}bdKMy}zIMe7`2F!I^EOaDxD$H`sEEG20DcW$y}t%jx3BjCzn?C> zeh5_0pZsTa+9%z=m=*eaww5_T0SC9@)OA`sQKz42?|_~hT~T}QYwEIIx{x<`-iN@u zWy)OE6{U}6g6jFjX^>?2?GMZ}S@Apdim?t;t{=5fA#F+ae>e7NkmoCXzjZ5)VXC-S zUbY7WBA58G7m?2D>rg#z{TW}})=_+JvODdA5@4%Z3x-gkPW^MU60|vCQZ6$IbB9A2 zp6-u-1hghQU}G!VO0uF&X_CE9$=W2`Pj8{EpI&+l7Hl#;tGCu=Jq|^6Y`TrRY9XIN zXJhWEfEzvWJ4z+asN9DpIZB!(`c-)-bMpLwaB2rhWXuSL4KG&G5d-{YE+7&OqehkJrCv6%&O;l)P@~v#r)kE6cHN|>eBHfv)5$A! zA3+Yv6SLZw2>VHYhG^4H!UjB7$#4<10#lpf^I*^4YF_R9!wDarUDG}hHb8i-Pt!5d z_?qpV@rwyE{q}Yp$Gxz5#!Wq>P>I}@n7l8xSb51mFbsjOjG>V-#k4i*s7g=Np9kr1 z+*X>Hd}=gM%=<{(r*2;jz4%!!#-7HK+oz^}q&^;a0q+k!77?c)u9r(ti-_x3{rB^G z?%!?&BVHdn>rE{(4&2`8E@7?vHSQ-dZ%btT)MpqGUOP>ONEdlFcsBEZU(_lyuLv4Q zlseBvBW7v5H*}t*I*JUEm{d2T$y$u&?#kaw(qx&svV!TaYid? z#!>jaFr4LFqUU(@P~&*Vpbyrtds5s&&L#(cQ>rTYscV|k)yKz4H#Wz&@1EF+%%}`s zs?E*N@N(Ic!xXhnjcC}-x-q)*-(%&DZOn|eH(;Y*&`~@&GGTJGX5N-EQv)<~J6j98 zAgbn2bOh{lZe2_7mz(v`lfoVB3yc|ZE~@DWR>8AC#F?cU1JBy|Gm+rea5OjvX;z7$ zOBJ-dMU0<8C581Ju45O6;bRGMio8TABgcHWB-Jo*9~ z0#fYgnB?TsbsAk@&aFODhB7(Y_2$;nZ>O+>eo;Jbi_fhKygCZ#xO_!V1Me;nF%~X_ z`jpPya`0_rTREhb)}J$ohPw_D)1`h_OnL77s(>MYG+eRiI8+Z~TcrFb!`Z`+B&7c= zL9N5j5zOQ~^0lyPNtc;wj+pv=fs-wHOmGdB|c4s>KXv+w!2i2P+hw1xQgSWA4ZmwhO zm|_yTyS7oOYVXryYSSOGVj3m8&Zm6YCdQ%Aq`|Kho5>1tm2@cmqk|gW#Wn_3aWCoS z4IE{&=HgmyHWxit@8X9=NbjVE^y0Z(M}Hy>^dw~5I=rsHe}66>_cpoeNmHd?h{-6Y zpLgj?@nUViL_I^g$$D8KLL?d41CiDP;su|EFGvFed<*>1aN{RM&YLsM5!vFzuav

)CAG; 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 Date: Fri, 28 May 2021 17:39:34 +0300 Subject: [PATCH 2/3] Update Tenant-Management.md --- docs/en/Modules/Tenant-Management.md | 55 +++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/docs/en/Modules/Tenant-Management.md b/docs/en/Modules/Tenant-Management.md index 8ff7c480ca..ed48fe92d1 100644 --- a/docs/en/Modules/Tenant-Management.md +++ b/docs/en/Modules/Tenant-Management.md @@ -14,6 +14,10 @@ The [SaaS Module](https://commercial.abp.io/modules/Volo.Saas) is an alternative This module comes as pre-installed (as NuGet packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it via NuGet packages and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. +### The Source Code + +The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/tenant-management). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. + ## User Interface This module adds "*Administration -> Tenant Management -> Tenants*" menu item to the main menu of the application, which opens the page shown below: @@ -46,9 +50,56 @@ The Features action opens a modal to enable/disable/set [features](../Features.m ## Internals -This section can be used as a reference if you want to [customize](../Customizing-Application-Modules-Guide.md) this module without changing it source code. +This section can be used as a reference if you want to [customize](../Customizing-Application-Modules-Guide.md) this module without changing [its source code](https://github.com/abpframework/abp/tree/dev/modules/tenant-management). + +### Domain Layer + +#### Aggregates + +* `Tenant` + +#### Repositories + +* `ITenantRepository` + +#### Domain Services + +* `TenantManager` + +### Application Layer + +#### Application Services + +* `TenantAppService` + +#### Permissions + +- `AbpTenantManagement.Tenants`: Tenant management. +- `AbpTenantManagement.Tenants.Create`: Creating a new tenant. +- `AbpTenantManagement.Tenants.Update`: Editing an existing tenant. +- `AbpTenantManagement.Tenants.Delete`: Deleting an existing tenant. +- `AbpTenantManagement.Tenants.ManageFeatures`: Manage features of the tenants. + +### Entity Framework Core Integration + +* `TenantManagementDbContext` (implements `ITenantManagementDbContext`) + +**Database Tables:** + +* `AbpTenants` +* `AbpTenantConnectionStrings` + +### MongoDB Integration + +* `TenantManagementMongoDbContext` (implements `ITenantManagementMongoDbContext`) + +**Database Collections:** + +* `AbpTenants` (also includes the connection string) + +## Notices -*TODO: Internals* +ABP Framework allows to use *database per tenant* approach that allows a tenant can have a dedicated database. This module has the fundamental infrastructure to make that implementation possible (see its source code), however it doesn't implement the application layer and UI functionalities to provide it as an out of the box implementation. You can implement these features yourself, or consider to use the [ABP Commercial Saas Module](https://docs.abp.io/en/commercial/latest/modules/saas) that fully implements it and provides much more business features. ## See Also From 84ee25befa88a8ac225e2b68e226a2daa6772e93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 28 May 2021 17:44:22 +0300 Subject: [PATCH 3/3] Update Tenant-Management.md --- docs/en/Modules/Tenant-Management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Modules/Tenant-Management.md b/docs/en/Modules/Tenant-Management.md index ed48fe92d1..dca6ea3d1e 100644 --- a/docs/en/Modules/Tenant-Management.md +++ b/docs/en/Modules/Tenant-Management.md @@ -12,7 +12,7 @@ The [SaaS Module](https://commercial.abp.io/modules/Volo.Saas) is an alternative ## How to Install -This module comes as pre-installed (as NuGet packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it via NuGet packages and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. +This module comes as pre-installed (as [NuGet/NPM packages](NuGet/NPM packages)) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. ### The Source Code