@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