From 210dc6b12e1fd70d6f8c95291b98c76a8b577ff7 Mon Sep 17 00:00:00 2001 From: caiocotts <31974888+caiocotts@users.noreply.github.com> Date: Tue, 21 Sep 2021 20:40:39 -0400 Subject: [PATCH] Add x-total-count to Subsonic API getAlbumList (#1360) * Add x-total-count to Subsonic API getAlbumList * Rename variable Co-authored-by: Deluan --- server/subsonic/album_lists.go | 25 ++++++++++++++++++------- server/subsonic/album_lists_test.go | 2 ++ tests/mock_album_repo.go | 17 ++--------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/server/subsonic/album_lists.go b/server/subsonic/album_lists.go index 95eb50fe..3ca8bb44 100644 --- a/server/subsonic/album_lists.go +++ b/server/subsonic/album_lists.go @@ -4,6 +4,7 @@ import ( "context" "errors" "net/http" + "strconv" "time" "github.com/navidrome/navidrome/core/scrobbler" @@ -27,10 +28,10 @@ func NewAlbumListController(ds model.DataStore, scrobbler scrobbler.PlayTracker) return c } -func (c *AlbumListController) getAlbumList(r *http.Request) (model.Albums, error) { +func (c *AlbumListController) getAlbumList(r *http.Request) (model.Albums, int64, error) { typ, err := requiredParamString(r, "type") if err != nil { - return nil, err + return nil, 0, err } var opts filter.Options @@ -57,7 +58,7 @@ func (c *AlbumListController) getAlbumList(r *http.Request) (model.Albums, error opts = filter.AlbumsByYear(utils.ParamInt(r, "fromYear", 0), utils.ParamInt(r, "toYear", 0)) default: log.Error(r, "albumList type not implemented", "type", typ) - return nil, errors.New("not implemented") + return nil, 0, errors.New("not implemented") } opts.Offset = utils.ParamInt(r, "offset", 0) @@ -66,29 +67,39 @@ func (c *AlbumListController) getAlbumList(r *http.Request) (model.Albums, error if err != nil { log.Error(r, "Error retrieving albums", "error", err) - return nil, errors.New("internal Error") + return nil, 0, errors.New("internal error") } - return albums, nil + count, err := c.ds.Album(r.Context()).CountAll(opts) + if err != nil { + log.Error(r, "Error counting albums", "error", err) + return nil, 0, errors.New("internal error") + } + + return albums, count, nil } func (c *AlbumListController) GetAlbumList(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - albums, err := c.getAlbumList(r) + albums, count, err := c.getAlbumList(r) if err != nil { return nil, newError(responses.ErrorGeneric, err.Error()) } + w.Header().Set("x-total-count", strconv.Itoa(int(count))) + response := newResponse() response.AlbumList = &responses.AlbumList{Album: childrenFromAlbums(r.Context(), albums)} return response, nil } func (c *AlbumListController) GetAlbumList2(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - albums, err := c.getAlbumList(r) + albums, pageCount, err := c.getAlbumList(r) if err != nil { return nil, newError(responses.ErrorGeneric, err.Error()) } + w.Header().Set("x-total-count", strconv.FormatInt(pageCount, 10)) + response := newResponse() response.AlbumList2 = &responses.AlbumList{Album: childrenFromAlbums(r.Context(), albums)} return response, nil diff --git a/server/subsonic/album_lists_test.go b/server/subsonic/album_lists_test.go index 02b61ef4..d3e982c2 100644 --- a/server/subsonic/album_lists_test.go +++ b/server/subsonic/album_lists_test.go @@ -36,6 +36,7 @@ var _ = Describe("AlbumListController", func() { Expect(err).To(BeNil()) Expect(resp.AlbumList.Album[0].Id).To(Equal("1")) Expect(resp.AlbumList.Album[1].Id).To(Equal("2")) + Expect(w.Header().Get("x-total-count")).To(Equal("2")) Expect(mockRepo.Options.Offset).To(Equal(10)) Expect(mockRepo.Options.Max).To(Equal(20)) }) @@ -68,6 +69,7 @@ var _ = Describe("AlbumListController", func() { Expect(err).To(BeNil()) Expect(resp.AlbumList2.Album[0].Id).To(Equal("1")) Expect(resp.AlbumList2.Album[1].Id).To(Equal("2")) + Expect(w.Header().Get("x-total-count")).To(Equal("2")) Expect(mockRepo.Options.Offset).To(Equal(10)) Expect(mockRepo.Options.Max).To(Equal(20)) }) diff --git a/tests/mock_album_repo.go b/tests/mock_album_repo.go index 5f04ef57..40fdfd2e 100644 --- a/tests/mock_album_repo.go +++ b/tests/mock_album_repo.go @@ -85,21 +85,8 @@ func (m *MockAlbumRepo) IncPlayCount(id string, timestamp time.Time) error { } return model.ErrNotFound } - -func (m *MockAlbumRepo) FindByArtist(artistId string) (model.Albums, error) { - if m.err { - return nil, errors.New("Error!") - } - var res = make(model.Albums, len(m.data)) - i := 0 - for _, a := range m.data { - if a.AlbumArtistID == artistId { - res[i] = *a - i++ - } - } - - return res, nil +func (m *MockAlbumRepo) CountAll(...model.QueryOptions) (int64, error) { + return int64(len(m.all)), nil } var _ model.AlbumRepository = (*MockAlbumRepo)(nil)