Files
MyClub/DOCS/NEWSLETTER_IMPLEMENTATION_SUMMARY.md
Tomáš Dvořák 12cba639b9 upload
2025-10-16 13:32:05 +02:00

252 lines
8.6 KiB
Markdown

# Newsletter Implementation Summary
## ✅ Implementation Complete
The comprehensive newsletter system has been fully implemented with all requested features.
## 🎯 Features Implemented
### 1. **Enhanced Subscription Flow**
- ✅ Initial email with token for preference setup
- ✅ Welcome email with unsubscribe/manage links
- ✅ Token-based preference management (no login required)
- ✅ Unsubscribe functionality in every email
### 2. **Four Newsletter Types**
#### **Týdenní Přehled (Weekly Overview)**
- ✅ Sends every Sunday at 9 AM (configurable day/hour in admin)
- ✅ Contains blogs, activities, matches, scores
- ✅ Filtered by user preferences and categories
#### **Nadcházející Zápasy (Upcoming Matches)**
- ✅ Sends 2 days before match (configurable lead time)
- ✅ Sends day-of reminder (0-6 hours before)
- ✅ Includes: category, teams, place, time, date
- ✅ Filtered by user-selected categories
#### **Nový Blog (Blog Notifications)**
- ✅ Sends immediately when blog is published
- ✅ Includes title, excerpt, tracked link to article
- ✅ Filtered by blog categories
- ✅ Auto-triggered from admin when publishing
#### **Výsledky Zápasu (Match Results)**
- ✅ Sends after match finishes (within 6 hours)
- ✅ Includes final score and match details
- ✅ Respects quiet hours (default 22:00-08:00)
- ✅ Filtered by categories
### 3. **Email Analytics & Tracking**
- ✅ Open tracking (transparent pixel)
- ✅ Click tracking (all links wrapped)
- ✅ Blog links with tracking parameters
- ✅ Unsubscribe tracking
- ✅ All events logged in `email_event` table
### 4. **Admin Configuration**
- ✅ Master on/off toggle
- ✅ Individual newsletter type toggles
- ✅ Weekly schedule configuration (day + hour)
- ✅ Match reminder lead time setting
- ✅ Quiet hours for result notifications
- ✅ Manual test sending
- ✅ Manual digest sending
- ✅ Newsletter preview
- ✅ Subscriber management
### 5. **Category-Based Filtering**
- ✅ Users can specify categories in preferences
- ✅ Comma-separated list (e.g., "MFS A, MFS B, Divize")
- ✅ Applied to matches, results, and blogs
- ✅ Empty = receive all categories
## 📁 Files Created/Modified
### **New Files**
1. `database/migrations/20250930000001_enhance_newsletter_system.up.sql` - Migration for tracking tables
2. `database/migrations/20250930000001_enhance_newsletter_system.down.sql` - Rollback migration
3. `internal/services/newsletter_automation.go` - Main automation service (550+ lines)
4. `NEWSLETTER_SYSTEM.md` - Comprehensive documentation
5. `NEWSLETTER_IMPLEMENTATION_SUMMARY.md` - This file
### **Modified Files**
1. `internal/models/email.go` - Added tracking models (`NewsletterSentLog`, `MatchNotification`, `BlogNotification`)
2. `internal/controllers/base_controller.go` - Added blog notification trigger
3. `internal/routes/routes.go` - Added newsletter automation instance management
4. `main.go` - Initialize and start newsletter automation
5. `internal/models/models.go` - Settings table already had newsletter fields
### **Existing Files Leveraged**
1. `internal/models/contact.go` - `NewsletterSubscription` model with preferences JSONB
2. `internal/controllers/contact_controller.go` - Subscription endpoints, preference management
3. `internal/services/newsletter_content.go` - Content builder for digests
4. `internal/services/newsletter_scheduler.go` - Legacy weekly scheduler (kept for compatibility)
5. `pkg/email/service.go` - Email sending with analytics tracking
6. `pkg/utils/subscriber_token.go` - Token generation/validation
7. `templates/emails/newsletter_welcome.html` - Welcome template
8. `templates/emails/newsletter.html` - General newsletter template
## 🗄️ Database Changes
### New Tables (3)
```sql
newsletter_sent_log -- Tracks all sent newsletters
match_notifications -- Prevents duplicate match alerts
blog_notifications -- Prevents duplicate blog alerts
```
### Modified Tables
None - all required fields already existed in:
- `newsletter_subscriptions` (preferences JSONB)
- `settings` (newsletter configuration fields)
- `email_log` & `email_event` (analytics)
## 🔧 Configuration
### Required Settings in Database (`settings` table)
```sql
newsletter_enabled = true -- Master toggle
enable_weekly = true -- Enable weekly digest
enable_match_reminders = true -- Enable match alerts
enable_results = true -- Enable result notifications
newsletter_weekly_day = 'sun' -- Day for weekly (sun/mon/tue/wed/thu/fri/sat)
newsletter_weekly_hour = 9 -- Hour for weekly (0-23)
newsletter_reminder_lead_hours = 48 -- Hours before match for first alert
newsletter_quiet_start = 22 -- Don't send results between these hours
newsletter_quiet_end = 8 -- (22:00 - 08:00)
```
### Environment Variables (Optional)
```bash
NEWSLETTER_ENABLED=true # Can be overridden by DB setting
NEWSLETTER_INTERVAL_HOURS=24 # Legacy setting for old scheduler
```
## 🚀 How to Use
### 1. Run Migration
```bash
export RUN_MIGRATIONS=true
./main
```
### 2. Enable in Admin
```bash
curl -X PATCH http://localhost:8080/api/v1/admin/newsletter/enable \
-H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled": true}'
```
### 3. Configure Settings
Update the `settings` table via admin API or directly in database.
### 4. Test
```bash
curl -X POST http://localhost:8080/api/v1/admin/newsletter/test \
-H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com", "type": "weekly"}'
```
## 🔄 Automation Schedule
The system runs checks **every 15 minutes** and:
1. Checks if it's time for weekly digest (matches configured day/hour)
2. Scans upcoming matches for reminder opportunities
3. Scans finished matches for result notifications
4. Blog notifications trigger immediately on publish (not on schedule)
## ⚠️ Important Notes
### Duplicate Prevention
- Each notification type has tracking to prevent duplicates
- Unique constraints on `match_id + notification_type` and `article_id`
### Rate Limiting
- 200ms delay between individual emails to avoid SMTP throttling
- Consider using a dedicated SMTP service for large subscriber lists
### Token Security
- Subscriber tokens expire after 30 days
- Tokens are JWT-based with HMAC signing
- Use `JWT_SECRET` environment variable (never leave as default in production)
### Blog Notifications
- Only trigger when `published` changes from `false` to `true`
- Manual DB updates won't trigger (only through admin API/UI)
### Match Data
- Relies on cached FACR data in `cache/prefetch/facr_club_info.json`
- Ensure prefetch service is running and cache is fresh
## 📊 Monitoring
### Check System Status
```sql
-- Active subscribers
SELECT COUNT(*) FROM newsletter_subscriptions WHERE is_active = true;
-- Sent newsletters today
SELECT newsletter_type, COUNT(*), SUM(recipients_count)
FROM newsletter_sent_log
WHERE DATE(sent_at) = CURRENT_DATE
GROUP BY newsletter_type;
-- Recent blog notifications
SELECT article_id, sent_at, recipients_count
FROM blog_notifications
ORDER BY sent_at DESC LIMIT 10;
-- Recent match notifications
SELECT match_id, notification_type, sent_at, recipients_count
FROM match_notifications
ORDER BY sent_at DESC LIMIT 10;
-- Email analytics
SELECT event_type, COUNT(*)
FROM email_event
WHERE DATE(created_at) = CURRENT_DATE
GROUP BY event_type;
```
### Admin API
```bash
GET /api/v1/admin/newsletter/status
```
## 🐛 Troubleshooting
| Issue | Solution |
|-------|----------|
| No emails sent | Check `newsletter_enabled` and individual type flags in settings |
| Duplicate emails | Check tracking tables for existing notifications |
| Wrong schedule | Verify timezone, day, and hour settings |
| Blog notification not sent | Ensure article was published via API (not manual DB update) |
| Match data missing | Verify prefetch cache is populated |
## 📖 Full Documentation
See `NEWSLETTER_SYSTEM.md` for:
- Detailed API reference
- Database schema documentation
- Email template variables
- Security considerations
- Future enhancement ideas
## ✨ Next Steps
1. **Run migration** to create tracking tables
2. **Enable system** via admin API
3. **Configure settings** for your club's schedule
4. **Test each newsletter type** individually
5. **Monitor logs** for first automated sends
6. **Gather user feedback** and adjust settings
---
**Implementation Date**: 2025-09-30
**Status**: ✅ Complete and Ready for Production
**Developer Notes**: All requested features implemented. System is modular, well-documented, and ready for deployment.