project-global-favorite

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
Goldengolden_global_mans10 125manId (є один дубль)ladies, contacts, profit, gifts, firstMessageAt, lastMessageAt; isFreeProfit ніде не truename, satellite, lastOnlineAt; note + updateNoteAt (6 doc)
Goldengolden_man_profiles149 079manId_api—name, age (0 у 60 %), avatar, pubID (satellite), lastOnline (ms)
Primeprime_global_mans328 141manIdladies, contacts, profit (кількість повідомлень), firstMessageAt, lastMessageAtname, lastOnlineAt, checkedNameOnApiAt; note
Chathousechathouse_global_mans226 538manUlidladies, profit, gifts (3 doc), isFreeProfit, firstMessageAt, lastMessageAt; contacts не заповнюєтьсяname, lastOnlineAt; note
Udateudate_global_mans33 462manUlidladies, contacts, profit (кількість повідомлень), firstMessageAt, lastMessageAtname, 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ДжерелоПравило
_idgolden_global_mans._idзберігається, якщо RU там є; для дубля manId береться перший за _id
ruIdmanIdString(manId)
tuCount, contacts, profit, giftsproject_favorites$group за ruId
firstPaidAt, lastPaidAtproject_favoritesмінімум і максимум по зв’язках
profile.namegolden_man_profiles.nameрезерв: golden_global_mans.name, далі golden_favorites.name
profile.agegolden_man_profiles.age0 стає null
profile.avatargolden_man_profiles.avatarяк є
profile.isSatellitegolden_global_mans.satellite або golden_man_profiles.pubID > 0
lastOnlineAtпізніше з golden_global_mans.lastOnlineAt і golden_man_profiles.lastOnline
isFreeloaderprofit <= 0Golden: платний 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, сортування, paginationGlobalManService.getGlobalMenForRoles
Frontend /globalMan/updateGlobalManByIdnoteGlobalManService.updateGlobalManById
Favorites і статистикаповний перерахунок агрегату після updateFavorites*, initFavorites, а для змінених RU — після вигрузки статистикиGlobalManService.generateGlobalFavorites
Online-аналізlastOnlineAt у golden_global_mans і lastOnline у golden_man_profilesOnlineAnalysisService
Electron /getMenStore, /createMenProfilesповний кеш профілів RU і додавання нових профілів з ElectronManProfileStore

Індекси

  • 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.