42 lines
1.0 KiB
Go
42 lines
1.0 KiB
Go
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
|
|
"git.noroutes.net/NoRoutes/vibetunes/internal/idgen"
|
|
)
|
|
|
|
// Shares are a schema foundation for Phase 2's Subsonic share endpoints;
|
|
// Phase 1 doesn't yet expose a sharing UI.
|
|
|
|
type Share struct {
|
|
ID string
|
|
OwnerID string
|
|
Token string
|
|
Description string
|
|
ExpiresAt sql.NullString
|
|
}
|
|
|
|
func CreateShare(db *sql.DB, ownerID, token, description string) (*Share, error) {
|
|
id := idgen.New("sh")
|
|
_, err := db.Exec(`INSERT INTO shares (id, owner_id, token, description) VALUES (?, ?, ?, ?)`, id, ownerID, token, description)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return GetShareByToken(db, token)
|
|
}
|
|
|
|
func GetShareByToken(db *sql.DB, token string) (*Share, error) {
|
|
var s Share
|
|
err := db.QueryRow(`SELECT id, owner_id, token, description, expires_at FROM shares WHERE token = ?`, token).
|
|
Scan(&s.ID, &s.OwnerID, &s.Token, &s.Description, &s.ExpiresAt)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return nil, ErrNotFound
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &s, nil
|
|
}
|