Sharing Role, CapabilitySets, Capabilities with Consortium Members
This document will illustrate the design for sharing settings between members of a consortium.
Diagrams
Diagram for Share Role functionality
@startuml!pragma teoz true!theme ceruleanautonumberactor "user" as userparticipant "mod-consortia-keycloak" as mckdatabase "mod-consortia-keycloak DB" as mck_dbparticipant "mod-consortia-publish-coordinator" as mc_pcparticipant "mod-login-keycloak" as mlparticipant "mod-roles-keycloak" as mrkuser -> mck: Initiate sharing role actionnote rightPOST /consortia/<consortiumId>/sharing/roles{ "roleId": "<UUID>", "url": "string", "payload": { "id": "<UUID>", "name": "<String>", "description": "<String>" }}end noteactivate mckmck -> mck_db: Retrieve tenants associated with the roleId from sharing_role tablenote bottom| tenant_id | role_id || "tenant A" | <UUID1> |end notenote right| tenant_id | role_id || "tenant A" | <UUID1> |end notemck -> mck_db: Retrieve all tenants listloop tenants size count alt #E8F3E1 tenant id does not exist in role_capability_sets table mck -> mck: Add tenant to POST Role Publish Coordinator tenants list mck -> mck_db: Create new entity note right | tenant_id | role_id | | "tenant B" | <UUID2> | end note else #F3E1E2 tenant id exists mck -> mck: Add tenant to PUT Role Publish Coordinator tenants list endendmck -> mck: Set source as Consortium for all role (Create and Update)mck -> ml: Login via consortia-system-userml --> mck: Return system user's tokenmck -> mc_pc: Initiate PC request with POST HTTP method to create rolemc_pc -> mrk: Send HTTP POST request to create rolemrk --> mc_pc: Return responsemc_pc --> mck: Return Publish Coordinator idmck -> mc_pc: Initiate PC request with PUT HTTP method to update rolemc_pc -> mrk: Send HTTP POST request to create rolemrk --> mc_pc: Return responsemc_pc --> mck: Return Publish Coordinator idmck --> user: Return response with both PC idsnote rightResponse payload:{ "createRolePCId": "<UUID>", "updateRolePCId": "<UUID>"}end noteuser -> mck: Check if POST PC completed: /consortia/<UUID>/publications/<UUID>user -> mck: Check if PUT PC completed: /consortia/<UUID>/publications/<UUID>@enduml
Diagram for Delete Shared Setting functionality
@startuml!pragma teoz true!theme ceruleanautonumberactor "user" as userparticipant "mod-consortia-keycloak" as mckdatabase "mod-consortia-keycloak DB" as mck_dbparticipant "mod-consortia-publish-coordinator" as mc_pcparticipant "mod-login-keycloak" as mlparticipant "mod-roles-keycloak" as mrkuser -> mck: Initiate deleting role actionnote rightDELETE /consortia/<consortiumId>/sharing/roles/<roleId>{ "roleId": "<UUID>", "url": "string"}end noteactivate mckmck -> mck_db: Retrieve tenants associated with the roleId from sharing_role table using roleIdnote bottom| tenant_id | role_id || "tenant A" | <UUID1> |end notenote right| tenant_id | role_id || "tenant A" | <UUID1> || "tenant B" | <UUID2> |end noteloop tenants where role is exists mck -> mck: Add tenant to DELETE Role Publish Coordinator tenants listendmck -> mck_db: Remove record with "roleId" and "tenant A" variablesmck -> ml: Login via consortia-system-userml --> mck: Return system user's tokenmck -> mc_pc: Initiate PC request with DELETE HTTP method to delete a rolemc_pc -> mrk: Send HTTP DELETE request to delete rolemrk --> mc_pc: Return responsemc_pc --> mck: Return Publish Coordinator idmck --> user: Return response with PC idnote rightResponse payload:{ "deleteRolePCId": "<UUID>"}end noteuser -> mck: Check if DELETE PC completed: /consortia/<UUID>/publications/<UUID>@enduml
Diagram for Share Role and CapabilitySets functionality. Role and Capabilities also similar to this flow
@startuml!pragma teoz true!theme ceruleanautonumberactor "user" as userparticipant "mod-consortia-keycloak" as mckdatabase "mod-consortia-keycloak DB" as mck_dbparticipant "mod-consortia-publish-coordinator" as mc_pcparticipant "mod-login-keycloak" as mlparticipant "mod-roles-keycloak" as mrkuser -> mck: Initiate sharing role capability sets actionnote rightPOST /consortia/<consortiumId>/sharing/roles/capability-sets{ "roleId": "<UUID>", "url": "string", "payload": { "roleId": "<UUID>", "capabilitySetNames": "["<string>", "<string>"]" }}end noteactivate mckmck -> mck_db: Retrieve tenants associated with the roleId from sharing_role table using is_capability_sets_shared flag truenote bottom| tenant_id | role_id | is_capability_sets_shared || "tenant A" | <UUID1> | true |end notenote right| tenant_id | role_id | is_capability_sets_shared || "tenant A" | <UUID1> | true || "tenant B" | <UUID2> | false |end notemck -> mck_db: Retrieve all tenants listloop tenants size countalt #E8F3E1 tenant id does not exist in role_capability_sets table mck -> mck: Add tenant to POST Role Capability Sets Publish Coordinator tenants list mck -> mck_db: Set is_capability_sets_shared flag to true for new tenantelse #F3E1E2 tenant id exists mck -> mck: Add tenant to PUT Role Capability Sets Publish Coordinator tenants listendendmck -> mck: Set source as Consortium for all role capability sets (Create and Update)mck -> ml: Login via consortia-system-userml --> mck: Return system user's tokenmck -> mc_pc: Initiate PC request with POST HTTP method to create role capability setsmc_pc -> mrk: Send HTTP POST request to create role capability setsmrk --> mc_pc: Return responsemc_pc --> mck: Return Publish Coordinator idmck -> mc_pc: Initiate PC request with PUT HTTP method to update role capability setsmc_pc -> mrk: Send HTTP POST request to create role capability setsmrk --> mc_pc: Return responsemc_pc --> mck: Return Publish Coordinator idmck --> user: Return response with both PC idsnote rightResponse payload:{ "createRoleCapabilitySetsPCId": "<UUID>", "updateRoleCapabilitySetsPCId": "<UUID>"}end noteuser -> mck: Check if POST PC completed: /consortia/<UUID>/publications/<UUID>user -> mck: Check if PUT PC completed: /consortia/<UUID>/publications/<UUID>@enduml
Diagram for Delete Shared Setting functionality
@startuml!pragma teoz true!theme ceruleanautonumberactor "user" as userparticipant "mod-consortia-keycloak" as mckdatabase "mod-consortia-keycloak DB" as mck_dbparticipant "mod-consortia-publish-coordinator" as mc_pcparticipant "mod-login-keycloak" as mlparticipant "mod-roles-keycloak" as mrkuser -> mck: Initiate deleting role capability sets actionnote rightDELETE /consortia/<consortiumId>/sharing/roles/<roleId>/capability-sets{ "roleId": "<UUID>", "url": "string"}end noteactivate mckmck -> mck_db: Retrieve tenants associated with the roleId from sharing_role table using is_capability_sets_shared flag truenote bottom| tenant_id | role_id | is_capability_sets_shared || "tenant A" | <UUID1> | true |end notenote right| tenant_id | role_id | is_capability_sets_shared || "tenant A" | <UUID1> | true || "tenant B" | <UUID2> | false |end noteloop tenants where role capability set is shared mck -> mck: Add tenant to DELETE Role Capability Sets Publish Coordinator tenants listendmck -> mck_db: Set is_capability_sets_shared flag to false for "roleId" and "tenant A"mck -> ml: Login via consortia-system-userml --> mck: Return system user's tokenmck -> mc_pc: Initiate PC request with DELETE HTTP method to delete role capability setsmc_pc -> mrk: Send HTTP DELETE request to delete role capability setsmrk --> mc_pc: Return responsemc_pc --> mck: Return Publish Coordinator idmck --> user: Return response with PC idnote rightResponse payload:{ "deleteRoleCapabilitySetsPCId": "<UUID>"}end noteuser -> mck: Check if DELETE PC completed: /consortia/<UUID>/publications/<UUID>@enduml
Key Changes
Sharing Role and Capabilities/CapabilitySets suppor roleId + CapabilitySetNames/CapabilityNames and these relationships are supported in mod-roles
Here is diagram to explain why using roleId + CapabilitySetNames/CapabilityNames since name is the same in all tenants
DB table structure
New table shared_role will be created and store role and tenant associations in the central tenant with following structure:
Field | Type | Comment |
|---|
Field | Type | Comment |
|---|---|---|
id(PK) | UUID | Unique identifier of table |
role_id(indexed) | UUID | Contains shared setting uuid |
is_capabilities_shared | boolean | Indicates role and capabilities shared in tenant |
is_capability_sets_shared | boolean | Indicates role and capability sets shared in tenant |
tenant_id | Text | Contains tenant where setting was shared |