FavoriteWorker

src/chathouse/components/favorites/FavoriteWorker.ts

Запускається при старті TU у LadyRunner. Синхронізує “saved” статус діалогів з фаворитами в системі: додає в saved тих, кого треба, і прибирає тих, у кого вже немає активності.

Складається з двох незалежних кроків: addFavoriteremoveFavorite. Обидва відстежують статус через StatusLogicalRunner (Favorite / UnFavorite).

На локальному середовищі (NODE_ENV=computer) — відразу ставить обидва статуси в done без реальної роботи.


Крок 1 — addFavorite

Мета: знайти в усіх діалогах TU тих RU, по яким є заробіток в статистиці, і поставити їм save: true на платформі.

Джерело даних:

  • active favorites завантажуються один раз на початку через FavoritesService.getActiveFavoritesManUlidsForLady — in-memory список manUlid-ів на весь цикл роботи Worker-а.
  • Діалоги беруться через API (tab: all), посторінково через next.

Інкрементальний запуск:

Worker зберігає в БД (StatusWorkerModel) timestamp попереднього успішного запуску. При наступному старті — завантажує тільки діалоги, де last_message_sent_at >= попереднього timestamp. Якщо запис відсутній — проходить усі діалоги повністю.

Алгоритм на кожній сторінці:

  1. Відфільтровуємо діалоги, які вже в saved (is_saved: true) — їх пропускаємо.
  2. Серед решти — шукаємо тих, у кого manUlid є в списку active favorites.
  3. Для них:
    • синхронізуємо запис у chathouse_favorite (updateFavoritesByDialogs).
    • ставимо save: true на платформі.
    • додаємо dialog.id до cacheDialogsHavePaidMessages — щоб removeFavorite не торкався їх повторно.

Після успішного завершення — зберігає новий StatusWorker з поточним timestamp.


Крок 2 — removeFavorite

Мета: пройтися по всіх saved діалогах TU і зняти save у тих RU, які більше не є active favorites.

Джерело даних: діалоги з вкладкою saved (tab: saved), посторінково.

Алгоритм на кожній сторінці:

  1. Оновлюємо blocked статус для всіх RU зі сторінки (saveInfoManBlockedFavorite).
  2. Відфільтровуємо діалоги, які вже оброблені в addFavorite (через cacheDialogsHavePaidMessages).
  3. Серед решти — відбираємо тих RU, яких немає в списку active favorites.
  4. Для них:
    • синхронізуємо запис у chathouse_favorite.
    • ставимо save: false на платформі.

Синхронізація blocked

На кожній сторінці в removeFavorite викликається saveInfoManBlockedFavorite:

  • Якщо RU заблокував TU (blocked_by_ru: true) — проставляємо blocked: true в chathouse_favorite.
  • Якщо RU, який раніше був заблокований в БД, більше не заблокований у відповіді API — скидаємо blocked: false і синхронізуємо статус у ClickHouse (BlockListHistoryRepository).

Нюанси

  • cacheDialogsHavePaidMessages — масив dialog.id (числових), а не manUlid. Заповнюється в addFavorite, читається в removeFavorite. Живе тільки в межах одного запуску Worker-а.
  • StatusWorkerModel може мати кілька записів для одної TU через збої. На початку addFavorite — залишається тільки останній, решта видаляються.