package storage import ( "database/sql" "fmt" "synlotto-website/models" ) func GetMessageCount(db *sql.DB, userID int) (int, error) { var count int err := db.QueryRow(` SELECT COUNT(*) FROM users_messages WHERE recipientId = ? AND is_read = FALSE AND is_archived = FALSE `, userID).Scan(&count) return count, err } func GetRecentMessages(db *sql.DB, userID int, limit int) []models.Message { rows, err := db.Query(` SELECT id, senderId, recipientId, subject, message, is_read, created_at FROM users_messages WHERE recipientId = ? AND is_archived = FALSE ORDER BY created_at DESC LIMIT ? `, userID, limit) if err != nil { return nil } defer rows.Close() var messages []models.Message for rows.Next() { var m models.Message err := rows.Scan( &m.ID, &m.SenderId, &m.RecipientId, &m.Subject, &m.Message, &m.IsRead, &m.CreatedAt, ) if err == nil { messages = append(messages, m) } } return messages } func GetMessageByID(db *sql.DB, userID, messageID int) (*models.Message, error) { row := db.QueryRow(` SELECT id, senderId, recipientId, subject, message, is_read, created_at FROM users_messages WHERE id = ? AND recipientId = ? `, messageID, userID) var m models.Message err := row.Scan(&m.ID, &m.SenderId, &m.RecipientId, &m.Subject, &m.Message, &m.IsRead, &m.CreatedAt) if err != nil { return nil, err } return &m, nil } func MarkMessageAsRead(db *sql.DB, messageID, userID int) error { result, err := db.Exec(` UPDATE users_messages SET is_read = TRUE WHERE id = ? AND recipientId = ? `, messageID, userID) if err != nil { return err } rowsAffected, err := result.RowsAffected() if err != nil { return err } if rowsAffected == 0 { return fmt.Errorf("no matching message found for user_id=%d and message_id=%d", userID, messageID) } return nil } func ArchiveMessage(db *sql.DB, userID, messageID int) error { _, err := db.Exec(` UPDATE users_messages SET is_archived = TRUE, archived_at = CURRENT_TIMESTAMP WHERE id = ? AND recipientId = ? `, messageID, userID) return err } func SendMessage(db *sql.DB, senderID, recipientID int, subject, message string) error { _, err := db.Exec(` INSERT INTO users_messages (senderId, recipientId, subject, message) VALUES (?, ?, ?, ?) `, senderID, recipientID, subject, message) return err } func GetArchivedMessages(db *sql.DB, userID int, page, perPage int) []models.Message { offset := (page - 1) * perPage rows, err := db.Query(` SELECT id, senderId, recipientId, subject, message, is_read, created_at, archived_at FROM users_messages WHERE recipientId = ? AND is_archived = TRUE ORDER BY archived_at DESC LIMIT ? OFFSET ? `, userID, perPage, offset) if err != nil { return nil } defer rows.Close() var messages []models.Message for rows.Next() { var m models.Message err := rows.Scan( &m.ID, &m.SenderId, &m.RecipientId, &m.Subject, &m.Message, &m.IsRead, &m.CreatedAt, &m.ArchivedAt, ) if err == nil { messages = append(messages, m) } } return messages }