package storage import ( "database/sql" "fmt" "log" "synlotto-website/models" ) func GetNotificationCount(db *sql.DB, userID int) int { var count int err := db.QueryRow(` SELECT COUNT(*) FROM users_notification WHERE user_id = ? AND is_read = FALSE`, userID).Scan(&count) if err != nil { log.Println("⚠️ Failed to count notifications:", err) return 0 } return count } func GetRecentNotifications(db *sql.DB, userID int, limit int) []models.Notification { rows, err := db.Query(` SELECT id, subject, body, is_read, created_at FROM users_notification WHERE user_id = ? ORDER BY created_at DESC LIMIT ?`, userID, limit) if err != nil { log.Println("⚠️ Failed to get notifications:", err) return nil } defer rows.Close() var notifications []models.Notification for rows.Next() { var n models.Notification if err := rows.Scan(&n.ID, &n.Subject, &n.Body, &n.IsRead, &n.CreatedAt); err == nil { notifications = append(notifications, n) } } return notifications } func MarkNotificationAsRead(db *sql.DB, userID int, notificationID int) error { result, err := db.Exec(` UPDATE users_notification SET is_read = TRUE WHERE id = ? AND user_id = ? `, notificationID, userID) if err != nil { return err } rowsAffected, err := result.RowsAffected() if err != nil { return err } if rowsAffected == 0 { return fmt.Errorf("no matching notification for user_id=%d and id=%d", userID, notificationID) } return nil } func GetNotificationByID(db *sql.DB, userID, notificationID int) (*models.Notification, error) { row := db.QueryRow(` SELECT id, user_id, subject, body, is_read FROM users_notification WHERE id = ? AND user_id = ? `, notificationID, userID) var n models.Notification err := row.Scan(&n.ID, &n.UserId, &n.Subject, &n.Body, &n.IsRead) if err != nil { return nil, err } return &n, nil }