favorite

Фаворит-сервіс

Окремий екземпляр для кожної TU. Тримає базовий знімок фаворитів і актуальний стан після накладання поточних витрат.

  • Фаворит — RU хоча б раз витрачав кошти на конкретну TU.
  • Активний фаворит — остання витрата була не раніше ніж N днів тому.
  • N — одна спільна настройка; зараз 7, розглядається 5.

Дані

Favorite {
  ruId
  firstPaidAt
  lastPaidAt
  profit?
  gifts?
  paidActions?
  isActive
  isFreeloader
  isWhite
  blockedByTU
  blockedByRU
  chatLimit
  mailLimit
  followUpChat?: {
    sourceUnansweredTaskId
    step
    nextCheckAt
  }
  followUpMail?: {
    postChatSourceTaskId?
    postChatDueAt?
    lastBurstSourceTaskId?
    lastReadEventKey?
  }
}
  • base: Map<ruId, Favorite> — останній знімок із нашого сервера;
  • overlay: Map<ruId, FavoriteUpdate> — поточні витрати, яких ще немає в базі;
  • favorites: Map<ruId, Favorite> — результат base + overlay.

Логіка

  1. Ініціалізується фаворитами зі стартових даних.
  2. Періодичний базовий знімок повністю замінює base.
  3. Новий знімок поточних витрат повністю замінює overlay і заново накладається на чисту базу.
  4. Новий RU з overlay одразу додається у поточні фаворити.
  5. Після кожного оновлення сервіс перераховує isActive, isFreeloader та isWhite.
  6. Змінені поля фаворита зберігаються в БД через наш механізм синку.

Сервіс не виконує запитів. Golden і Chathouse отримують оновлення від сервісу статистики. Джерело оновлень Prime — TODO після проєктування проходу діалогів.

Freeloader

isFreeloader ставиться і знімається автоматично:

ПроєктПравило
Goldenбонусний фаворит із сумою 0
Chathouseвитрачав тільки бонусні кредити
Primeменше 11 платних дій

Freeloader залишається звичайним фаворитом. Окремий виняток — Follow-up Mail для нього не створюється.

White-list

isWhite зберігається прямо у фавориті.

  • у white-list входять неактивні фаворити від N днів до 3 місяців та активні фаворити з малим глобальним балансом;
  • вручну додавати або знімати можна тільки активного фаворита з малим глобальним балансом;
  • senderIgnore у глобальному фавориті RU вимикає сендери незалежно від isWhite;
  • зміна активності, балансу або senderIgnore запускає повторний перерахунок isWhite.

Блокування

blockedByTU і blockedByRU зберігаються у фавориті. Сервіс блокувань використовує їх для спільної перевірки тасків і сендера.

Зв’язки