540 lines
11 KiB
Text
540 lines
11 KiB
Text
@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
|