Files
richard-churchman 5f6bbe45f7 A major refactoring of the software to make model IDs less volatile between Import, Export, and Peek (comparison) of the model configuration environment. As part of the extensive refactor, most tables have been updated to include a GUID field, which is consistent across Import, irrespective of the IDs remaining volatile. The consistent GUID allows for the separation of production (i.e., Case, Transaction, and Counter data), Redis cache data and quasi-production data(i.e, Lists, Suppressions, and Dictionaries) from the configuration environment. Significant rework of Controllers, Repositories and POCOs to support GUID as an access path rather than ID.
Major bug fixes relating to the Redis implementation in Reprocessing and Search Key Cache were identified and fixed as part of the rekeying development.

Included functionality to stop the Exhaustive training.  Fixed the Unsupervised learning functionality in Exhaustive Training.  Embedded the Mock Data CSV data into a class to make it compatible with Docker without needing to modify the Dockerfile (i.e, build).  Included a new table that stores training data to enhance support capabilities for Exhaustive.

Reintroduced and validated the Multitenancy functionality.

Postgres is now fully deprecated in place of Redis for cache, and all implementations of the Interfaces for Postgres have been removed.  No migrations exist to support this deprecation, and Postgres as a cache is now wholly unsupported.  Removed the Indexing background thread,  as Redis does not require it, given that it is a key-value pair database.

Created a RedisCommandFlag Environment Variable to support Fire and Forget write to Redis in Invocation.

Implemented functionality to Export, Peek and Download configuration environments using a secure, encrypted scheme.  Created a permission to access the functionality via the user interface.  Extensive database-based logging is included to provide for a comprehensive audit.  Created functionality to Import the encrypted Export file inside a database transaction to ensure consistency.

As Docker is now the primary deployment model, log4net instantiation has been moved to an approach that primarily uses programmatic instantiation of the ConsoleLogger and RollingFileAppender given Environment Variables. Implemented functionality to support remote \ mounted Log4Net XML Serialisation files for more advanced log4net configurations.

Reintroduced access to counters via the user interface and created a permission.

Took the opportunity to implement ReSharper linter suggestions.

Disabled the Lock button across the whole application, with that functionality being reserved for future use. It is intended that locking happens programmatically on the basis of dependencies in future commits.

Fixed several significant end-use bugs which became apparent during testing of the refactored code relating to case management and visualisations.  Fixed certain other minor bugs that came up during testing.

Brought documentation up to date for this commit.

Brought the Docker Compose file up to date for this commit.

Removed Redundant Environment Variables for this commit.

Made the README file less verbose and unnecessary.
2025-08-13 19:01:08 +03:00

3.3 KiB

layout, title, nav_order, parent, grand_parent
layout title nav_order parent grand_parent
default Enabling Multi Tenancy And Switching 2 Multi Tenancy Concepts

🚀Speed up implementation with hands-on, face-to-face training from the developer.

Enabling Multi Tenancy And Switching

On each request the UserInTenant table is inspected for the authentication user to identify the allocated TenantRegistryId:

select * from "UserInTenant"

Returning the following data:

Image

Only a single instance of a given user name may be in use for the entire implementation of Jube. It is not possible to switch users between tenant, except on the basis that the tenant that the user belongs to is designated as a Landlord, which means that all authorisation mechanisms are bypassed, all permissions are available, across all tenants, for all users belonging to that tenant.

The designation of a Tenant as being of type Landlord may only happen via database update. The following SQL will update the Administrator Tenant to be a Landlord:

Update "TenantRegistry" set "Landlord" = 1 where "Id" = 1

Assuming however the Landlord permission has been updated, it becomes possible to create new Tenants and move that user between tenants, with total authorisation assumed.

Upon Landlord having been designated, navigate to Administration >> Security >> Tenants:

Image

There already exists a default tenant that has been created by migration. In the absence of Landlord having been allocated, the default tenant just remains the solitary tenant (it could be said single tenanted).

Note the link to the Administrator tenant:

Image

Clicking on the link expands upon the properties of the tenant:

Image

Locate the back button:

Image

Clicking on the Back button returns to the list of tenants:

Image

To create a new Tenant locate the New button:

Image

Clicking on the New button to expose an empty tenant:

Image

Create a tenant titled Test as follows:

Image

Click the Add button to create a version of the tenant:

Image

By way of illustration, navigate to Models >> Models:

Image

There are several models being returned as belonging to the Administrator tenant.

The availability of a new tenant allows for the switching to that tenant, given the Landlord permission. Note since Landlord permission, in the bottom right hand corner of the user interface, there is a dropdown box:

Image

The dropdown box is the tenant switcher and contains all tenants available. The selection is the current allocation of user to tenant:

Image

In selecting a different tenant, the currently authenticated user will be allocated to the newly selected tenant, with the screen being refreshed:

Image

Given a new tenant, there is no data, as only data owned by this tenant is returned. All pages in the user interface may be used in a manner as documented, with data being completely isolated from one tenant to another.