@startuml Folder System Architecture title Система папок/групп в Ivideon package "Database" @startuml FolderSystemSimple title Система папок в Ivideon entity "folders" as folders_db { * _id : ObjectId -- * owner_id : string * name : string * parents : array * objects : array * root : boolean } entity "permission_grants" as grants_db { * _id : ObjectId -- * object_id : string * object_type : string * grantee_id : string * permissions : array } entity "servers" as servers_db { * _id : ObjectId -- * owner_id : string * cameras : object } entity "Folder" as folder_class { + get_objects(type) + add_object(obj) + remove_object(obj) + has_permissions(perm) } entity "FolderTree" as tree_class { + folders : dict + find_folders() + reload() } entity "Camera" as camera_node { + id : "server:index" + object_type : "camera" } folders_db ||--o{ folder_class grants_db ||--o{ folder_class servers_db ||--o{ camera_node tree_class --> folder_class : manages folder_class --> camera_node : contains note right of folders_db objects[] format: [ {object_type: "camera", object_id: "server:0"}, {object_type: "folder", object_id: "subfolder_id"} ] end note note bottom of tree_class Usage: tree = FolderTree(user_id) folder = tree.folders[folder_id] cameras = folder.get_objects("camera") end note @enduml @startuml FolderSystemSimple title Система папок в Ivideon entity "folders" as folders_db { * _id : ObjectId -- * owner_id : string * name : string * parents : array * objects : array * root : boolean } entity "permission_grants" as grants_db { * _id : ObjectId -- * object_id : string * object_type : string * grantee_id : string * permissions : array } entity "servers" as servers_db { * _id : ObjectId -- * owner_id : string * cameras : object } entity "Folder" as folder_class { + get_objects(type) + add_object(obj) + remove_object(obj) + has_permissions(perm) } entity "FolderTree" as tree_class { + folders : dict + find_folders() + reload() } entity "Camera" as camera_node { + id : "server:index" + object_type : "camera" } folders_db ||--o{ folder_class grants_db ||--o{ folder_class servers_db ||--o{ camera_node tree_class --> folder_class : manages folder_class --> camera_node : contains note right of folders_db objects[] format: [ {object_type: "camera", object_id: "server:0"}, {object_type: "folder", object_id: "subfolder_id"} ] end note note bottom of tree_class Usage: tree = FolderTree(user_id) folder = tree.folders[folder_id] cameras = folder.get_objects("camera") end note @enduml @startuml FolderSystemSimple title Система папок в Ivideon entity "folders" as folders_db { * _id : ObjectId -- * owner_id : string * name : string * parents : array * objects : array * root : boolean } entity "permission_grants" as grants_db { * _id : ObjectId -- * object_id : string * object_type : string * grantee_id : string * permissions : array } entity "servers" as servers_db { * _id : ObjectId -- * owner_id : string * cameras : object } entity "Folder" as folder_class { + get_objects(type) + add_object(obj) + remove_object(obj) + has_permissions(perm) } entity "FolderTree" as tree_class { + folders : dict + find_folders() + reload() } entity "Camera" as camera_node { + id : "server:index" + object_type : "camera" } folders_db ||--o{ folder_class grants_db ||--o{ folder_class servers_db ||--o{ camera_node tree_class --> folder_class : manages folder_class --> camera_node : contains note right of folders_db objects[] format: [ {object_type: "camera", object_id: "server:0"}, {object_type: "folder", object_id: "subfolder_id"} ] end note note bottom of tree_class Usage: tree = FolderTree(user_id) folder = tree.folders[folder_id] cameras = folder.get_objects("camera") end note @enduml @startuml FolderSystemSimple title Система папок в Ivideon entity "folders" as folders_db { * _id : ObjectId -- * owner_id : string * name : string * parents : array * objects : array * root : boolean } entity "permission_grants" as grants_db { * _id : ObjectId -- * object_id : string * object_type : string * grantee_id : string * permissions : array } entity "servers" as servers_db { * _id : ObjectId -- * owner_id : string * cameras : object } entity "Folder" as folder_class { + get_objects(type) + add_object(obj) + remove_object(obj) + has_permissions(perm) } entity "FolderTree" as tree_class { + folders : dict + find_folders() + reload() } entity "Camera" as camera_node { + id : "server:index" + object_type : "camera" } folders_db ||--o{ folder_class grants_db ||--o{ folder_class servers_db ||--o{ camera_node tree_class --> folder_class : manages folder_class --> camera_node : contains note right of folders_db objects[] format: [ {object_type: "camera", object_id: "server:0"}, {object_type: "folder", object_id: "subfolder_id"} ] end note note bottom of tree_class Usage: tree = FolderTree(user_id) folder = tree.folders[folder_id] cameras = folder.get_objects("camera") end note @enduml @startuml FolderSystemSimple title Система папок в Ivideon entity "folders" as folders_db { * _id : ObjectId -- * owner_id : string * name : string * parents : array * objects : array * root : boolean } entity "permission_grants" as grants_db { * _id : ObjectId -- * object_id : string * object_type : string * grantee_id : string * permissions : array } entity "servers" as servers_db { * _id : ObjectId -- * owner_id : string * cameras : object } entity "Folder" as folder_class { + get_objects(type) + add_object(obj) + remove_object(obj) + has_permissions(perm) } entity "FolderTree" as tree_class { + folders : dict + find_folders() + reload() } entity "Camera" as camera_node { + id : "server:index" + object_type : "camera" } folders_db ||--o{ folder_class grants_db ||--o{ folder_class servers_db ||--o{ camera_node tree_class --> folder_class : manages folder_class --> camera_node : contains note right of folders_db objects[] format: [ {object_type: "camera", object_id: "server:0"}, {object_type: "folder", object_id: "subfolder_id"} ] end note note bottom of tree_class Usage: tree = FolderTree(user_id) folder = tree.folders[folder_id] cameras = folder.get_objects("camera") end note @enduml @startuml FolderSystemSimple title Система папок в Ivideon entity "folders" as folders_db { * _id : ObjectId -- * owner_id : string * name : string * parents : array * objects : array * root : boolean } entity "permission_grants" as grants_db { * _id : ObjectId -- * object_id : string * object_type : string * grantee_id : string * permissions : array } entity "servers" as servers_db { * _id : ObjectId -- * owner_id : string * cameras : object } entity "Folder" as folder_class { + get_objects(type) + add_object(obj) + remove_object(obj) + has_permissions(perm) } entity "FolderTree" as tree_class { + folders : dict + find_folders() + reload() } entity "Camera" as camera_node { + id : "server:index" + object_type : "camera" } folders_db ||--o{ folder_class grants_db ||--o{ folder_class servers_db ||--o{ camera_node tree_class --> folder_class : manages folder_class --> camera_node : contains note right of folders_db objects[] format: [ {object_type: "camera", object_id: "server:0"}, {object_type: "folder", object_id: "subfolder_id"} ] end note note bottom of tree_class Usage: tree = FolderTree(user_id) folder = tree.folders[folder_id] cameras = folder.get_objects("camera") end note @enduml { database folders_db as "folders collection" database grants_db as "permission_grants" database servers_db as "servers collection" } package "Folder Classes" { class Folder { +id: ObjectId +owner_id: string +name: string +parents: List[string] +objects: List[dict] +root: boolean -- +get_objects(type): List[string] +add_object(obj) +remove_object(obj) +has_permissions(perm): boolean } class FolderTree { +owner_id: string +folders: Dict[id, Folder] +objects: Dict[type, Dict[id, Node]] +roots: List[Folder] -- +find_folders(): List[Folder] +reload() } class BaseNode { +id: string +owner_id: string +grantee_id: string +grants: Set[PermissionGrant] -- +has_permissions(perm): boolean +permissions: Tuple[string] } } package "Permission System" { class PermissionGrant { +object_id: string +object_type: string +grantee_id: string +permissions: List[string] +shared_at: dict } } package "Node Types" { class Camera { +id: "server:index" +object_type: "camera" } } ' Relationships Folder --|> BaseNode FolderTree --> Folder : manages Folder --> PermissionGrant : has grants BaseNode --> PermissionGrant : uses Folder --> folders_db : stored in PermissionGrant --> grants_db : stored in Camera --> servers_db : stored in ' Composition relationships Folder --> Camera : "contains (objects[])" Folder --> Folder : "contains subfolders" note right of Folder objects[] содержит: [ {object_type: "camera", object_id: "server:0"}, {object_type: "folder", object_id: "subfolder_id"} ] end note note right of FolderTree Главная точка доступа: tree = FolderTree(user_id) folder = tree.folders[folder_id] cameras = folder.get_objects("camera") end note note left of PermissionGrant Права доступа: - admin (изменение) - read (просмотр) - Наследование по иерархии end note @enduml