From 101ed089aeecd4299f108d7944565a7b586becd0 Mon Sep 17 00:00:00 2001 From: sentriz Date: Sat, 18 Jan 2020 17:45:17 +0000 Subject: [PATCH] breakup playlist update handler --- server/ctrladmin/handlers.go | 2 +- server/ctrlsubsonic/ctrl_test.go | 5 ++ server/ctrlsubsonic/handlers_common.go | 103 ++++++++++++++----------- 3 files changed, 63 insertions(+), 47 deletions(-) diff --git a/server/ctrladmin/handlers.go b/server/ctrladmin/handlers.go index 6eeac56..c4c06e2 100644 --- a/server/ctrladmin/handlers.go +++ b/server/ctrladmin/handlers.go @@ -240,7 +240,7 @@ func (c *Controller) ServeUpdateLastFMAPIKey(r *http.Request) *Response { data.CurrentLastFMAPIKey = c.DB.GetSetting("lastfm_api_key") data.CurrentLastFMAPISecret = c.DB.GetSetting("lastfm_secret") return &Response{ - template: "update_lastfm_api_key", + template: "update_lastfm_api_key.tmpl", data: data, } } diff --git a/server/ctrlsubsonic/ctrl_test.go b/server/ctrlsubsonic/ctrl_test.go index d1d8298..e6b61a5 100644 --- a/server/ctrlsubsonic/ctrl_test.go +++ b/server/ctrlsubsonic/ctrl_test.go @@ -1,6 +1,7 @@ package ctrlsubsonic import ( + "context" "log" "net/http" "net/http/httptest" @@ -14,6 +15,7 @@ import ( "senan.xyz/g/gonic/db" "senan.xyz/g/gonic/server/ctrlbase" + "senan.xyz/g/gonic/server/ctrlsubsonic/params" ) var ( @@ -48,6 +50,9 @@ func runQueryCases(t *testing.T, h subsonicHandler, cases []*queryCase) { // // request from the handler in question req, _ := http.NewRequest("", "?"+qc.params.Encode(), nil) + params := params.New(req) + withParams := context.WithValue(req.Context(), CtxParams, params) + req = req.WithContext(withParams) rr := httptest.NewRecorder() testController.H(h).ServeHTTP(rr, req) body := rr.Body.String() diff --git a/server/ctrlsubsonic/handlers_common.go b/server/ctrlsubsonic/handlers_common.go index 7c0484e..e0879b7 100644 --- a/server/ctrlsubsonic/handlers_common.go +++ b/server/ctrlsubsonic/handlers_common.go @@ -24,6 +24,55 @@ func lowerUDecOrHash(in string) string { return string(lower) } +type playlistOpValues struct { + c *Controller + r *http.Request + user *model.User + id int +} + +func playlistDelete(opts playlistOpValues) { + indexes, ok := opts.r.URL.Query()["songIndexToRemove"] + if !ok { + return + } + trackIDs := []int{} + opts.c.DB. + Order("created_at"). + Model(&model.PlaylistItem{}). + Where("playlist_id = ?", opts.id). + Pluck("track_id", &trackIDs) + for _, indexStr := range indexes { + i, err := strconv.Atoi(indexStr) + if err != nil { + continue + } + opts.c.DB.Delete(&model.PlaylistItem{}, + "track_id = ?", trackIDs[i]) + } +} + +func playlistAdd(opts playlistOpValues) { + var toAdd []string + for _, val := range []string{"songId", "songIdToAdd"} { + var ok bool + toAdd, ok = opts.r.URL.Query()[val] + if ok { + break + } + } + for _, trackIDStr := range toAdd { + trackID, err := strconv.Atoi(trackIDStr) + if err != nil { + continue + } + opts.c.DB.Save(&model.PlaylistItem{ + PlaylistID: opts.id, + TrackID: trackID, + }) + } +} + func (c *Controller) ServeGetLicence(r *http.Request) *spec.Response { sub := spec.NewResponse() sub.Licence = &spec.Licence{ @@ -180,57 +229,19 @@ func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response { playlistID = val } } - // begin updating meta - // playlist ID may still be 0 here, if so it's okay, - // we get a new playlist - playlist := &model.Playlist{} - c.DB. - Where("id = ?", playlistID). - First(playlist) + playlist := model.Playlist{ID: playlistID} + c.DB.Where(playlist).First(&playlist) playlist.UserID = user.ID - if val := params.Get("name"); val != "" { + if val := r.URL.Query().Get("name"); val != "" { playlist.Name = val } - if val := params.Get("comment"); val != "" { + if val := r.URL.Query().Get("comment"); val != "" { playlist.Comment = val } - c.DB.Save(playlist) - // begin delete tracks - indexes, ok := params.GetList("songIndexToRemove") - if ok { - trackIDs := []int{} - c.DB. - Order("created_at"). - Model(&model.PlaylistItem{}). - Where("playlist_id = ?", playlistID). - Pluck("track_id", &trackIDs) - for _, indexStr := range indexes { - i, err := strconv.Atoi(indexStr) - if err != nil { - continue - } - c.DB.Delete(&model.PlaylistItem{}, - "track_id = ?", trackIDs[i]) - } - } - // begin add tracks - var toAdd []string - for _, val := range []string{"songId", "songIdToAdd"} { - toAdd, ok := params.GetList(val) - if ok { - break - } - } - for _, trackIDStr := range toAdd { - trackID, err := strconv.Atoi(trackIDStr) - if err != nil { - continue - } - c.DB.Save(&model.PlaylistItem{ - PlaylistID: playlist.ID, - TrackID: trackID, - }) - } + c.DB.Save(&playlist) + opts := playlistOpValues{c, r, user, playlist.ID} + playlistDelete(opts) + playlistAdd(opts) return spec.NewResponse() }