diff --git a/Projects/Pulse/Notifications.md b/Projects/Pulse/Notifications.md index f2717a0..b74314c 100644 --- a/Projects/Pulse/Notifications.md +++ b/Projects/Pulse/Notifications.md @@ -4,12 +4,12 @@ ### Функционал - При `/start` бот отправляет пользователю его `chat_id` -- Пользователь копирует этот ID и вставляет в профиль на сайте +- Пользователь копирует ID и вставляет в профиль на сайте - Бот отправляет уведомления о задачах и привычках ### Реализация - Часть homelab-api (отдельный goroutine) -- Используем go-telegram-bot-api +- go-telegram-bot-api - Long polling ## Профиль пользователя @@ -18,36 +18,70 @@ ```sql ALTER TABLE users ADD COLUMN telegram_chat_id BIGINT; ALTER TABLE users ADD COLUMN notifications_enabled BOOLEAN DEFAULT true; -ALTER TABLE users ADD COLUMN morning_reminder_time TIME DEFAULT '09:00'; -ALTER TABLE users ADD COLUMN evening_reminder_time TIME DEFAULT '18:00'; ALTER TABLE users ADD COLUMN timezone VARCHAR(50) DEFAULT 'Europe/Moscow'; ``` ### API endpoints - `GET /profile` — получить профиль -- `PUT /profile` — обновить профиль +- `PUT /profile` — обновить профиль (telegram_chat_id, notifications_enabled, timezone) -## Напоминания +### UI +- Страница /settings или /profile +- Поля: telegram chat ID, вкл/выкл уведомления, часовой пояс -### Задачи (Tasks) -- **Утром (9:00)**: список задач на сегодня -- **Вечером (18:00)**: невыполненные задачи +## Логика уведомлений -### Привычки (Habits) -- **Утром**: какие привычки нужно выполнить сегодня -- **Вечером**: невыполненные привычки +### Утреннее уведомление (9:00) +- Список **задач на сегодня** (due_date <= today, не выполнены) +- Отправляется один раз утром -### Scheduler -- `robfig/cron` в Go -- Проверка каждую минуту, отправка по времени пользователя +### Индивидуальные напоминания +Для **каждой задачи** и **каждой привычки** можно установить время напоминания. + +**Логика:** +- Если задача/привычка НЕ выполнена к указанному времени → отправить уведомление +- Пример: привычка "гитара" выполнять в 18:00, напоминание в 17:00 + - Каждый день в 17:00 проверяем: выполнена ли сегодня? + - Если нет → отправляем "Не забудь: гитара 🎸" + +### Глобальный выключатель +- Если `notifications_enabled = false` в профиле → никакие уведомления не отправляются +- Если `telegram_chat_id` не заполнен → уведомления не отправляются + +## Новые поля в БД + +### tasks +```sql +ALTER TABLE tasks ADD COLUMN reminder_time TIME; +``` + +### habits +```sql +ALTER TABLE habits ADD COLUMN reminder_time TIME; +``` + +## Архитектура + +### Scheduler (robfig/cron) +- Запускается каждую минуту +- Для каждого пользователя с notifications_enabled=true и telegram_chat_id: + 1. Проверить, нужно ли отправить утреннее уведомление (9:00 по timezone) + 2. Найти задачи с reminder_time = текущее время, не выполнены → отправить + 3. Найти привычки с reminder_time = текущее время, не выполнены сегодня → отправить + +### Telegram Bot +- Long polling в отдельной goroutine +- Команды: `/start` → отправить chat_id ## TODO -- [ ] Создать Telegram бота (@BotFather) -- [ ] Миграция БД -- [ ] API: /profile -- [ ] Telegram bot handler -- [ ] Scheduler -- [ ] UI: страница профиля/настроек +- [ ] Создать Telegram бота (@BotFather) → получить токен +- [ ] Миграция БД: поля в users, tasks, habits +- [ ] API: GET/PUT /profile +- [ ] API: Telegram bot handler (long polling) +- [ ] Backend: scheduler с robfig/cron +- [ ] UI: страница настроек профиля +- [ ] UI: поле reminder_time в формах задач и привычек --- *Создано: 2026-02-06* +*Обновлено: 2026-02-06*