# System Context Access Management (Phase 4)
## Architecture Diagram
```plantuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
title System Context Access Management - Architecture Diagram
Person(brand_admin, "Brand Admin")
System_Boundary(brand_web_system, "Brand Administration Web Application") {
Container(brand_web, "Browser", "Software System", "All supported browser")
Container(brand_app, "Brand Administration Web Application", "Nuxt.js", "Provides brand management functionalities to brand admin via their web browser")
}
System_Boundary(brand_mobile_system, "Brand Administration Mobile Application") {
Container(brand_mobile, "Mobile Device", "Mobile System", "All supported mobile devices")
Container(partner_app, "Brand Administration Mobile Application", "Flutter", "Provides brand management functionalities to brand admin via their web mobile app")
}
System_Boundary(api_endpoint, "API Endpoint") {
Container(evm_scam, "evm-scam API", "Go", "Provides config management functionalities via HTTPS / REST / JSON API")
Container(evm_brand, "evm-brand API", "Go", "Provides brand management functionalities via HTTPS / REST / JSON API")
}
System_Boundary(db, "Evermos Database") {
ContainerDb(db_scam, "Database", "MySQL", "evm_scam schema")
}
Lay_L(brand_web_system, brand_mobile_system)
Rel(brand_admin, brand_web, "View dashboard", "Client Device")
Rel(brand_web, brand_app, "Access", "HTTPS")
Rel(brand_app, evm_brand, "Makes API calls to", "HTTPS / REST / JSON")
Rel(brand_app, evm_scam, "Makes API calls to", "HTTPS / REST / JSON")
Rel(brand_admin, brand_mobile, "View dashboard")
Rel(brand_mobile, partner_app, "Access", "HTTPS")
Rel(partner_app, evm_brand, "Makes API calls to", "HTTPS / REST / JSON")
Rel(partner_app, evm_scam, "Makes API calls to", "HTTPS / REST / JSON")
Rel_R(evm_brand, evm_scam, "Makes API calls to", "HTTPS / REST / JSON")
Rel(evm_scam, db_scam, "Reads from & Writes to", "TCP/IP")
```
## Architecture Diagram
```plantuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
title Admin Dashboard - Architecture Diagram
Person(admin, "Admin")
System_Boundary(admin_web_system, "Evermos Administration Web Application") {
Container(brand_web, "Browser", "Software System", "All supported browser")
Container(admin_web_app, "Admin Dashboard", "Nuxt.js", "Provides management functionalities to admin via their web browser")
}
System_Boundary(api_endpoint, "API Endpoint") {
Container(admin_api, "evermos-admin-be API", "PHP", "Provides admin management functionalities via HTTPS / REST / JSON API")
}
ContainerDb(db_evm, "Database", "MySQL", "evm schema")
Rel_R(admin, brand_web, "Register Brand", "Client Device")
Rel_R(brand_web, admin_web_app, "Access", "HTTPS")
Rel_R(admin_web_app, admin_api, "Makes API calls to", "HTTPS / REST / JSON")
Rel_R(admin_api, db_evm, "Reads from & Writes to", "TCP/IP")
```
## EVM Database Design - Existing System
```plantuml
hide circle
'skinparam linetype ortho
skinparam class {
ArrowColor #FF7878
BackgroundColor #FFF89A
BorderColor #694E4E
}
title EVM Database Schema
entity "[evm] menu" as m {
*id: bigint(20)
--
parentMenuId: bigint(20) <<FK>>
slug: varchar(200)
icon: varchar(250)
url: text
label: varchar(200)
order: int(11)
isVisible: smallint(6)
createdTime: datetime
createdBy: bigint(20)
updatedTime: datetime
updatedBy: bigint(20)
isActive: tinyint(1)
isRemoved: tinyint(1)
removedTime: datetime
removedBy: bigint(20)
}
entity "[evm] menu_function" as mf {
*id: bigint(20)
--
menuId: bigint(20) <<FK>>
name: varchar(255)
group: int(11)
createdTime: datetime
createdBy: bigint(20)
updatedTime: datetime
updatedBy: bigint(20)
isActive: tinyint(1)
isRemoved: tinyint(1)
removedTime: datetime
removedBy: bigint(20)
}
entity "[evm] role" as r {
*id: bigint(20)
--
parentRoleId: bigint(20) <<FK>>
name: text
isParent: smallint(6)
order: smallint(6)
createdTime: datetime
createdBy: bigint(20)
updatedTime: datetime
updatedBy: bigint(20)
isActive: tinyint(1)
isRemoved: tinyint(1)
removedTime: datetime
removedBy: bigint(20)
}
entity "[evm] role_menu" as rm {
*id: bigint(20)
--
roleId: bigint(20) <<FK>>
menuId: bigint(20) <<FK>>
order: smallint(6)
createdTime: datetime
createdBy: bigint(20)
updatedTime: datetime
updatedBy: bigint(20)
isActive: tinyint(1)
isRemoved: tinyint(1)
removedTime: datetime
removedBy: bigint(20)
}
entity "[evm] user" as u {
*id: bigint(20)
--
userType: int(11)
userLevel: int(11)
membershipStatus: tinyint(1)
username: varchar(254)
storeName: text
uniqueId: varchar(10)
name: varchar(100)
.
<<other fields>>
.
createdTime: datetime
createdBy: bigint(20)
updatedTime: datetime
updatedBy: bigint(20)
isActive: tinyint(1)
isSuspended: int(1)
isRemoved: tinyint(1)
removedTime: datetime
removedBy: bigint(20)
}
entity "[evm] user_role" as ur {
*id: bigint(20)
--
roleId: bigint(20) <<FK>>
userId: bigint(20) <<FK>>
createdTime: datetime
createdBy: bigint(20)
updatedTime: datetime
updatedBy: bigint(20)
isActive: tinyint(1)
isRemoved: tinyint(1)
removedTime: datetime
removedBy: bigint(20)
}
entity "[evm] user_function" as uf {
*id: bigint(20)
--
userId: bigint(20) <<FK>>
functionId: bigint(20) <<FK>>
createdTime: datetime
createdBy: bigint(20)
updatedTime: datetime
updatedBy: bigint(20)
isActive: tinyint(1)
isRemoved: tinyint(1)
removedTime: datetime
removedBy: bigint(20)
}
r||--|{ r
m||--|{ m
m ||--|{ mf
mf ||--|{ uf
r ||--|{ rm
m ||--|{ rm
u ||-left|{ ur
u ||--|{ uf
r ||--|{ ur
```
## EVM-SCAM Database Design - Existing System
```plantuml
hide circle
'skinparam linetype ortho
skinparam class {
ArrowColor #FF7878
BackgroundColor #FFF89A
BorderColor #694E4E
}
title EVM-SCAM Phase 3 - Database Schema
package "C4 Level 1" <<Rectangle>> {
entity "[evm_scam] app_system_context" as asc {
*entity_id : char(36)
--
sys_ctx_code : varchar(50) <<unique>>
sys_ctx_name : varchar(255)
sys_ctx_description : text
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
}
entity "[evm_scam] app_system_context_container" as ascc {
*entity_id : char(36)
--
*container_id : char(36) <<FK>>
*sys_ctx_id : char(36) <<FK>>
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
package "C4 Level 2" <<Rectangle>> {
entity "[evm_scam] app_container" as ac {
*entity_id : char(36)
--
*sys_ctx_id : char(36) <<FK>> (default\nsystem context)
container_type : enum(web,mobile,api)
container_code : varchar(50) <<unique>>
container_name : varchar(255)
container_description : text
container_tech : varchar(50)
repository_url : varchar(255)
internal_url : varchar(255)
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
}
entity "[evm-scam] acm_role" as ar {
*entity_id : char(36)
--
parent_id: char(36) <<FK>>
sys_ctx_id: char(36) <<FK>>
code: varchar(50)
name: varchar(255)
description: text
is_active: boolean
created_at: varchar(36)
created_by: timestamp
updated_at: varchar(36)
updated_by: timestamp
is_deleted: boolean
deleted_at: varchar(36)
deleted_by: timestamp
}
entity "[evm-scam] acm_user_role" as aur {
*entity_id : char(36)
--
role_id: char(36) <<FK>>
user_id: char(36)
channel: text
is_active: boolean
created_at: varchar(36)
created_by: timestamp
updated_at: varchar(36)
updated_by: timestamp
is_deleted: boolean
deleted_at: varchar(36)
deleted_by: timestamp
}
entity "[evm-scam] acm_role_menu" as arm {
*entity_id : char(36)
--
role_id: char(36) <<FK>>
menu_id: char(36) <<FK>>
is_active: boolean
created_at: varchar(36)
created_by: timestamp
updated_at: varchar(36)
updated_by: timestamp
is_deleted: boolean
deleted_at: varchar(36)
deleted_by: timestamp
}
entity "[evm_scam] app_container_ui_menu" as acum {
*entity_id : char(36) <<generated>>
--
*parent_menu_id : char(36) <<FK>>
*container_id : char(36) <<FK>>
*tenant_id : char(36) <<FK>>
*area_id : char(36) <<FK>>
*default_layout_id : char(36) <<FK>>
*menu_position_id : char(36) <<FK>>
code : varchar(50)
version : varchar(20)
name : varchar(255)
path : varchar(255)
order_idx : varchar(255)
description : varchar(255)
restriction : enum(public, private)
has_icon : boolean
icon_type : varchar(100)
icon : varchar(100)
level : varchar(20)
additional_setting : JSON
checksum_point : varchar(255)
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
acum ||--|{ acum
ar ||--|{ ar
asc ||--|{ ar
asc ||-down-|{ ac
asc||--left|{ascc
ac||-left|{ascc
ar ||-left|{ aur
ar ||-right|{ arm
acum ||-left|{ arm
```
## EVM-SCAM Database Design - Proposed Solution
```plantuml
hide circle
'skinparam linetype ortho
skinparam class {
ArrowColor #FF7878
BackgroundColor #FFF89A
BorderColor #694E4E
}
title EVM-SCAM Phase 4 - Database Schema
package "C4 Level 1" <<Rectangle>> {
entity "[evm_scam] app_system_context" as asc {
*entity_id : char(36)
--
sys_ctx_code : varchar(50) <<unique>>
sys_ctx_name : varchar(255)
sys_ctx_description : text
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
}
entity "[evm_scam] app_system_context_container" as ascc {
*entity_id : char(36)
--
*container_id : char(36) <<FK>>
*sys_ctx_id : char(36) <<FK>>
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
package "C4 Level 2" <<Rectangle>> {
entity "[evm_scam] app_container" as ac {
*entity_id : char(36)
--
*sys_ctx_id : char(36) <<FK>> (default\nsystem context)
container_type : enum(web,mobile,api)
container_code : varchar(50) <<unique>>
container_name : varchar(255)
container_description : text
container_tech : varchar(50)
repository_url : varchar(255)
internal_url : varchar(255)
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
}
entity "[evm-scam] acm_role" as ar {
*entity_id : char(36)
--
parent_id: char(36) <<FK>>
sys_ctx_id: char(36) <<FK>>
code: varchar(50)
name: varchar(255)
description: text
is_active: boolean
created_at: varchar(36)
created_by: timestamp
updated_at: varchar(36)
updated_by: timestamp
is_deleted: boolean
deleted_at: varchar(36)
deleted_by: timestamp
}
entity "[evm-scam] acm_user_role" as aur {
*entity_id : char(36)
--
role_id: char(36) <<FK>>
user_id: char(36)
channel: text
is_active: boolean
created_at: varchar(36)
created_by: timestamp
updated_at: varchar(36)
updated_by: timestamp
is_deleted: boolean
deleted_at: varchar(36)
deleted_by: timestamp
}
entity "[evm-scam] acm_role_menu" as arm {
*entity_id : char(36)
--
role_id: char(36) <<FK>>
menu_id: char(36) <<FK>>
is_active: boolean
created_at: varchar(36)
created_by: timestamp
updated_at: varchar(36)
updated_by: timestamp
is_deleted: boolean
deleted_at: varchar(36)
deleted_by: timestamp
}
entity "[evm_scam] app_container_ui_menu" as acum {
*entity_id : char(36) <<generated>>
--
*parent_menu_id : char(36) <<FK>>
*container_id : char(36) <<FK>>
*tenant_id : char(36) <<FK>>
*area_id : char(36) <<FK>>
*default_layout_id : char(36) <<FK>>
*menu_position_id : char(36) <<FK>>
code : varchar(50)
version : varchar(20)
name : varchar(255)
path : varchar(255)
order_idx : varchar(255)
description : varchar(255)
restriction : enum(public, private)
has_icon : boolean
icon_type : varchar(100)
icon : varchar(100)
level : varchar(20)
additional_setting : JSON
checksum_point : varchar(255)
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
package "C4 Level 3" <<Rectangle>> {
entity "[evm_scam] app_container_component" as acc {
*entity_id : char(36)
--
*container_id : char(36) <<FK>>
*component_parent_id : char(36) <<FK>>
code : varchar(50) <<unique>>
name : varchar(255)
description : text
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
}
package "C4 Level 4" <<Rectangle>> {
entity "[evm_scam] app_container_component_item" as acci {
*entity_id : char(36)
--
*component_id : char(36) <<FK>>
*operation_type_id : char(36) <<FK>>
*privilege_access_type_id : char(36) <<FK>>
code : varchar(50) <<unique>>
name : varchar(255)
identifier : varchar(255)
description : text
is_active : boolean
created_at : varchar(36)
created_by : timestamp
updated_at : varchar(36)
updated_by : timestamp
is_deleted : boolean
deleted_at : varchar(36)
deleted_by : timestamp
}
}
entity "[evm-scam] acm_privilege_access_type" as apat {
*entity_id : char(36)
--
code : varchar(50) <<unique>>
name : varchar(255)
description : text
is_active: boolean
created_at: varchar(36)
created_by: timestamp
updated_at: varchar(36)
updated_by: timestamp
is_deleted: boolean
deleted_at: varchar(36)
deleted_by: timestamp
}
entity "[evm-scam] acm_operation_type" as aot {
*entity_id : char(36)
--
code : varchar(50) <<unique>>
name : varchar(255)
description : text
is_active: boolean
created_at: varchar(36)
created_by: timestamp
updated_at: varchar(36)
updated_by: timestamp
is_deleted: boolean
deleted_at: varchar(36)
deleted_by: timestamp
}
entity "[evm-scam] casbin_rule" as acp {
*id : int(10)
--
p_type: varchar(32)
v0: varchar(255)
v1: varchar(255)
v2: varchar(255)
v3: varchar(255)
v4: varchar(255)
v5: varchar(255)
}
acum ||--|{ acum
ar ||--|{ ar
asc ||--|{ ar
asc ||-down-|{ ac
asc||--left|{ascc
ac||-left|{ascc
ar ||-left|{ aur
ar ||-right|{ arm
acum ||-left|{ arm
acc ||--|{ acc
ac ||-down-|{ acc
acc ||-down-|{ acci
apat ||-up-|{ acci
aot ||-up-|{ acci
ar ||-down-|{ acp
acci ||-left-|{ acp
```
### Get User Permission
```plantuml
skinparam responseMessageBelowArrow true
title Get User Permission - Proposed Interaction Diagram
participant "client" as c
participant "evm-scam" as es
participant "evm-auth" as ea
database "redis" as r
database "evm_scam" as s
c -> es : get user permission
activate es
es -> ea : check client\nauthorization
activate ea
alt if client unauthorized
ea -> es : error unauthorized
es -> c : error unauthorized
end
return client detail
es -> s : get user role
activate s
return user role data
es -> r : get data from redis
activate r
alt if data found
return user permission list
es -> c : user permission list
end
es -> s : get user permission
activate s
alt if data not found
return error data not found
es -> c : error data not found
end
es -> s : get user permission
activate s
return user permission list
return user permission list
```