watch-party/backend/internal/repo/episode_repo.go
2025-11-04 21:22:13 +09:00

61 lines
1.3 KiB
Go

package repo
import (
"context"
"errors"
"time"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
)
var ErrNotFound = errors.New("not found")
type Episode struct {
EpNum int `json:"ep_num"`
EpTitle string `json:"ep_title"`
SeasonName string `json:"season_name"`
StartTime string `json:"start_time"`
PlaybackLength string `json:"playback_length"`
DateCreated time.Time `json:"date_created"`
}
type EpisodeRepository interface {
GetCurrent(ctx context.Context) (Episode, error)
}
type pgxEpisodeRepo struct {
pool *pgxpool.Pool
}
func NewEpisodeRepo(pool *pgxpool.Pool) EpisodeRepository {
return &pgxEpisodeRepo{pool: pool}
}
func (r *pgxEpisodeRepo) GetCurrent(ctx context.Context) (Episode, error) {
const q = `
SELECT
ep_num,
ep_title,
season_name,
to_char(start_time, 'HH24:MI:SS') AS start_time,
to_char(playback_length, 'HH24:MI:SS') AS playback_length,
date_created
FROM current
WHERE current_ep = true
ORDER BY id DESC
LIMIT 1;
`
var e Episode
err := r.pool.QueryRow(ctx, q).Scan(
&e.EpNum, &e.EpTitle, &e.SeasonName, &e.StartTime, &e.PlaybackLength, &e.DateCreated,
)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return Episode{}, ErrNotFound
}
return Episode{}, err
}
return e, nil
}