From b8ed413ed3246bba31bf703b6714b7d076bff5cf Mon Sep 17 00:00:00 2001 From: sentriz Date: Mon, 11 May 2020 22:44:59 +0100 Subject: [PATCH] parse incoming ids in handlers --- server/ctrlsubsonic/handlers_by_folder.go | 8 ++++---- server/ctrlsubsonic/handlers_by_folder_test.go | 4 ++-- server/ctrlsubsonic/handlers_by_tags.go | 14 +++++++------- server/ctrlsubsonic/handlers_by_tags_test.go | 10 +++++----- server/ctrlsubsonic/handlers_common.go | 18 +++++++++++------- server/ctrlsubsonic/handlers_raw.go | 18 +++++++++--------- 6 files changed, 38 insertions(+), 34 deletions(-) diff --git a/server/ctrlsubsonic/handlers_by_folder.go b/server/ctrlsubsonic/handlers_by_folder.go index 8aae0d5..fa4f3f9 100644 --- a/server/ctrlsubsonic/handlers_by_folder.go +++ b/server/ctrlsubsonic/handlers_by_folder.go @@ -54,17 +54,17 @@ func (c *Controller) ServeGetIndexes(r *http.Request) *spec.Response { func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - id, err := params.GetInt("id") + id, err := params.GetID("id") if err != nil { return spec.NewError(10, "please provide an `id` parameter") } childrenObj := []*spec.TrackChild{} folder := &db.Album{} - c.DB.First(folder, id) + c.DB.First(folder, id.Value) // ** begin start looking for child childFolders in the current dir var childFolders []*db.Album c.DB. - Where("parent_id=?", id). + Where("parent_id=?", id.Value). Order("albums.right_path COLLATE NOCASE"). Find(&childFolders) for _, c := range childFolders { @@ -73,7 +73,7 @@ func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response { // ** begin start looking for child childTracks in the current dir var childTracks []*db.Track c.DB. - Where("album_id=?", id). + Where("album_id=?", id.Value). Preload("Album"). Order("filename"). Find(&childTracks) diff --git a/server/ctrlsubsonic/handlers_by_folder_test.go b/server/ctrlsubsonic/handlers_by_folder_test.go index 69b769b..0ff9a3c 100644 --- a/server/ctrlsubsonic/handlers_by_folder_test.go +++ b/server/ctrlsubsonic/handlers_by_folder_test.go @@ -15,8 +15,8 @@ func TestGetIndexes(t *testing.T) { func TestGetMusicDirectory(t *testing.T) { runQueryCases(t, testController.ServeGetMusicDirectory, []*queryCase{ - {url.Values{"id": {"2"}}, "without_tracks", false}, - {url.Values{"id": {"3"}}, "with_tracks", false}, + {url.Values{"id": {"al-2"}}, "without_tracks", false}, + {url.Values{"id": {"al-3"}}, "with_tracks", false}, }) } diff --git a/server/ctrlsubsonic/handlers_by_tags.go b/server/ctrlsubsonic/handlers_by_tags.go index bbae6fa..2605997 100644 --- a/server/ctrlsubsonic/handlers_by_tags.go +++ b/server/ctrlsubsonic/handlers_by_tags.go @@ -48,14 +48,14 @@ func (c *Controller) ServeGetArtists(r *http.Request) *spec.Response { func (c *Controller) ServeGetArtist(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - id, err := params.GetInt("id") + id, err := params.GetID("id") if err != nil { return spec.NewError(10, "please provide an `id` parameter") } artist := &db.Artist{} c.DB. Preload("Albums"). - First(artist, id) + First(artist, id.Value) sub := spec.NewResponse() sub.Artist = spec.NewArtistByTags(artist) sub.Artist.Albums = make([]*spec.Album, len(artist.Albums)) @@ -68,7 +68,7 @@ func (c *Controller) ServeGetArtist(r *http.Request) *spec.Response { func (c *Controller) ServeGetAlbum(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - id, err := params.GetInt("id") + id, err := params.GetID("id") if err != nil { return spec.NewError(10, "please provide an `id` parameter") } @@ -79,7 +79,7 @@ func (c *Controller) ServeGetAlbum(r *http.Request) *spec.Response { Preload("Tracks", func(db *gorm.DB) *gorm.DB { return db.Order("tracks.tag_disc_number, tracks.tag_track_number") }). - First(album, id). + First(album, id.Value). Error if gorm.IsRecordNotFoundError(err) { return spec.NewError(10, "couldn't find an album with that id") @@ -211,7 +211,7 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response { func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - id, err := params.GetInt("id") + id, err := params.GetID("id") if err != nil { return spec.NewError(10, "please provide an `id` parameter") } @@ -221,11 +221,11 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { } artist := &db.Artist{} err = c.DB. - Where("id=?", id). + Where("id=?", id.Value). Find(artist). Error if gorm.IsRecordNotFoundError(err) { - return spec.NewError(70, "artist with id `%d` not found", id) + return spec.NewError(70, "artist with id `%s` not found", id) } info, err := lastfm.ArtistGetInfo(apiKey, artist) if err != nil { diff --git a/server/ctrlsubsonic/handlers_by_tags_test.go b/server/ctrlsubsonic/handlers_by_tags_test.go index 52e357c..326586e 100644 --- a/server/ctrlsubsonic/handlers_by_tags_test.go +++ b/server/ctrlsubsonic/handlers_by_tags_test.go @@ -13,16 +13,16 @@ func TestGetArtists(t *testing.T) { func TestGetArtist(t *testing.T) { runQueryCases(t, testController.ServeGetArtist, []*queryCase{ - {url.Values{"id": {"1"}}, "id_one", false}, - {url.Values{"id": {"2"}}, "id_two", false}, - {url.Values{"id": {"3"}}, "id_three", false}, + {url.Values{"id": {"ar-1"}}, "id_one", false}, + {url.Values{"id": {"ar-2"}}, "id_two", false}, + {url.Values{"id": {"ar-3"}}, "id_three", false}, }) } func TestGetAlbum(t *testing.T) { runQueryCases(t, testController.ServeGetAlbum, []*queryCase{ - {url.Values{"id": {"2"}}, "without_cover", false}, - {url.Values{"id": {"3"}}, "with_cover", false}, + {url.Values{"id": {"al-2"}}, "without_cover", false}, + {url.Values{"id": {"al-3"}}, "with_cover", false}, }) } diff --git a/server/ctrlsubsonic/handlers_common.go b/server/ctrlsubsonic/handlers_common.go index a5a62e2..ba8da30 100644 --- a/server/ctrlsubsonic/handlers_common.go +++ b/server/ctrlsubsonic/handlers_common.go @@ -38,7 +38,7 @@ func (c *Controller) ServePing(r *http.Request) *spec.Response { func (c *Controller) ServeScrobble(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - id, err := params.GetInt("id") + id, err := params.GetID("id") if err != nil { return spec.NewError(10, "please provide an `id` parameter") } @@ -52,7 +52,7 @@ func (c *Controller) ServeScrobble(r *http.Request) *spec.Response { c.DB. Preload("Album"). Preload("Artist"). - First(track, id) + First(track, id.Value) // scrobble with above info opts := lastfm.ScrobbleOptions{ Track: track, @@ -251,30 +251,34 @@ func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response { func (c *Controller) ServeSavePlayQueue(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - tracks, err := params.GetIntList("id") + tracks, err := params.GetIDList("id") if err != nil { return spec.NewError(10, "please provide some `id` parameters") } + trackIDs := make([]int, 0, len(tracks)) + for _, id := range tracks { + trackIDs = append(trackIDs, id.Value) + } user := r.Context().Value(CtxUser).(*db.User) queue := &db.PlayQueue{UserID: user.ID} c.DB.Where(queue).First(queue) queue.Current = params.GetOrInt("current", 0) queue.Position = params.GetOrInt("position", 0) queue.ChangedBy = params.GetOr("c", "") // must exist, middleware checks - queue.SetItems(tracks) + queue.SetItems(trackIDs) c.DB.Save(queue) return spec.NewResponse() } func (c *Controller) ServeGetSong(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - id, err := params.GetInt("id") + id, err := params.GetID("id") if err != nil { return spec.NewError(10, "provide an `id` parameter") } track := &db.Track{} err = c.DB. - Where("id=?", id). + Where("id=?", id.Value). Preload("Album"). First(track). Error @@ -326,7 +330,7 @@ func (c *Controller) ServeJukebox(r *http.Request) *spec.Response { } for _, id := range ids { track := &db.Track{} - c.DB.Preload("Album").First(track, id) + c.DB.Preload("Album").First(track, id.Value) if track.ID != 0 { tracks = append(tracks, track) } diff --git a/server/ctrlsubsonic/handlers_raw.go b/server/ctrlsubsonic/handlers_raw.go index 9cc1895..461a9bb 100644 --- a/server/ctrlsubsonic/handlers_raw.go +++ b/server/ctrlsubsonic/handlers_raw.go @@ -55,14 +55,14 @@ func streamUpdateStats(dbc *db.DB, userID, albumID int) { func (c *Controller) ServeGetCoverArt(w http.ResponseWriter, r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - id, err := params.GetInt("id") + id, err := params.GetID("id") if err != nil { return spec.NewError(10, "please provide an `id` parameter") } folder := &db.Album{} err = c.DB. Select("id, left_path, right_path, cover"). - First(folder, id). + First(folder, id.Value). Error if gorm.IsRecordNotFoundError(err) { return spec.NewError(10, "could not find a cover with that id") @@ -86,13 +86,13 @@ func (c *Controller) ServeStream(w http.ResponseWriter, r *http.Request) *spec.R if err != nil { return spec.NewError(10, "please provide an `id` parameter") } - track, err := streamGetTrack(c.DB, id) + track, err := streamGetTrack(c.DB, id.Value) if err != nil { - return spec.NewError(70, "media with id `%d` was not found", id) + return spec.NewError(70, "media with id `%d` was not found", id.Value) } user := r.Context().Value(CtxUser).(*db.User) defer streamUpdateStats(c.DB, user.ID, track.Album.ID) - pref := streamGetTransPref(c.DB, user.ID, params.Get("c")) + pref := streamGetTransPref(c.DB, user.ID, params.GetOr("c", "")) trackPath := path.Join(c.MusicPath, track.RelPath()) // onInvalidProfile := func() error { @@ -116,7 +116,7 @@ func (c *Controller) ServeStream(w http.ResponseWriter, r *http.Request) *spec.R TrackPath: trackPath, CachePath: c.CachePath, ProfileName: pref.Profile, - PreferredBitrate: params.GetIntOr("maxBitRate", 0), + PreferredBitrate: params.GetOrInt("maxBitRate", 0), OnInvalidProfile: onInvalidProfile, OnCacheHit: onCacheHit, OnCacheMiss: onCacheMiss, @@ -129,13 +129,13 @@ func (c *Controller) ServeStream(w http.ResponseWriter, r *http.Request) *spec.R func (c *Controller) ServeDownload(w http.ResponseWriter, r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - id, err := params.GetInt("id") + id, err := params.GetID("id") if err != nil { return spec.NewError(10, "please provide an `id` parameter") } - track, err := streamGetTrack(c.DB, id) + track, err := streamGetTrack(c.DB, id.Value) if err != nil { - return spec.NewError(70, "media with id `%d` was not found", id) + return spec.NewError(70, "media with id `%s` was not found", id) } log.Printf("serving raw %q\n", track.Filename) w.Header().Set("Content-Type", track.MIME())