package database import ( "context" "fmt" "time" "github.com/jackc/pgx/v5/pgxpool" ) type TrackRelease struct { ID string AlbumReleaseID string TrackID *string DownloadFileID *string Title string TrackNumber int DiscNumber int DurationMs *int Format string BitDepth *int SampleRate *int Channels int BitrateKbps *int FileSize int64 FilePath string CreatedAt time.Time } type TrackReleaseRepository struct { pool *pgxpool.Pool } func NewTrackReleaseRepository(pool *pgxpool.Pool) *TrackReleaseRepository { return &TrackReleaseRepository{pool: pool} } func (r *TrackReleaseRepository) Create(ctx context.Context, tr *TrackRelease) error { err := r.pool.QueryRow(ctx, `INSERT INTO track_releases (album_release_id, track_id, download_file_id, title, track_number, disc_number, duration_ms, format, bit_depth, sample_rate, channels, bitrate_kbps, file_size, file_path) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) RETURNING id, created_at`, tr.AlbumReleaseID, tr.TrackID, tr.DownloadFileID, tr.Title, tr.TrackNumber, tr.DiscNumber, tr.DurationMs, tr.Format, tr.BitDepth, tr.SampleRate, tr.Channels, tr.BitrateKbps, tr.FileSize, tr.FilePath, ).Scan(&tr.ID, &tr.CreatedAt) if err != nil { return fmt.Errorf("creating track release: %w", err) } return nil } func (r *TrackReleaseRepository) CreateBatch(ctx context.Context, tracks []*TrackRelease) error { for _, tr := range tracks { if err := r.Create(ctx, tr); err != nil { return err } } return nil } func (r *TrackReleaseRepository) GetByAlbumReleaseID(ctx context.Context, albumReleaseID string) ([]*TrackRelease, error) { rows, err := r.pool.Query(ctx, `SELECT id, album_release_id, track_id, download_file_id, title, track_number, disc_number, duration_ms, format, bit_depth, sample_rate, channels, bitrate_kbps, file_size, file_path, created_at FROM track_releases WHERE album_release_id = $1 ORDER BY disc_number, track_number`, albumReleaseID, ) if err != nil { return nil, fmt.Errorf("listing track releases: %w", err) } defer rows.Close() var tracks []*TrackRelease for rows.Next() { tr := &TrackRelease{} if err := rows.Scan(&tr.ID, &tr.AlbumReleaseID, &tr.TrackID, &tr.DownloadFileID, &tr.Title, &tr.TrackNumber, &tr.DiscNumber, &tr.DurationMs, &tr.Format, &tr.BitDepth, &tr.SampleRate, &tr.Channels, &tr.BitrateKbps, &tr.FileSize, &tr.FilePath, &tr.CreatedAt); err != nil { return nil, fmt.Errorf("scanning track release: %w", err) } tracks = append(tracks, tr) } return tracks, nil }