02-tus

TU

src/tus/ · src/team/ · src/tu-refresh/ · src/workers/tu-refresh.worker.ts — анкети проєкту: хто які TU бачить, синхронізація з партнером, паролі й налаштування TU.

Дані: project_tus · Swagger: теги TUs і Team у /v2/docs · План: TUService, TU Sync Worker

Що робить модуль

  • Тримає canonical TU всіх адмін панелей проєкту і щодня синхронізує їх з партнером.
  • Визначає доступ ролі до TU: видимість і дозволені дії. Політика спільна для всіх модулів, що працюють з TU.
  • Змінює паролі TU на партнері і налаштування TU, що передаються в Electron.

Призначення в змінах — 03-tu-assignments; історія призначень у часі — 04-tu-links.

Логіка

Доступ

Які TU бачить роль:

РольЯкі TU
directorусі TU проєкту у своєму scope
top managerTU, у зміні яких стоїть тімлід його структури
client managerсвої TU, а також TU без client manager на адмін панелях, які йому доступні
тімлідTU, у зміні яких стоїть він
operatorTU, у зміні яких стоїть він
hr, recruiter, technical departmentнічого

Що роль отримує у видимих TU:

РольАдмін панельClient managerЗміниМоже діяти
director✓з IDусівсюди
top manager✓з IDусіу вільній зміні або зміні свого тімліда
client manager✓з IDусіна своїх TU
тімлід—лише ім’ятільки своїу своїй зміні
operator—прихованотільки своїніде

Форма відповіді однакова для всіх ролей: у TU завжди три зміни, зміна поза доступом позначена як невидима. Project ID і User ID віддаються лише для призначень, якими роль може керувати; в інших — лише ім’я. TU зі зв’язком зі Stack доповнюється карткою: рівень, статус client email, кому відкритий email.

TU поза доступом повертає 404, а не 403: відповідь не розкриває факт існування TU.

Preview

Ім’я, аватар і партнерські ID TU з тією ж політикою доступу і фільтрами по тімліду та оператору. Golden читається з project_tus, інші проєкти — з legacy до міграції їхніх TU.

Структура команди

Окремий запит без TU: frontend групує TU за оператором зміни, тож серіалізація TU і правила доступу лишаються в одному місці.

РольЩо отримує
top managerпо групі на кожного тімліда своєї структури, у порядку структури; заблоковані та видалені тімліди пропускаються
тімлідодну групу: себе і своїх активних операторів
operatorодну групу без тімліда і лише свій запис, без ID
інші роліпорожній список

Оператори тімліда сортуються за ім’ям. Online і sleep-режим операторів у відповідь не входять, див. tech-debt.

Налаштування TU (projectData)

Зміна полів projectData однієї TU. Поле приймається, лише якщо його підтримує проєкт TU і має право змінювати роль: невідоме поле — 400, недозволене ролі — 403. Зараз це лише findNew у Golden (chat-sender по онлайну), для director і top manager. Після запису зміна з операторами всіх змін TU надсилається в Electron Gateway. Поля, які пише синхронізація, через API не змінюються.

Паролі

Для кожної TU генерується пароль з 10 символів; сервіс проєкту змінює його на партнері через адмін панель TU, після підтвердження пароль зберігається зашифрованим. Видалена TU або TU без активної адмін панелі повертається в failed з причиною, обробка решти триває. Пароль у відповідь не повертається.

Refresh з партнера

Синхронізує canonical TU зі списками TU активних адмін панелей на партнері. Тригери: щоденний воркер, ручний запуск директора, project-golden при невідомій TU у вигрузці статистики.

  1. Беруться директори з активними адмін панелями; без жодного запуск пропускається.
  2. Для кожного scope сервіс проєкту повертає snapshot: усі TU всіх активних адмін панелей. Очікування до 20 хвилин.
  3. Snapshot порівнюється з canonical: створена, відновлена, переїхала до іншої адмін панелі, активована, деактивована, видалена, змінились профіль, партнерські ID або можливості. Одна TU може мати кілька подій одразу.
  4. У TU, що переїхали або видалені, знімаються тімлід і оператор у всіх змінах (03-tu-assignments). Помилка тут зупиняє refresh.
  5. Зміни записуються одним пакетом; нова TU отримує три порожні зміни. Події створення, активації, деактивації і видалення пишуться в tu_logs (відновлена логується як створена) і одразу потрапляють у зв’язки TU.
  6. Активні TU без пароля або без синхронізованої історії передаються в init у фоні; refresh повертає їх кількість, не чекаючи завершення.

Помилка одного scope не зупиняє інші, але запуск позначається невдалим.

Init нової TU

Виконується у фоні після refresh для активних TU без пароля або без синхронізованої історії, по одній TU, під локом на scope (1 година):

  1. Пароль на партнері — той самий шлях, що й ручна зміна паролів.
  2. Сервіс проєкту завантажує історію TU до появи в агенції за credentials самої TU; рядки пишуться в статистику як зовнішні (05-project-statistics). Після успіху TU позначається синхронізованою.
  3. Перераховуються favorites цих TU (03-project-favorites).

Помилка однієї TU логується і не зупиняє решту; TU повертається в init на наступному refresh. Udate (без паролів TU) init не проходить.

Розклад

ПроєктКолиПовтори
Goldenщодня о 00:01 за Києвом3 спроби з паузою 30 хвилин

Розклад задано в backend-common (легасі-назва воркера CheckProfiles для Stack Monitoring); автоматичні запуски увімкнені лише в production, кожен запуск виконує одна репліка.

API для frontend

РоутЩо робитьРолі
POST /v2/tus/findповний список TU у scope роліdirector, top manager, client manager, тімлід, operator
POST /v2/tus/previewлегкий список TU з фільтрамиті самі
POST /v2/team/findструктура команди для групування TUtop manager, тімлід, operator
POST /v2/tus/updateProjectDataналаштування однієї TUзалежно від поля
POST /v2/tus/changePasswordsнові паролі вибраних TUdirector, top manager, тімлід, client manager
POST /v2/tus/refreshrefresh з партнера заразdirector

Internal API

РоутХто викликаєНавіщо
POST /v2/internal/tus/refreshproject-goldenrefresh при невідомій TU у вигрузці статистики
POST /v2/internal/tus/detachStackзняття TU з тімліда чи оператора при блокуванні, видаленні або переведенні — 03-tu-assignments

Нюанси

  • Один refresh на scope одночасно: лок на 5 хвилин, спільний для воркера, ручного запуску й internal-виклику.
  • Дублікат TU на платформі або TU у двох адмін панелях зупиняють порівняння помилкою: результат у такому стані недостовірний.
  • Scope директора обов’язковий для всіх змін; читання без нього дозволене ролям, у токені яких директора немає.
  • Legacy після синхронізації докачував історію нових TU і створював favorites; тут це робить init у фоні, окрім Udate.
  • Скидання пароля TU з mail-extension поки лишається в legacy, див. tech-debt.