service

FavoriteService

Фаворити

src/main/lady/favorite.service.ts · src/main/operator/interval-services/favorite.service.ts

Список чоловіків з якими анкета має активні стосунки. Ключова сутність для ChatSender, MailSender, TaskService та відображення в UI.


Два рівні сервісу

СервісРівеньРоль
operator/interval-services/favorite.service.tsОператор (глобальний)Завантажує всі фаворити з API кожні 60 сек, роздає по анкетах, надсилає в UI
lady/favorite.service.tsLadyRunner (per анкета)Зберігає Map<manId, IFavorite>, рахує поля, вирішує NOT_ACTIVE_FAVORITES

Поля IFavorite — звідки

З бекенду (IApiFavorite)

ПолеТипОпис
idstringMongoDB _id запису фаворита
manId_apinumberID чоловіка на сайті
ladyId_apinumberID анкети на сайті
typeFavoriteTypeТип чоловіка: New, Normal, Naughty, Aggressive
contactDetails{ email, status: FavoriteContacts }Контактні дані чоловіка (Yes/No)
clientEmail{ status: EmailStatus }Статус підключення email (connect / connected)
profitnumberСума витрат чоловіка з анкетою
giftsnumberКількість подарунків
blockedByTUbooleanЗаблокований технічним юнітом
languagestring|nullМова спілкування (може оновлюватись оператором)
startDatestringДата початку стосунків (для lifetime)
lastDate + timestringДата та час останньої активності (для isActiveFavorite і NOT_ACTIVE_FAVORITES)
namestringІм’я чоловіка (fallback якщо немає в manService)

Генеруються локально

ПолеЯк рахуєтьсяНавіщо
isActiveFavoriteDate.now() - lastTS < 7 * oneDayMsЧоловік проявляв активність за останні 7 днів → генеруються chat-таски
isWhitewhiteListService.isWhite(manId_api)Чи в whitelist → ChatSender FAV трек
isOnlinemanOnlineService.manIsOnline(manId_api)Поточний онлайн-статус
lastOnlineЗ manService.profilesTimestamp останнього онлайну
pubIDЗ manService.profilesПублічний ID для посилань
manNamemanService.profiles або favorite.nameІм’я + вік
manPhotoЗ manService.profilesАватар чоловіка
ladyNamelady.name + ageІм’я + вік TU
ladyPhotolady.photoФото TU
stackLadyIdlady.stackIdStack ID анкети
hasStreammanOnlineService.manHasStream(manId_api)Чи є активний стрім
lifetimeMath.floor((now - startDate) / oneDayMs)Кількість днів стосунків
messages0 (захардкоджено)Заглушка, раніше рахувалось з ChatSender
mails0 (захардкоджено)Заглушка, раніше рахувалось з MailSender

NOT_ACTIVE_FAVORITES — список для MailSender

NOT_ACTIVE_FAVORITES: number[] — ключовий список для FAV треку MailSender.

Логіка формуванняupdateFavorites):

  1. getDateForNAF()dateT = 7 днів тому, time = час 7 днів тому
  2. ids = Set чоловіків у яких lastDate+time < dateT+time — тобто остання активність була більше 7 днів тому (неактивні)
  3. timeForSender = now - 48 годин
  4. idsWasOnline = фаворити що є в ids І profile.lastOnline >= timeForSender — були онлайн за останні 48 год

NOT_ACTIVE_FAVORITES = idsWasOnline

Суть: неактивні фаворити (давно не писали) але ще заходять на сайт → гарні кандидати для листа.


isActiveFavorite

lastTS = Date.parse(lastDate + 'T' + time)
isActiveFavorite = Date.now() - lastTS < 7 * 24 * 60 * 60 * 1000

Навіщо:

  • true → генеруються chat-таски (TaskChatService)
  • false + NeedToWriteMessage/NeedToWriteMail таск існує → закривається одразу в updateFavorites

Автоматичне видалення з whitelist

В updateFavorites є перевірка:

якщо isActiveFavorite && isWhite && profit >= 10
  → deleteFromWhiteList() + isWhite = false

Навіщо: якщо чоловік активний і вже витратив гроші (profit >= 10) — він більше не потребує автоматичних інвайтів від сендера. Видаляється з whitelist щоб не спамити.


Оновлення

Глобальний цикл (кожні 60 сек):

  1. stackService.getFavorites() — одним запитом всі фаворити всіх анкет
  2. Фільтрує per анкета → lady.favoriteService.updateFavorites(ladyFavorites)
  3. sendToFrontend() — збирає всі фаворити всіх анкет → reactService.sendFavorites()

Після ініціалізації вкладки: updateFavoritesAfterInit() — оновлює isOnline і isWhite для вже завантажених фаворитів (без запиту до API).


FavoriteType

ТипОпис
NewНовий фаворит
NormalЗвичайний
NaughtyГрайливий
AggressiveАктивний/агресивний

Зв’язки з іншими сервісами

СервісЯк використовує
ChatSender FAVwhiteListService.isWhite() + existsFavorite() + contactDetails.status !== Yes + blockedByTU
ChatSender NEW!existsFavorite() — виключає всіх фаворитів з NEW треку
MailSender FAVNOT_ACTIVE_FAVORITES — список кандидатів
MailSender NEW!existsFavorite() — виключає фаворитів
TaskChatServiceisActiveFavorite — чи генерувати таски для цього чоловіка
TaskServiceblockedByTU — не створювати таски
ManOnlineServiceОновлює isOnline, hasStream при кожному тіку