sandbox/ivideon/puml/arch/AN_camera_creation_via_app.puml
2026-02-13 17:36:23 +03:00

151 lines
4.6 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@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\n<uin>100-abc...</uin>\n<password>Kfnl31ba...</password>
== ЭТАП 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 <access_token>
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