109 lines
No EOL
3 KiB
Text
109 lines
No EOL
3 KiB
Text
@startuml _get_all_user_cameras Activity Diagram
|
|
|
|
title Алгоритм работы _get_all_user_cameras
|
|
|
|
start
|
|
|
|
note right
|
|
**Входные параметры:**
|
|
• user_id: int
|
|
• requested_cameras: list[str]
|
|
(формат: ["server1:0", "server1:1"])
|
|
• service_name: str (например: "crowd")
|
|
end note
|
|
|
|
:Инициализация cameras = {};
|
|
|
|
:Извлечь server_ids из requested_cameras|
|
|
note right
|
|
["server1:0", "server1:1"]
|
|
→ ["server1"]
|
|
end note
|
|
|
|
:Построить MongoDB запрос:
|
|
query = {
|
|
'deleted': {'$ne': True},
|
|
'_id': {'$in': server_ids}
|
|
}|
|
|
|
|
:Задать проекцию полей:
|
|
projection = {
|
|
'_id': 1, 'owner_id': 1, 'name': 1,
|
|
'cameras': 1, 'cam_services': 1,
|
|
'info': 1, 'timezone': 1
|
|
}|
|
|
|
|
:Выполнить запрос к MongoDB:
|
|
servers = db.ivideon().servers.find(query, projection)|
|
|
|
|
partition "Обработка серверов" {
|
|
:Взять следующий server;
|
|
|
|
while (Есть серверы для обработки?) is (да)
|
|
:server_id = server['_id'];
|
|
:is_shared = server['owner_id'] != user_id;
|
|
:server_build_type = server.get('info', {}).get('build_type', '');
|
|
:is_server_embedded = server_build_type.endswith('camera');
|
|
:cam_services = server.get('cam_services', {});
|
|
|
|
partition "Обработка камер сервера" {
|
|
:Взять следующую камеру (camera_idx, camera_data);
|
|
|
|
while (Есть камеры на сервере?) is (да)
|
|
:service_info = cam_services.get(camera_idx, {})
|
|
.get(service_name, {});
|
|
|
|
if (service_info.get('active', False) == True?) then (да)
|
|
:camera_id = f'{server_id}:{camera_idx}';
|
|
|
|
if (is_server_embedded?) then (да)
|
|
:camera_name = server['name'];
|
|
else (нет)
|
|
:camera_name = camera_data.get('name');
|
|
endif
|
|
|
|
:cameras[camera_id] = {
|
|
'id': camera_id,
|
|
'owner_id': server['owner_id'],
|
|
'server': server_id,
|
|
'name': camera_name,
|
|
'is_shared': is_shared,
|
|
'timezone': server.get('timezone') or
|
|
server.get('timezone_default'),
|
|
'is_embedded': is_server_embedded
|
|
};
|
|
|
|
else (нет)
|
|
note right: Камера пропускается - сервис неактивен
|
|
endif
|
|
|
|
:Взять следующую камеру (camera_idx, camera_data);
|
|
endwhile (нет)
|
|
}
|
|
|
|
:Взять следующий server;
|
|
endwhile (нет)
|
|
}
|
|
|
|
:return cameras;
|
|
|
|
stop
|
|
|
|
note left
|
|
**Результат:** dict[camera_id, camera_info]
|
|
|
|
**Пример:**
|
|
{
|
|
"507f...439011:0": {
|
|
"id": "507f...439011:0",
|
|
"owner_id": "user123",
|
|
"server": "507f...439011",
|
|
"name": "Камера входа",
|
|
"is_shared": false,
|
|
"timezone": "Europe/Moscow",
|
|
"is_embedded": false
|
|
}
|
|
}
|
|
end note
|
|
|
|
@enduml |