# Reminder System Quick Start ## 1. Apply Database Migration ```bash # Connect to database and run migration docker-compose exec -T postgres psql -U bmc_hub -d bmc_hub << EOF $(cat migrations/096_reminder_system.sql) EOF ``` Or via psql client: ```bash psql -h localhost -U bmc_hub -d bmc_hub -f migrations/096_reminder_system.sql ``` Verify tables created: ```sql \d sag_reminders \d sag_reminder_logs \d user_notification_preferences \d sag_reminder_queue ``` ## 2. Install Dependencies ```bash pip install aiosmtplib==3.0.2 # Or pip install -r requirements.txt ``` ## 3. Configure Environment Edit `.env`: ```env # ✅ Keep these disabled for local development REMINDERS_ENABLED=false REMINDERS_EMAIL_ENABLED=false REMINDERS_DRY_RUN=true # 📧 SMTP Configuration (optional for local testing) EMAIL_SMTP_HOST=smtp.gmail.com EMAIL_SMTP_PORT=587 EMAIL_SMTP_USER=your-email@gmail.com EMAIL_SMTP_PASSWORD=your-app-password # 💬 Mattermost (optional) MATTERMOST_ENABLED=true MATTERMOST_WEBHOOK_URL=https://mattermost.example.com/hooks/xxxxx MATTERMOST_CHANNEL=reminders ``` ## 4. Restart Application ```bash docker-compose restart api ``` Check logs: ```bash docker-compose logs -f api ``` Should see: ``` ✅ Reminder job scheduled (every 5 minutes) ``` ## 5. Test Frontend Notification System 1. Open http://localhost:8000/ 2. Log in 3. Open browser console (F12) 4. Should see: `✅ Reminder system initialized` 5. Create a test reminder via database: ```sql INSERT INTO sag_reminders ( sag_id, title, message, priority, trigger_type, trigger_config, recipient_user_ids, recipient_emails, recurrence_type, is_active, created_by_user_id, scheduled_at, next_check_at ) VALUES ( 1, -- Replace with actual case ID 'Test Reminder', 'This is a test reminder', 'high', 'time_based', '{}', '{1}', -- Replace with actual user ID '{}', 'once', true, 1, -- Replace with your user ID now(), now() ); ``` 6. Wait ~30 seconds or manually call: `GET /api/v1/reminders/pending/me?user_id=1` 7. Should see popup toast notification ## 6. Test API Endpoints ### Get User Preferences ```bash curl -X GET http://localhost:8000/api/v1/users/me/notification-preferences?user_id=1 ``` ### Update User Preferences ```bash curl -X PATCH http://localhost:8000/api/v1/users/me/notification-preferences?user_id=1 \ -H "Content-Type: application/json" \ -d { "notify_frontend": true, "notify_email": false, "notify_mattermost": true } ``` ### Create Reminder ```bash curl -X POST http://localhost:8000/api/v1/sag/1/reminders?user_id=1 \ -H "Content-Type: application/json" \ -d { "title": "Test Reminder", "message": "This is a test", "priority": "normal", "trigger_type": "time_based", "trigger_config": {}, "recipient_user_ids": [1], "recurrence_type": "once" } ``` ### List Reminders ```bash curl -X GET http://localhost:8000/api/v1/sag/1/reminders ``` ### Snooze Reminder ```bash curl -X POST http://localhost:8000/api/v1/sag/reminders/1/snooze?user_id=1 \ -H "Content-Type: application/json" \ -d { "duration_minutes": 30 } ``` ### Dismiss Reminder ```bash curl -X POST http://localhost:8000/api/v1/sag/reminders/1/dismiss?user_id=1 \ -H "Content-Type: application/json" \ -d { "reason": "Already handled" } ``` ## 7. Test Status Change Trigger 1. Create a reminder with status_change trigger: ```sql INSERT INTO sag_reminders ( sag_id, title, message, priority, trigger_type, trigger_config, recipient_user_ids, recipient_emails, recurrence_type, is_active, created_by_user_id ) VALUES ( 1, -- Your test case 'Case entered In Progress', 'Case has been moved to "i_gang" status', 'high', 'status_change', '{"target_status": "i_gang"}', -- Trigger when status changes to "i_gang" '{1}', '{}', 'once', true, 1 ); ``` 2. Update case status: ```sql UPDATE sag_sager SET status = 'i_gang' WHERE id = 1; ``` 3. Check queue: ```sql SELECT * FROM sag_reminder_queue WHERE status = 'pending'; ``` 4. Should see pending event. Wait for scheduler to process (next 5-min interval) 5. Check logs: ```sql SELECT * FROM sag_reminder_logs ORDER BY triggered_at DESC LIMIT 5; ``` ## 8. Enable Production Features (When Ready) To actually send reminders: ```env REMINDERS_ENABLED=true REMINDERS_DRY_RUN=false # Enable channels you want REMINDERS_EMAIL_ENABLED=true REMINDERS_MATTERMOST_ENABLED=true ``` Then restart and test again. ## 9. Monitor Reminder Execution ### View Pending Reminders ```sql SELECT * FROM v_pending_reminders LIMIT 5; ``` ### View Queue Status ```sql SELECT id, reminder_id, status, error_message FROM sag_reminder_queue WHERE status IN ('pending', 'failed') ORDER BY created_at DESC LIMIT 10; ``` ### View Notification Logs ```sql SELECT id, reminder_id, sag_id, status, triggered_at, channels_used FROM sag_reminder_logs ORDER BY triggered_at DESC LIMIT 20; ``` ### Check Rate Limiting ```sql SELECT user_id, COUNT(*) as count, MAX(triggered_at) as last_sent FROM sag_reminder_logs WHERE status = 'sent' AND triggered_at > CURRENT_TIMESTAMP - INTERVAL '1 hour' GROUP BY user_id ORDER BY count DESC; ``` ## Common Issues ### "Reminder system not initialized" - User not authenticated - Check that JWT token is valid - Check browser console for auth errors ### Reminders not appearing - Check `REMINDERS_ENABLED=true` - Check `next_check_at <= NOW()` - Check `recipient_user_ids` includes current user - Verify polling API returns data: `GET /api/v1/reminders/pending/me` ### Email not sending - Check `REMINDERS_EMAIL_ENABLED=true` - Check SMTP credentials in `.env` - Check `REMINDERS_DRY_RUN=false` - Review application logs for SMTP errors - Try sending with `REMINDERS_DRY_RUN=true` first (logs only) ### Status trigger not firing - Verify case ID exists - Check trigger_config matches: `{"target_status": "expected_status"}` - Manually check: `UPDATE sag_sager SET status = 'target_status'` - Query `sag_reminder_queue` for new events ## Next Steps 1. ✅ Database migration applied 2. ✅ Environment configured 3. ✅ Frontend notifications working 4. ✅ API endpoints tested 5. → Configure email/Mattermost credentials 6. → Enable production features 7. → Monitor logs and metrics 8. → Set up alerting for failures See [REMINDER_SYSTEM_IMPLEMENTATION.md](REMINDER_SYSTEM_IMPLEMENTATION.md) for detailed documentation.