44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
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()
|
|
}
|