Add message system (inbox, read view, dropdown) and truncate helper

Implemented message retrieval and read logic in storage layer

Added handlers for inbox and individual message view

Integrated messages into topbar dropdown with unread badge

Added truncate helper to template functions

Created new templates: messages/index.html and messages/read.html

Fixed missing template function error in topbar rendering
This commit is contained in:
2025-04-02 11:56:11 +01:00
parent ab1d9abc72
commit b630296b8c
9 changed files with 186 additions and 38 deletions

View File

@@ -2,24 +2,25 @@ 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 user_id = ? AND is_read = FALSE
SELECT COUNT(*) FROM user_messages
WHERE recipient_id = ? AND is_read = FALSE
`, userID).Scan(&count)
return count, err
}
func GetRecentMessages(db *sql.DB, userID int, limit int) []models.Message {
rows, err := db.Query(`
SELECT id, title, message, is_read
FROM users_messages
WHERE user_id = ?
ORDER BY created_at DESC
SELECT id, sender_id, recipient_id, subject, body, is_read, created_at
FROM user_messages
WHERE recipient_id = ?
ORDER BY created_at DESC
LIMIT ?
`, userID, limit)
if err != nil {
@@ -30,9 +31,53 @@ func GetRecentMessages(db *sql.DB, userID int, limit int) []models.Message {
var messages []models.Message
for rows.Next() {
var m models.Message
rows.Scan(&m.ID, &m.Subject, &m.Message, &m.IsRead)
messages = append(messages, m)
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, sender_id, recipient_id, subject, body, is_read, created_at
FROM user_messages
WHERE id = ? AND recipient_id = ?
`, 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 user_messages
SET is_read = TRUE
WHERE id = ? AND recipient_id = ?
`, 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
}