ProjectGlobalFavorite
Collection project_global_favorites — один глобальний фаворит RU у межах одного проєкту. Schema, indexes і ProjectGlobalFavoriteRepository оголошені в @it-monkeys/backend-common, типи — у @it-monkeys/contracts (ProjectGlobalFavoriteBase).
Поля
- project — проєкт, до якого належить RU.
- ruId — ID RU на партнері, збережений як string; той самий ключ, що у ProjectFavorite.
- profile.name — ім’я RU або
null. - profile.age — вік RU або
null. - profile.avatar — URL аватара або
null. - profile.isSatellite — ознака Golden satellite; для інших проєктів відсутня.
- profileUpdatedAt — час останнього оновлення короткого профілю.
- lastOnlineAt — коли RU востаннє був online.
- firstPaidAt / lastPaidAt — перша й остання платна дія цього RU у проєкті.
- tuCount — кількість TU, для яких RU є фаворитом.
- contacts — кількість TU, для яких контакт RU позначений як отриманий.
- profit — сума
profitусіх зв’язків RU з TU. - gifts — кількість подарунків RU у всіх TU.
- isFreeloader — нормалізований результат перевірки Freeloader для всіх проєктів.
- senderIgnore — RU вручну виключений із сендерів у всьому проєкті; поточний аналог у Prime — Agency blacklist.
- createdAt / updatedAt — час створення й останньої зміни документа.
Нотатки не зберігаються у ProjectGlobalFavorite: звичайні й AI-нотатки належатимуть окремій collection.
Поточні collections по проєктах
Реальні поля з production-дампу на 2026-09-03.
| Проєкт | Collection | Документів | Ключ | Агрегат | Профіль і online |
|---|---|---|---|---|---|
| Golden | golden_global_mans | 10 125 | manId (є один дубль) | ladies, contacts, profit, gifts, firstMessageAt, lastMessageAt; isFreeProfit ніде не true | name, satellite, lastOnlineAt; note + updateNoteAt (6 doc) |
| Golden | golden_man_profiles | 149 079 | manId_api | — | name, age (0 у 60 %), avatar, pubID (satellite), lastOnline (ms) |
| Prime | prime_global_mans | 328 141 | manId | ladies, contacts, profit (кількість повідомлень), firstMessageAt, lastMessageAt | name, lastOnlineAt, checkedNameOnApiAt; note |
| Chathouse | chathouse_global_mans | 226 538 | manUlid | ladies, profit, gifts (3 doc), isFreeProfit, firstMessageAt, lastMessageAt; contacts не заповнюється | name, lastOnlineAt; note |
| Udate | udate_global_mans | 33 462 | manUlid | ladies, contacts, profit (кількість повідомлень), firstMessageAt, lastMessageAt | name, lastOnlineAt; note |
Golden тримає профілі окремо від агрегату: golden_man_profiles містить 149 079 RU, з яких favorites мають лише 9 805. Решта профілів у ProjectGlobalFavorite не потрапляє.
Legacy → canonical для Golden
Агрегат не копіюється з golden_global_mans, а перебудовується з project_favorites: legacy-агрегат розходиться з власними favorites по profit у 313 RU і по ladies у 12 RU.
| Canonical | Джерело | Правило |
|---|---|---|
_id | golden_global_mans._id | зберігається, якщо RU там є; для дубля manId береться перший за _id |
ruId | manId | String(manId) |
tuCount, contacts, profit, gifts | project_favorites | $group за ruId |
firstPaidAt, lastPaidAt | project_favorites | мінімум і максимум по зв’язках |
profile.name | golden_man_profiles.name | резерв: golden_global_mans.name, далі golden_favorites.name |
profile.age | golden_man_profiles.age | 0 стає null |
profile.avatar | golden_man_profiles.avatar | як є |
profile.isSatellite | golden_global_mans.satellite або golden_man_profiles.pubID > 0 | |
lastOnlineAt | пізніше з golden_global_mans.lastOnlineAt і golden_man_profiles.lastOnline | |
isFreeloader | profit <= 0 | Golden: платний RU реально витрачав кошти |
senderIgnore | — | false |
| — | note, updateNoteAt | переносяться окремим кроком у NotesService |
Міграція виконується разом із favorites: POST /migrations/favorites/apply. Перебудова idempotent; RU без жодного favorite видаляються з canonical collection.
Використання в legacy Golden
| Хто | Що робить | Джерело |
|---|---|---|
Frontend /globalMan/getGlobalMen | список RU за роллю: director — усі, тімлід і top manager — RU своїх TU; пошук за ім’ям або manId, сортування, pagination | GlobalManService.getGlobalMenForRoles |
Frontend /globalMan/updateGlobalManById | note | GlobalManService.updateGlobalManById |
| Favorites і статистика | повний перерахунок агрегату після updateFavorites*, initFavorites, а для змінених RU — після вигрузки статистики | GlobalManService.generateGlobalFavorites |
| Online-аналіз | lastOnlineAt у golden_global_mans і lastOnline у golden_man_profiles | OnlineAnalysisService |
Electron /getMenStore, /createMenProfiles | повний кеш профілів RU і додавання нових профілів з Electron | ManProfileStore |
Індекси
- unique
{ project: 1, ruId: 1 }—uniq_project_global_favorite_ru; { project: 1, lastPaidAt: -1 }—project_global_favorite_list, список Global Favorites;{ project: 1, "profile.name": 1 }—project_global_favorite_name, пошук за ім’ям;{ project: 1, lastOnlineAt: -1 }—project_global_favorite_online, сортування за останнім online.
Заповнити
- Де живуть короткі профілі RU, які не є favorites (139 000 у Golden): Electron зараз отримує повний кеш
golden_man_profiles. - Затвердити спільне правило Freeloader перед міграцією Prime, Chathouse і Udate: див. GlobalFavoriteService.