package database import ( "database/sql" "time" "git.noroutes.net/NoRoutes/vibetunes/internal/idgen" ) type ChatMessage struct { Username string Message string CreatedAt time.Time } func AddChatMessage(db *sql.DB, userID, message string) error { _, err := db.Exec(`INSERT INTO chat_messages (id, user_id, message) VALUES (?, ?, ?)`, idgen.New("cm"), userID, message) return err } // ListChatMessagesSince returns chat messages newer than since (pass the // zero time for all messages), oldest first, capped at 500 — a chat // room does not need unbounded history in one response. func ListChatMessagesSince(db *sql.DB, since time.Time) ([]ChatMessage, error) { rows, err := db.Query(`SELECT u.username, c.message, c.created_at FROM chat_messages c JOIN users u ON u.id = c.user_id WHERE c.created_at > ? ORDER BY c.created_at ASC LIMIT 500`, since.UTC().Format(timeLayout)) if err != nil { return nil, err } defer rows.Close() var out []ChatMessage for rows.Next() { var m ChatMessage var createdAt string if err := rows.Scan(&m.Username, &m.Message, &createdAt); err != nil { return nil, err } m.CreatedAt, _ = parseTime(createdAt) out = append(out, m) } return out, rows.Err() }