@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