Ценовые уведомления (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_atNotificationCondition— условие:operator,value(шаг/порог),initial_value(текущий порог),cooldown_minutesNotificationType— справочник: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 storeisPriceNotificationModalActive— видимость единой модалки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)