Subsonic: internet radio, chat, bookmarks, play queue, scanner status endpoints

This commit is contained in:
2026-08-23 00:21:13 -05:00
parent c6e0131984
commit d92a25b141
13 changed files with 682 additions and 2 deletions
+43
View File
@@ -0,0 +1,43 @@
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()
}