Hub: add preferences sync endpoint + notification display on customer page
- POST /api/v1/preferences: accepts {customer_id, email, enabled_events} from controller
- GetRecentNotifications() store method for last N notification log entries
- Customer detail page: new Notifications section (email, events, recent log table)
- joinStrings template function for event list display
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -151,6 +151,43 @@ func (s *Store) LogNotification(customerID, eventType, severity, message, status
|
||||
return err
|
||||
}
|
||||
|
||||
// NotificationLogEntry represents a single notification log record.
|
||||
type NotificationLogEntry struct {
|
||||
EventType string
|
||||
Severity string
|
||||
Message string
|
||||
Status string // "sent", "skipped", "failed"
|
||||
ErrorMessage string
|
||||
CreatedAt time.Time
|
||||
}
|
||||
|
||||
// GetRecentNotifications returns the most recent notification log entries for a customer.
|
||||
func (s *Store) GetRecentNotifications(customerID string, limit int) ([]NotificationLogEntry, error) {
|
||||
rows, err := s.db.Query(`
|
||||
SELECT event_type, severity, message, status, COALESCE(error_message, ''), created_at
|
||||
FROM notification_log
|
||||
WHERE customer_id = ?
|
||||
ORDER BY created_at DESC
|
||||
LIMIT ?`, customerID, limit)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var entries []NotificationLogEntry
|
||||
for rows.Next() {
|
||||
var e NotificationLogEntry
|
||||
var createdAt, errorMsg string
|
||||
if err := rows.Scan(&e.EventType, &e.Severity, &e.Message, &e.Status, &errorMsg, &createdAt); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
e.CreatedAt = parseSQLiteTime(createdAt)
|
||||
e.ErrorMessage = errorMsg
|
||||
entries = append(entries, e)
|
||||
}
|
||||
return entries, rows.Err()
|
||||
}
|
||||
|
||||
// SaveReport stores a new report. The reportJSON should be the raw JSON payload.
|
||||
func (s *Store) SaveReport(customerID string, reportJSON []byte) error {
|
||||
// Parse denormalized fields from the JSON
|
||||
|
||||
Reference in New Issue
Block a user