@startuml Desktop Server Workflow skinparam sequenceMessageAlign center title Ivideon Desktop Server (MacBook) - Camera Addition Workflow actor "User" as user participant "Ivideon Server\nApp (MacBook)" as app participant "MacBook\nFaceTime Camera" as camera participant "API5/API4" as api database "MongoDB" as db participant "Broker/Hive" as broker == ЭТАП 1: Установка и авторизация == user -> app: Запускает приложение activate app app -> user: Показывает форму входа user -> app: Вводит email + password app -> api: POST /auth\n{email, password} activate api api -> db: Валидация credentials api --> app: {access_token, user_id, session_id} deactivate api note right of app Приложение получило access_token для API запросов end note == ЭТАП 2: Автоматическая регистрация сервера == app -> app: Определяет параметры:\n- device_id = MacBook SN\n- build_type = "mac_server"\n- name = "MacBook Pro" app -> api: POST /public/roster\n{login: "user@example.com",\nname: "MacBook Pro",\ndevice_id: "ABC123",\nbuild_type: "mac_server"} activate api api -> api: DeviceInfo.guess_from_request()\n→ device_type = DESKTOP api -> api: initiate_desktop_attachment() note right Создание СУРРОГАТНОГО attachment token (пользователь не создавал!) end note api -> db: FIND user by login\n"user@example.com" db --> api: {_id: "100-user123"} api -> db: CREATE attachment_token\n{_id: "ABC123",\nuser: "100-user123",\nname: "MacBook Pro",\ntype: "serial_number"} api -> api: consume_attachment_token() api -> db: CREATE/UPDATE server\n{uin: generate(),\nowner: "100-user123",\nname: "MacBook Pro",\npassword: random()} db --> api: {uin: "100-abc...",\npassword: "Kfnl31ba..."} api --> app: {uin: "100-abc...",\npassword: "Kfnl31ba...",\nname: "MacBook Pro"} deactivate api == ЭТАП 3: Сохранение credentials == app -> app: Сохранение в config:\n~/Library/.../config.xml\n100-abc...\nKfnl31ba... == ЭТАП 4: Подключение к облаку == app -> broker: CONNECT\n{uin: "100-abc...",\npassword: "Kfnl31ba..."} activate broker broker -> db: VERIFY credentials db --> broker: OK broker -> db: UPDATE servers\n{online: true} broker --> app: Connected deactivate broker note right of app Сервер подключен к облаку Статус: ONLINE end note == ЭТАП 5: Обнаружение доступных камер == app -> app: Сканирование устройств:\n- USB камеры\n- IP-камеры (UPnP/ONVIF)\n- Вручную добавленные app -> camera: Опрос устройства camera --> app: {name: "FaceTime HD",\ntype: "USB",\ncodec: "h264",\nresolution: 1280x720} app -> user: Показывает список:\n☐ FaceTime HD Camera\n☐ IP Camera (192.168.1.105) note right of user Пользователь видит все доступные камеры и выбирает нужные end note == ЭТАП 6: Активация камеры == user -> app: Выбирает ☑ FaceTime HD Camera app -> app: Присваивает ID камере:\ncam_id = 65536 app -> broker: NOTIFICATION: new_cams\n{server_id: "100-abc...",\ncameras: {\n "65536": {\n name: "FaceTime HD",\n online: true,\n type: "web"\n }\n}} activate broker broker -> api: Пересылка notification deactivate broker activate api api -> api: roster.new_cams() api -> db: UPDATE servers.cameras.65536\n{name: "FaceTime HD",\nonline: true,\nbilling_initialized: true} api -> api: b5_new_cams()\nПодключение услуг api -> db: CREATE cam_services.65536\n{archive, notifications, ...} api -> api: Отправка метрики\nDeviceCreationMetric deactivate api == ЭТАП 7: Камера доступна == user -> api: GET /cameras\nAuthorization: Bearer activate api api -> db: FIND servers\nwhere owner_id = "100-user123" db --> api: [{cameras: {"65536": {...}}}] api --> user: [\n {\n id: "100-abc...:65536",\n name: "FaceTime HD Camera",\n type: "web",\n online: true\n }\n] deactivate api == ЭТАП 8: Добавление второй камеры (IP) == user -> app: Добавить IP-камеру\nrtsp://192.168.1.105 app -> app: cam_id = 131072 app -> broker: NOTIFICATION: new_cams\n{cameras: {\n "131072": {...}\n}} note right Процесс повторяется для каждой новой камеры IDs инкрементируются: 65536, 131072, 196608, ... end note @enduml