FavoriteWorker
src/chathouse/components/favorites/FavoriteWorker.ts
Запускається при старті TU у LadyRunner. Синхронізує “saved” статус діалогів з фаворитами в системі: додає в saved тих, кого треба, і прибирає тих, у кого вже немає активності.
Складається з двох незалежних кроків: addFavorite → removeFavorite. Обидва відстежують статус через 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. Якщо запис відсутній — проходить усі діалоги повністю.
Алгоритм на кожній сторінці:
- Відфільтровуємо діалоги, які вже в
saved(is_saved: true) — їх пропускаємо. - Серед решти — шукаємо тих, у кого manUlid є в списку active favorites.
- Для них:
- синхронізуємо запис у
chathouse_favorite(updateFavoritesByDialogs). - ставимо
save: trueна платформі. - додаємо
dialog.idдоcacheDialogsHavePaidMessages— щобremoveFavoriteне торкався їх повторно.
- синхронізуємо запис у
Після успішного завершення — зберігає новий StatusWorker з поточним timestamp.
Крок 2 — removeFavorite
Мета: пройтися по всіх saved діалогах TU і зняти save у тих RU, які більше не є active favorites.
Джерело даних: діалоги з вкладкою saved (tab: saved), посторінково.
Алгоритм на кожній сторінці:
- Оновлюємо
blockedстатус для всіх RU зі сторінки (saveInfoManBlockedFavorite). - Відфільтровуємо діалоги, які вже оброблені в
addFavorite(черезcacheDialogsHavePaidMessages). - Серед решти — відбираємо тих RU, яких немає в списку active favorites.
- Для них:
- синхронізуємо запис у
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— залишається тільки останній, решта видаляються.