Перейти к содержанию

Ценовые уведомления (Price Notifications)

Типы уведомлений

price-target (id=2)

Одноразовое уведомление при достижении целевой цены. Деактивируется после срабатывания.

price-change (id=8)

Рекуррентное уведомление об изменении цены актива за день. НЕ деактивируется — работает с нарастающим порогом.

Архитектура

Бэкенд (cryptodiary)

Модели

  • Notification — основная запись: user_id, targetable_type/id (полиморф), notification_type_id, name, is_active, last_triggered_at
  • NotificationCondition — условие: operator, value (шаг/порог), initial_value (текущий порог), cooldown_minutes
  • NotificationType — справочник: code, title_template, body_template, path

Механика нарастающего порога (price-change)

  • condition.value = шаг (исходный порог, напр. 5%)
  • condition.initial_value = текущий активный порог (начинается с value)
  • После каждого trigger: initial_value += value (5% → 10% → 15% → ...)
  • Ежедневный сброс: если last_triggered_at < начало сегодня, initial_value возвращается к value
  • cooldown_minutes: 60 (ежечасно) или 1440 (ежесуточно)

Сервисы

  • PriceAlertNotificationService — обработка price-target (каждые 3 мин)
  • PriceChangeNotificationService — обработка price-change (каждые 15 мин)
    • Для индивидуального актива: проверяет targetable.price_change_percentage_24h
    • Для портфеля: итерирует portfolio.assets(), проверяет каждый asset.assetable.price_change_percentage_24h
    • Для watchlist: итерирует watchlist.watchlistItems(), проверяет каждый item.assetable.price_change_percentage_24h

Команды

  • notify:price-alerts — каждые 3 минуты (price-target)
  • notify:price-change-alerts — каждые 15 минут (price-change)

API

  • POST /api/price-alert — создать price-target (поля: target_price, assetable, name)
  • POST /api/price-change-alert — создать price-change (поля: threshold, frequency, targetable_type, targetable_id, assetable_type_simplified, name)
  • POST /api/switch-notification/{id} — вкл/выкл (для price-change сбрасывает порог)
  • GET /api/notifications — список уведомлений пользователя
  • DELETE /api/notifications/{id} — удаление

Фронтенд (hadl-front)

Store

  • stores/notifications.js — Pinia store
    • isPriceNotificationModalActive — видимость единой модалки
    • priceNotificationModalTab'target' / 'change'
    • priceNotificationTargetableType'asset' / 'portfolio' / 'watchlist'
    • priceAlertForm — форма price-target (target_price, name, assetable)
    • priceChangeAlertForm — форма price-change (threshold, frequency, name, targetable_type, targetable_id, assetable_type_simplified)
    • openPriceNotificationModal(targetable, targetableType, tab) — открытие модалки

Компоненты

  • Modals/PriceNotificationModal.vue — единая модалка с переключателем типа (целевая цена / изменение цены)
    • Для asset показывает оба таба
    • Для portfolio/watchlist — только «Изменение цены»
    • Дискретный слайдер порога: 1%, 2%, 3%, 5%, 10%
    • Переключатель частоты: ежечасно / ежесуточно

Точки входа

  • AssetPage.vue — иконка колокольчика → openPriceNotificationModal(asset)
  • AssetsTable.vue — действие «Увед. о цене» → openPriceNotificationModal(row)
  • PortfoliosTable.vue — действие «Уведомление об изменении цены» → openPriceNotificationModal(row, 'portfolio', 'change')
  • Watchlists.vue — кнопка «Уведомления» → openPriceNotificationModal(watchlist, 'watchlist', 'change')

NotificationsTable.vue

  • Для price-change: показывает текущий порог, шаг, частоту
  • Для всех типов: показывает name если задано
  • Switcher для вкл/выкл поддерживает price-change

Поле price_change_percentage_24h

Все типы активов (Token, Share, Bond, Etf, Future, Currency, CustomAsset) имеют поле price_change_percentage_24h, которое обновляется:

  • Каждую минуту для активов с открытыми сделками (get:assetRates --only_used_assets)
  • Каждые 15 минут для всех активов (get:assetRates)
  • Каждую минуту для основных криптовалют (command:GetMainCoinsRates)