From c77481fd5950f6102ece3d131f99083fdaaa2756 Mon Sep 17 00:00:00 2001 From: Matt Foxx Date: Thu, 20 Nov 2025 11:43:09 -0500 Subject: [PATCH] feat: Add unix timestamp date range parameters for fetching paginated listens (#98) --- engine/handlers/handlers.go | 10 ++++++++-- internal/db/opts.go | 2 ++ internal/db/psql/listen.go | 25 +++++++++++++++++-------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/engine/handlers/handlers.go b/engine/handlers/handlers.go index 28908f6..62b75a4 100644 --- a/engine/handlers/handlers.go +++ b/engine/handlers/handlers.go @@ -42,6 +42,10 @@ func OptsFromRequest(r *http.Request) db.GetItemsOpts { month, _ := strconv.Atoi(monthStr) yearStr := r.URL.Query().Get("year") year, _ := strconv.Atoi(yearStr) + fromStr := r.URL.Query().Get("from") + from, _ := strconv.Atoi(fromStr) + toStr := r.URL.Query().Get("to") + to, _ := strconv.Atoi(toStr) artistIdStr := r.URL.Query().Get("artist_id") artistId, _ := strconv.Atoi(artistIdStr) @@ -67,8 +71,8 @@ func OptsFromRequest(r *http.Request) db.GetItemsOpts { period = db.PeriodDay } - l.Debug().Msgf("OptsFromRequest: Parsed options: limit=%d, page=%d, week=%d, month=%d, year=%d, artist_id=%d, album_id=%d, track_id=%d, period=%s", - limit, page, week, month, year, artistId, albumId, trackId, period) + l.Debug().Msgf("OptsFromRequest: Parsed options: limit=%d, page=%d, week=%d, month=%d, year=%d, from=%d, to=%d, artist_id=%d, album_id=%d, track_id=%d, period=%s", + limit, page, week, month, year, from, to, artistId, albumId, trackId, period) return db.GetItemsOpts{ Limit: limit, @@ -77,6 +81,8 @@ func OptsFromRequest(r *http.Request) db.GetItemsOpts { Week: week, Month: month, Year: year, + From: from, + To: to, ArtistID: artistId, AlbumID: albumId, TrackID: trackId, diff --git a/internal/db/opts.go b/internal/db/opts.go index 76876bd..949001a 100644 --- a/internal/db/opts.go +++ b/internal/db/opts.go @@ -122,6 +122,8 @@ type GetItemsOpts struct { Week int // 1-52 Month int // 1-12 Year int + From int // unix timestamp + To int // unix timestamp // Used only for getting top tracks ArtistID int diff --git a/internal/db/psql/listen.go b/internal/db/psql/listen.go index 301b6e3..24aac20 100644 --- a/internal/db/psql/listen.go +++ b/internal/db/psql/listen.go @@ -17,14 +17,23 @@ import ( func (d *Psql) GetListensPaginated(ctx context.Context, opts db.GetItemsOpts) (*db.PaginatedResponse[*models.Listen], error) { l := logger.FromContext(ctx) offset := (opts.Page - 1) * opts.Limit - t1, t2, err := utils.DateRange(opts.Week, opts.Month, opts.Year) - if err != nil { - return nil, fmt.Errorf("GetListensPaginated: %w", err) - } - if opts.Month == 0 && opts.Year == 0 { - // use period, not date range - t2 = time.Now() - t1 = db.StartTimeFromPeriod(opts.Period) + var t1 time.Time + var t2 time.Time + if opts.From != 0 && opts.To != 0 { + t1 = time.Unix(int64(opts.From), 0) + t2 = time.Unix(int64(opts.To), 0) + } else { + t1R, t2R, err := utils.DateRange(opts.Week, opts.Month, opts.Year) + if err != nil { + return nil, fmt.Errorf("GetListensPaginated: %w", err) + } + t1 = t1R + t2 = t2R + if opts.Month == 0 && opts.Year == 0 { + // use period, not date range + t2 = time.Now() + t1 = db.StartTimeFromPeriod(opts.Period) + } } if opts.Limit == 0 { opts.Limit = DefaultItemsPerPage