@startuml User Registration Flow skinparam sequenceMessageAlign center skinparam BoxPadding 10 title Процесс регистрации пользователя в Ivideon Cloud actor "Клиент\n(Web/Mobile)" as Client box "API Service (api4)" #LightBlue participant "OpenUserRegistration\nHandler" as Handler participant "User.open_registration()" as OpenReg participant "register_user()" as RegisterUser end box database "MongoDB\n(main)" as MongoDB database "MongoDB\n(user_registry)" as UserRegistryDB box "User Registry Service" #LightGreen participant "UserRegistry\nService" as URService end box == Регистрация пользователя == Client -> Handler: POST /public/registration\n{login, password, partnerId, ...} activate Handler Handler -> OpenReg: open_registration(login, password, ip, ...) activate OpenReg OpenReg -> OpenReg: Определение partner_id,\ngroup_id, currency OpenReg -> OpenReg: Применение реферальных кодов\nи промо-акций OpenReg -> RegisterUser: register_user(login, password, ...) activate RegisterUser == Проверки перед регистрацией == RegisterUser -> RegisterUser: Валидация логина (email) RegisterUser -> MongoDB: Проверка существующего пользователя\nfind_one({'login': login}) MongoDB --> RegisterUser: existing_user = None RegisterUser -> UserRegistryDB: Проверка профиля в UserRegistry\nget_profile_by_login(login) note right Проверяется, не зарегистрирован ли пользователь в другом шарде end note UserRegistryDB --> RegisterUser: profile = None == Создание пользователя == RegisterUser -> RegisterUser: Формирование объекта new_user:\n- login, password (hash)\n- partner_id, group_id\n- currency, country\n- balance = 0\n- registration info (ip, time)\n- account_type RegisterUser -> RegisterUser: Генерация user_id RegisterUser -> RegisterUser: Создание root_folder RegisterUser -> MongoDB: users.insert_one(new_user) activate MongoDB MongoDB --> RegisterUser: OK deactivate MongoDB RegisterUser -> MongoDB: folders.insert_one(root_folder) activate MongoDB MongoDB --> RegisterUser: OK deactivate MongoDB note over RegisterUser, MongoDB В MongoDB (main) записываются: 1. Запись пользователя в коллекцию "users" 2. Корневая папка в коллекцию "folders" end note RegisterUser -> RegisterUser: Применение дефолтных сервисов\n(для биллинга v4) RegisterUser -> RegisterUser: Применение промо-акций\n(если валюта подтверждена) RegisterUser --> OpenReg: {user: , report: {...}} deactivate RegisterUser OpenReg -> OpenReg: Обновление статистики реферальных кодов OpenReg -> OpenReg: Отправка уведомления о регистрации\n(если настроено) OpenReg --> Handler: {user, report} deactivate OpenReg Handler --> Client: HTTP 200\n{id, login, registrator_id, ...} deactivate Handler == Опциональная запись в UserRegistry == note over URService UserRegistry НЕ обновляется автоматически при регистрации. Запись создается через отдельный внутренний API endpoint: POST /inner/user_registry/users Это может делать другой сервис для управления шардированием end note @enduml