Логін оператора
OperatorAuthService.login() · src/main/auth/operator-auth.service.ts
Головний процес входу в програму. Запускається після кліку на Login в UI через IPC.
UI-екран — Login screen.
Чому так: Весь процес входу зосереджений в одному методі-оркестраторі щоб UI міг відслідковувати кожен крок (updateRendererStage) і показувати прогрес.
Захист від подвійного логіну: флаг isAuthenticating — якщо логін вже йде, повторний виклик ігнорується.
Кроки
- Авторизація — відправка credentials, отримання даних користувача
- Перевірка версії програми — чи актуальна
- Підключення сокету до серверу — отримання списку анкет
- Запуск ранера оператора — старт всіх логік
Якщо будь-який крок падає — логін зупиняється, UI показує помилку.
1. Авторизація
performLogin() → stackService.operatorLogin(credentials)
Відправляє credentials на сервер і отримує у відповідь дані користувача.
Що повертає сервер (ISuccessLogin)
| Поле | Тип | Призначення |
|---|---|---|
token | string | JWT access token |
tokenRefresh | string | JWT refresh token |
user.email | string | Email оператора |
user.name / user.surname | string | Ім’я та прізвище |
user.role | string | Роль (operator) |
user.access | string | Рівень доступу (development, etc.) |
user.isBlocked | boolean | Чи заблокований оператор |
user.deepL.apiKey | string | API-ключ DeepL для перекладу |
user.deepL.language | string | Мова перекладу за замовчуванням |
user.golden.id | string | operatorFamilyId — передається в OperatorRunner.start() |
user.golden.ladies | number[] | Список id анкет оператора |
user.golden.isWSAccess | boolean | Чи є доступ до WebSocket |
user.golden.supervisor | string | ID супервайзера |
user.card | object | Картка оператора (country, instagram, motivation, review тощо) |
Що використовується далі
loginResponse.user.golden.id→operatorFamilyIdв OperatorRunnerloginResponseповністю →IAuthResult.dataдо renderer (для профілю і налаштувань)user.deepL.apiKey/user.deepL.language→ DeepLService
2. Перевірка версії програми
checkVersion() → updateService.checkForUpdates(true)
Перевіряє чи версія актуальна одразу після успішної авторизації.
Чому саме тут: доступ до API з’являється тільки після авторизації. Оператор не повинен починати роботу на застарілій версії.
Детально — updateService. Також на цьому кроці: TimeSyncService, VersionManagerService, settingsService.
3. Підключення сокету до серверу
connectSocket() → stackSocket.initialize()
Встановлює WebSocket-з’єднання і отримує початковий список анкет та їх статуси.
Чому так: Сокет — основний канал для подій в реальному часі (нові таски, зміни статусів). Підключення дає список ladiesStatus — які анкети AVAILABLE і готові до роботи.
Після підключення: фільтруємо анкети — у ранер передаються тільки зі статусом AVAILABLE. Решта ігнорується.
Детально — StackSocket.
4. Запуск ранера оператора
operatorRunner.start({ ladies: readyLadies, operatorFamilyId })
Передає відфільтровані анкети і id оператора в OperatorRunner для старту всіх логік.
Чому так: До цього моменту є все необхідне — токен, актуальна версія, список робочих анкет. Якщо будь-який попередній крок впав — ранер не стартує.
Детально — OperatorRunner.