Simplify error responses
This commit is contained in:
@@ -28,7 +28,7 @@ func NewAlbumListController(ds model.DataStore, nowPlaying core.NowPlaying) *Alb
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *AlbumListController) getAlbumList(r *http.Request) (model.Albums, error) {
|
func (c *AlbumListController) getAlbumList(r *http.Request) (model.Albums, error) {
|
||||||
typ, err := requiredParamString(r, "type", "Required string parameter 'type' is not present")
|
typ, err := requiredParamString(r, "type")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -100,17 +100,17 @@ func (c *AlbumListController) GetStarred(w http.ResponseWriter, r *http.Request)
|
|||||||
artists, err := c.ds.Artist(ctx).GetStarred(options)
|
artists, err := c.ds.Artist(ctx).GetStarred(options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, "Error retrieving starred artists", "error", err)
|
log.Error(r, "Error retrieving starred artists", "error", err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
albums, err := c.ds.Album(ctx).GetStarred(options)
|
albums, err := c.ds.Album(ctx).GetStarred(options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, "Error retrieving starred albums", "error", err)
|
log.Error(r, "Error retrieving starred albums", "error", err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
mediaFiles, err := c.ds.MediaFile(ctx).GetStarred(options)
|
mediaFiles, err := c.ds.MediaFile(ctx).GetStarred(options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, "Error retrieving starred mediaFiles", "error", err)
|
log.Error(r, "Error retrieving starred mediaFiles", "error", err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -137,7 +137,7 @@ func (c *AlbumListController) GetNowPlaying(w http.ResponseWriter, r *http.Reque
|
|||||||
npInfo, err := c.nowPlaying.GetAll()
|
npInfo, err := c.nowPlaying.GetAll()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, "Error retrieving now playing list", "error", err)
|
log.Error(r, "Error retrieving now playing list", "error", err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -146,7 +146,7 @@ func (c *AlbumListController) GetNowPlaying(w http.ResponseWriter, r *http.Reque
|
|||||||
for i, np := range npInfo {
|
for i, np := range npInfo {
|
||||||
mf, err := c.ds.MediaFile(ctx).Get(np.TrackID)
|
mf, err := c.ds.MediaFile(ctx).Get(np.TrackID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response.NowPlaying.Entry[i].Child = childFromMediaFile(ctx, *mf)
|
response.NowPlaying.Entry[i].Child = childFromMediaFile(ctx, *mf)
|
||||||
@@ -167,7 +167,7 @@ func (c *AlbumListController) GetRandomSongs(w http.ResponseWriter, r *http.Requ
|
|||||||
songs, err := c.getSongs(r.Context(), 0, size, filter.SongsByRandom(genre, fromYear, toYear))
|
songs, err := c.getSongs(r.Context(), 0, size, filter.SongsByRandom(genre, fromYear, toYear))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, "Error retrieving random songs", "error", err)
|
log.Error(r, "Error retrieving random songs", "error", err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -184,7 +184,7 @@ func (c *AlbumListController) GetSongsByGenre(w http.ResponseWriter, r *http.Req
|
|||||||
songs, err := c.getSongs(r.Context(), offset, count, filter.SongsByGenre(genre))
|
songs, err := c.getSongs(r.Context(), offset, count, filter.SongsByGenre(genre))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, "Error retrieving random songs", "error", err)
|
log.Error(r, "Error retrieving random songs", "error", err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ var _ = Describe("AlbumListController", func() {
|
|||||||
r := newGetRequest()
|
r := newGetRequest()
|
||||||
_, err := controller.GetAlbumList(w, r)
|
_, err := controller.GetAlbumList(w, r)
|
||||||
|
|
||||||
Expect(err).To(MatchError("Required string parameter 'type' is not present"))
|
Expect(err).To(MatchError("required 'type' parameter is missing"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should return error if call fails", func() {
|
It("should return error if call fails", func() {
|
||||||
@@ -76,7 +76,7 @@ var _ = Describe("AlbumListController", func() {
|
|||||||
r := newGetRequest()
|
r := newGetRequest()
|
||||||
_, err := controller.GetAlbumList2(w, r)
|
_, err := controller.GetAlbumList2(w, r)
|
||||||
|
|
||||||
Expect(err).To(MatchError("Required string parameter 'type' is not present"))
|
Expect(err).To(MatchError("required 'type' parameter is missing"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should return error if call fails", func() {
|
It("should return error if call fails", func() {
|
||||||
|
|||||||
+61
-57
@@ -19,7 +19,7 @@ import (
|
|||||||
|
|
||||||
const Version = "1.13.0"
|
const Version = "1.13.0"
|
||||||
|
|
||||||
type Handler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, error)
|
type handler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, error)
|
||||||
|
|
||||||
type Router struct {
|
type Router struct {
|
||||||
Artwork core.Artwork
|
Artwork core.Artwork
|
||||||
@@ -64,107 +64,111 @@ func (api *Router) routes() http.Handler {
|
|||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initSystemController(api)
|
c := initSystemController(api)
|
||||||
withPlayer := r.With(getPlayer(api.Players))
|
withPlayer := r.With(getPlayer(api.Players))
|
||||||
H(withPlayer, "ping", c.Ping)
|
h(withPlayer, "ping", c.Ping)
|
||||||
H(withPlayer, "getLicense", c.GetLicense)
|
h(withPlayer, "getLicense", c.GetLicense)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initBrowsingController(api)
|
c := initBrowsingController(api)
|
||||||
withPlayer := r.With(getPlayer(api.Players))
|
withPlayer := r.With(getPlayer(api.Players))
|
||||||
H(withPlayer, "getMusicFolders", c.GetMusicFolders)
|
h(withPlayer, "getMusicFolders", c.GetMusicFolders)
|
||||||
H(withPlayer, "getIndexes", c.GetIndexes)
|
h(withPlayer, "getIndexes", c.GetIndexes)
|
||||||
H(withPlayer, "getArtists", c.GetArtists)
|
h(withPlayer, "getArtists", c.GetArtists)
|
||||||
H(withPlayer, "getGenres", c.GetGenres)
|
h(withPlayer, "getGenres", c.GetGenres)
|
||||||
H(withPlayer, "getMusicDirectory", c.GetMusicDirectory)
|
h(withPlayer, "getMusicDirectory", c.GetMusicDirectory)
|
||||||
H(withPlayer, "getArtist", c.GetArtist)
|
h(withPlayer, "getArtist", c.GetArtist)
|
||||||
H(withPlayer, "getAlbum", c.GetAlbum)
|
h(withPlayer, "getAlbum", c.GetAlbum)
|
||||||
H(withPlayer, "getSong", c.GetSong)
|
h(withPlayer, "getSong", c.GetSong)
|
||||||
H(withPlayer, "getArtistInfo", c.GetArtistInfo)
|
h(withPlayer, "getArtistInfo", c.GetArtistInfo)
|
||||||
H(withPlayer, "getArtistInfo2", c.GetArtistInfo2)
|
h(withPlayer, "getArtistInfo2", c.GetArtistInfo2)
|
||||||
H(withPlayer, "getTopSongs", c.GetTopSongs)
|
h(withPlayer, "getTopSongs", c.GetTopSongs)
|
||||||
H(withPlayer, "getSimilarSongs", c.GetSimilarSongs)
|
h(withPlayer, "getSimilarSongs", c.GetSimilarSongs)
|
||||||
H(withPlayer, "getSimilarSongs2", c.GetSimilarSongs2)
|
h(withPlayer, "getSimilarSongs2", c.GetSimilarSongs2)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initAlbumListController(api)
|
c := initAlbumListController(api)
|
||||||
withPlayer := r.With(getPlayer(api.Players))
|
withPlayer := r.With(getPlayer(api.Players))
|
||||||
H(withPlayer, "getAlbumList", c.GetAlbumList)
|
h(withPlayer, "getAlbumList", c.GetAlbumList)
|
||||||
H(withPlayer, "getAlbumList2", c.GetAlbumList2)
|
h(withPlayer, "getAlbumList2", c.GetAlbumList2)
|
||||||
H(withPlayer, "getStarred", c.GetStarred)
|
h(withPlayer, "getStarred", c.GetStarred)
|
||||||
H(withPlayer, "getStarred2", c.GetStarred2)
|
h(withPlayer, "getStarred2", c.GetStarred2)
|
||||||
H(withPlayer, "getNowPlaying", c.GetNowPlaying)
|
h(withPlayer, "getNowPlaying", c.GetNowPlaying)
|
||||||
H(withPlayer, "getRandomSongs", c.GetRandomSongs)
|
h(withPlayer, "getRandomSongs", c.GetRandomSongs)
|
||||||
H(withPlayer, "getSongsByGenre", c.GetSongsByGenre)
|
h(withPlayer, "getSongsByGenre", c.GetSongsByGenre)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initMediaAnnotationController(api)
|
c := initMediaAnnotationController(api)
|
||||||
H(r, "setRating", c.SetRating)
|
h(r, "setRating", c.SetRating)
|
||||||
H(r, "star", c.Star)
|
h(r, "star", c.Star)
|
||||||
H(r, "unstar", c.Unstar)
|
h(r, "unstar", c.Unstar)
|
||||||
H(r, "scrobble", c.Scrobble)
|
h(r, "scrobble", c.Scrobble)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initPlaylistsController(api)
|
c := initPlaylistsController(api)
|
||||||
withPlayer := r.With(getPlayer(api.Players))
|
withPlayer := r.With(getPlayer(api.Players))
|
||||||
H(withPlayer, "getPlaylists", c.GetPlaylists)
|
h(withPlayer, "getPlaylists", c.GetPlaylists)
|
||||||
H(withPlayer, "getPlaylist", c.GetPlaylist)
|
h(withPlayer, "getPlaylist", c.GetPlaylist)
|
||||||
H(withPlayer, "createPlaylist", c.CreatePlaylist)
|
h(withPlayer, "createPlaylist", c.CreatePlaylist)
|
||||||
H(withPlayer, "deletePlaylist", c.DeletePlaylist)
|
h(withPlayer, "deletePlaylist", c.DeletePlaylist)
|
||||||
H(withPlayer, "updatePlaylist", c.UpdatePlaylist)
|
h(withPlayer, "updatePlaylist", c.UpdatePlaylist)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initBookmarksController(api)
|
c := initBookmarksController(api)
|
||||||
withPlayer := r.With(getPlayer(api.Players))
|
withPlayer := r.With(getPlayer(api.Players))
|
||||||
H(withPlayer, "getBookmarks", c.GetBookmarks)
|
h(withPlayer, "getBookmarks", c.GetBookmarks)
|
||||||
H(withPlayer, "createBookmark", c.CreateBookmark)
|
h(withPlayer, "createBookmark", c.CreateBookmark)
|
||||||
H(withPlayer, "deleteBookmark", c.DeleteBookmark)
|
h(withPlayer, "deleteBookmark", c.DeleteBookmark)
|
||||||
H(withPlayer, "getPlayQueue", c.GetPlayQueue)
|
h(withPlayer, "getPlayQueue", c.GetPlayQueue)
|
||||||
H(withPlayer, "savePlayQueue", c.SavePlayQueue)
|
h(withPlayer, "savePlayQueue", c.SavePlayQueue)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initSearchingController(api)
|
c := initSearchingController(api)
|
||||||
withPlayer := r.With(getPlayer(api.Players))
|
withPlayer := r.With(getPlayer(api.Players))
|
||||||
H(withPlayer, "search2", c.Search2)
|
h(withPlayer, "search2", c.Search2)
|
||||||
H(withPlayer, "search3", c.Search3)
|
h(withPlayer, "search3", c.Search3)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initUsersController(api)
|
c := initUsersController(api)
|
||||||
H(r, "getUser", c.GetUser)
|
h(r, "getUser", c.GetUser)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initMediaRetrievalController(api)
|
c := initMediaRetrievalController(api)
|
||||||
// configure request throttling
|
// configure request throttling
|
||||||
maxRequests := utils.MaxInt(2, runtime.NumCPU())
|
maxRequests := utils.MaxInt(2, runtime.NumCPU())
|
||||||
withThrottle := r.With(middleware.ThrottleBacklog(maxRequests, consts.RequestThrottleBacklogLimit, consts.RequestThrottleBacklogTimeout))
|
withThrottle := r.With(middleware.ThrottleBacklog(maxRequests, consts.RequestThrottleBacklogLimit, consts.RequestThrottleBacklogTimeout))
|
||||||
H(withThrottle, "getAvatar", c.GetAvatar)
|
h(withThrottle, "getAvatar", c.GetAvatar)
|
||||||
H(withThrottle, "getCoverArt", c.GetCoverArt)
|
h(withThrottle, "getCoverArt", c.GetCoverArt)
|
||||||
})
|
})
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initStreamController(api)
|
c := initStreamController(api)
|
||||||
withPlayer := r.With(getPlayer(api.Players))
|
withPlayer := r.With(getPlayer(api.Players))
|
||||||
H(withPlayer, "stream", c.Stream)
|
h(withPlayer, "stream", c.Stream)
|
||||||
H(withPlayer, "download", c.Download)
|
h(withPlayer, "download", c.Download)
|
||||||
})
|
})
|
||||||
|
|
||||||
// Deprecated/Out of scope endpoints
|
// Deprecated/Out of scope endpoints
|
||||||
HGone(r, "getChatMessages")
|
h410(r, "getChatMessages")
|
||||||
HGone(r, "addChatMessage")
|
h410(r, "addChatMessage")
|
||||||
HGone(r, "getVideos")
|
h410(r, "getVideos")
|
||||||
HGone(r, "getVideoInfo")
|
h410(r, "getVideoInfo")
|
||||||
HGone(r, "getCaptions")
|
h410(r, "getCaptions")
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the Subsonic handler, with and without `.view` extension
|
// Add the Subsonic handler, with and without `.view` extension
|
||||||
// Ex: if path = `ping` it will create the routes `/ping` and `/ping.view`
|
// Ex: if path = `ping` it will create the routes `/ping` and `/ping.view`
|
||||||
func H(r chi.Router, path string, f Handler) {
|
func h(r chi.Router, path string, f handler) {
|
||||||
handle := func(w http.ResponseWriter, r *http.Request) {
|
handle := func(w http.ResponseWriter, r *http.Request) {
|
||||||
res, err := f(w, r)
|
res, err := f(w, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
SendError(w, r, err)
|
// If it is not a Subsonic error, convert it to an ErrorGeneric
|
||||||
|
if _, ok := err.(subError); !ok {
|
||||||
|
err = newError(responses.ErrorGeneric, "Internal Error")
|
||||||
|
}
|
||||||
|
sendError(w, r, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if res != nil {
|
if res != nil {
|
||||||
SendResponse(w, r, res)
|
sendResponse(w, r, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
r.HandleFunc("/"+path, handle)
|
r.HandleFunc("/"+path, handle)
|
||||||
@@ -172,7 +176,7 @@ func H(r chi.Router, path string, f Handler) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add a handler that returns 410 - Gone. Used to signal that an endpoint will not be implemented
|
// Add a handler that returns 410 - Gone. Used to signal that an endpoint will not be implemented
|
||||||
func HGone(r chi.Router, path string) {
|
func h410(r chi.Router, path string) {
|
||||||
handle := func(w http.ResponseWriter, r *http.Request) {
|
handle := func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.WriteHeader(410)
|
w.WriteHeader(410)
|
||||||
_, _ = w.Write([]byte("This endpoint will not be implemented"))
|
_, _ = w.Write([]byte("This endpoint will not be implemented"))
|
||||||
@@ -181,19 +185,19 @@ func HGone(r chi.Router, path string) {
|
|||||||
r.HandleFunc("/"+path+".view", handle)
|
r.HandleFunc("/"+path+".view", handle)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendError(w http.ResponseWriter, r *http.Request, err error) {
|
func sendError(w http.ResponseWriter, r *http.Request, err error) {
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
code := responses.ErrorGeneric
|
code := responses.ErrorGeneric
|
||||||
if e, ok := err.(Error); ok {
|
if e, ok := err.(subError); ok {
|
||||||
code = e.code
|
code = e.code
|
||||||
}
|
}
|
||||||
response.Status = "fail"
|
response.Status = "fail"
|
||||||
response.Error = &responses.Error{Code: code, Message: err.Error()}
|
response.Error = &responses.Error{Code: code, Message: err.Error()}
|
||||||
|
|
||||||
SendResponse(w, r, response)
|
sendResponse(w, r, response)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendResponse(w http.ResponseWriter, r *http.Request, payload *responses.Subsonic) {
|
func sendResponse(w http.ResponseWriter, r *http.Request, payload *responses.Subsonic) {
|
||||||
f := utils.ParamString(r, "f")
|
f := utils.ParamString(r, "f")
|
||||||
var response []byte
|
var response []byte
|
||||||
switch f {
|
switch f {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ func (c *BookmarksController) GetBookmarks(w http.ResponseWriter, r *http.Reques
|
|||||||
repo := c.ds.MediaFile(r.Context())
|
repo := c.ds.MediaFile(r.Context())
|
||||||
bmks, err := repo.GetBookmarks()
|
bmks, err := repo.GetBookmarks()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -44,7 +44,7 @@ func (c *BookmarksController) GetBookmarks(w http.ResponseWriter, r *http.Reques
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *BookmarksController) CreateBookmark(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *BookmarksController) CreateBookmark(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
id, err := requiredParamString(r, "id", "id parameter required")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -55,13 +55,13 @@ func (c *BookmarksController) CreateBookmark(w http.ResponseWriter, r *http.Requ
|
|||||||
repo := c.ds.MediaFile(r.Context())
|
repo := c.ds.MediaFile(r.Context())
|
||||||
err = repo.AddBookmark(id, comment, position)
|
err = repo.AddBookmark(id, comment, position)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
return newResponse(), nil
|
return newResponse(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *BookmarksController) DeleteBookmark(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *BookmarksController) DeleteBookmark(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
id, err := requiredParamString(r, "id", "id parameter required")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -69,7 +69,7 @@ func (c *BookmarksController) DeleteBookmark(w http.ResponseWriter, r *http.Requ
|
|||||||
repo := c.ds.MediaFile(r.Context())
|
repo := c.ds.MediaFile(r.Context())
|
||||||
err = repo.DeleteBookmark(id)
|
err = repo.DeleteBookmark(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
return newResponse(), nil
|
return newResponse(), nil
|
||||||
}
|
}
|
||||||
@@ -80,7 +80,7 @@ func (c *BookmarksController) GetPlayQueue(w http.ResponseWriter, r *http.Reques
|
|||||||
repo := c.ds.PlayQueue(r.Context())
|
repo := c.ds.PlayQueue(r.Context())
|
||||||
pq, err := repo.Retrieve(user.ID)
|
pq, err := repo.Retrieve(user.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -96,7 +96,7 @@ func (c *BookmarksController) GetPlayQueue(w http.ResponseWriter, r *http.Reques
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *BookmarksController) SavePlayQueue(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *BookmarksController) SavePlayQueue(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
ids, err := requiredParamStrings(r, "id", "id parameter required")
|
ids, err := requiredParamStrings(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -125,7 +125,7 @@ func (c *BookmarksController) SavePlayQueue(w http.ResponseWriter, r *http.Reque
|
|||||||
repo := c.ds.PlayQueue(r.Context())
|
repo := c.ds.PlayQueue(r.Context())
|
||||||
err = repo.Store(pq)
|
err = repo.Store(pq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
return newResponse(), nil
|
return newResponse(), nil
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-14
@@ -41,13 +41,13 @@ func (c *BrowsingController) getArtistIndex(ctx context.Context, mediaFolderId i
|
|||||||
folder, err := c.ds.MediaFolder(ctx).Get(int32(mediaFolderId))
|
folder, err := c.ds.MediaFolder(ctx).Get(int32(mediaFolderId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(ctx, "Error retrieving MediaFolder", "id", mediaFolderId, err)
|
log.Error(ctx, "Error retrieving MediaFolder", "id", mediaFolderId, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
l, err := c.ds.Property(ctx).DefaultGet(model.PropLastScan+"-"+folder.Path, "-1")
|
l, err := c.ds.Property(ctx).DefaultGet(model.PropLastScan+"-"+folder.Path, "-1")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(ctx, "Error retrieving LastScan property", err)
|
log.Error(ctx, "Error retrieving LastScan property", err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var indexes model.ArtistIndexes
|
var indexes model.ArtistIndexes
|
||||||
@@ -57,7 +57,7 @@ func (c *BrowsingController) getArtistIndex(ctx context.Context, mediaFolderId i
|
|||||||
indexes, err = c.ds.Artist(ctx).GetIndex()
|
indexes, err = c.ds.Artist(ctx).GetIndex()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(ctx, "Error retrieving Indexes", err)
|
log.Error(ctx, "Error retrieving Indexes", err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ func (c *BrowsingController) GetMusicDirectory(w http.ResponseWriter, r *http.Re
|
|||||||
return nil, newError(responses.ErrorDataNotFound, "Directory not found")
|
return nil, newError(responses.ErrorDataNotFound, "Directory not found")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var dir *responses.Directory
|
var dir *responses.Directory
|
||||||
@@ -133,7 +133,7 @@ func (c *BrowsingController) GetMusicDirectory(w http.ResponseWriter, r *http.Re
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -152,13 +152,13 @@ func (c *BrowsingController) GetArtist(w http.ResponseWriter, r *http.Request) (
|
|||||||
return nil, newError(responses.ErrorDataNotFound, "Artist not found")
|
return nil, newError(responses.ErrorDataNotFound, "Artist not found")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
log.Error(ctx, "Error retrieving artist", "id", id, err)
|
log.Error(ctx, "Error retrieving artist", "id", id, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
albums, err := c.ds.Album(ctx).FindByArtist(id)
|
albums, err := c.ds.Album(ctx).FindByArtist(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(ctx, "Error retrieving albums by artist", "id", id, "name", artist.Name, err)
|
log.Error(ctx, "Error retrieving albums by artist", "id", id, "name", artist.Name, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -177,13 +177,13 @@ func (c *BrowsingController) GetAlbum(w http.ResponseWriter, r *http.Request) (*
|
|||||||
return nil, newError(responses.ErrorDataNotFound, "Album not found")
|
return nil, newError(responses.ErrorDataNotFound, "Album not found")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
log.Error(ctx, "Error retrieving album", "id", id, err)
|
log.Error(ctx, "Error retrieving album", "id", id, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
mfs, err := c.ds.MediaFile(ctx).FindByAlbum(id)
|
mfs, err := c.ds.MediaFile(ctx).FindByAlbum(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(ctx, "Error retrieving tracks from album", "id", id, "name", album.Name, err)
|
log.Error(ctx, "Error retrieving tracks from album", "id", id, "name", album.Name, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -202,7 +202,7 @@ func (c *BrowsingController) GetSong(w http.ResponseWriter, r *http.Request) (*r
|
|||||||
return nil, newError(responses.ErrorDataNotFound, "Song not found")
|
return nil, newError(responses.ErrorDataNotFound, "Song not found")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
log.Error(r, "Error retrieving MediaFile", "id", id, err)
|
log.Error(r, "Error retrieving MediaFile", "id", id, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -216,7 +216,7 @@ func (c *BrowsingController) GetGenres(w http.ResponseWriter, r *http.Request) (
|
|||||||
genres, err := c.ds.Genre(ctx).GetAll()
|
genres, err := c.ds.Genre(ctx).GetAll()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, err)
|
log.Error(r, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
for i, g := range genres {
|
for i, g := range genres {
|
||||||
if strings.TrimSpace(g.Name) == "" {
|
if strings.TrimSpace(g.Name) == "" {
|
||||||
@@ -234,7 +234,7 @@ func (c *BrowsingController) GetGenres(w http.ResponseWriter, r *http.Request) (
|
|||||||
|
|
||||||
func (c *BrowsingController) GetArtistInfo(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *BrowsingController) GetArtistInfo(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
id, err := requiredParamString(r, "id", "id parameter required")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -290,7 +290,7 @@ func (c *BrowsingController) GetArtistInfo2(w http.ResponseWriter, r *http.Reque
|
|||||||
|
|
||||||
func (c *BrowsingController) GetSimilarSongs(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *BrowsingController) GetSimilarSongs(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
id, err := requiredParamString(r, "id", "id parameter required")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -323,7 +323,7 @@ func (c *BrowsingController) GetSimilarSongs2(w http.ResponseWriter, r *http.Req
|
|||||||
|
|
||||||
func (c *BrowsingController) GetTopSongs(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *BrowsingController) GetTopSongs(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
artist, err := requiredParamString(r, "artist", "artist parameter required")
|
artist, err := requiredParamString(r, "artist")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,43 +17,43 @@ func newResponse() *responses.Subsonic {
|
|||||||
return &responses.Subsonic{Status: "ok", Version: Version, Type: consts.AppName, ServerVersion: consts.Version()}
|
return &responses.Subsonic{Status: "ok", Version: Version, Type: consts.AppName, ServerVersion: consts.Version()}
|
||||||
}
|
}
|
||||||
|
|
||||||
func requiredParamString(r *http.Request, param string, msg string) (string, error) {
|
func requiredParamString(r *http.Request, param string) (string, error) {
|
||||||
p := utils.ParamString(r, param)
|
p := utils.ParamString(r, param)
|
||||||
if p == "" {
|
if p == "" {
|
||||||
return "", newError(responses.ErrorMissingParameter, msg)
|
return "", newError(responses.ErrorMissingParameter, "required '%s' parameter is missing", param)
|
||||||
}
|
}
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func requiredParamStrings(r *http.Request, param string, msg string) ([]string, error) {
|
func requiredParamStrings(r *http.Request, param string) ([]string, error) {
|
||||||
ps := utils.ParamStrings(r, param)
|
ps := utils.ParamStrings(r, param)
|
||||||
if len(ps) == 0 {
|
if len(ps) == 0 {
|
||||||
return nil, newError(responses.ErrorMissingParameter, msg)
|
return nil, newError(responses.ErrorMissingParameter, "required '%s' parameter is missing", param)
|
||||||
}
|
}
|
||||||
return ps, nil
|
return ps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func requiredParamInt(r *http.Request, param string, msg string) (int, error) {
|
func requiredParamInt(r *http.Request, param string) (int, error) {
|
||||||
p := utils.ParamString(r, param)
|
p := utils.ParamString(r, param)
|
||||||
if p == "" {
|
if p == "" {
|
||||||
return 0, newError(responses.ErrorMissingParameter, msg)
|
return 0, newError(responses.ErrorMissingParameter, "required '%s' parameter is missing", param)
|
||||||
}
|
}
|
||||||
return utils.ParamInt(r, param, 0), nil
|
return utils.ParamInt(r, param, 0), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type Error struct {
|
type subError struct {
|
||||||
code int
|
code int
|
||||||
messages []interface{}
|
messages []interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newError(code int, message ...interface{}) error {
|
func newError(code int, message ...interface{}) error {
|
||||||
return Error{
|
return subError{
|
||||||
code: code,
|
code: code,
|
||||||
messages: message,
|
messages: message,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e Error) Error() string {
|
func (e subError) Error() string {
|
||||||
var msg string
|
var msg string
|
||||||
if len(e.messages) == 0 {
|
if len(e.messages) == 0 {
|
||||||
msg = responses.ErrorMsg(e.code)
|
msg = responses.ErrorMsg(e.code)
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ func NewMediaAnnotationController(ds model.DataStore, npr core.NowPlaying) *Medi
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *MediaAnnotationController) SetRating(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *MediaAnnotationController) SetRating(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
id, err := requiredParamString(r, "id", "Required id parameter is missing")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rating, err := requiredParamInt(r, "rating", "Required rating parameter is missing")
|
rating, err := requiredParamInt(r, "rating")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ func (c *MediaAnnotationController) SetRating(w http.ResponseWriter, r *http.Req
|
|||||||
return nil, newError(responses.ErrorDataNotFound, "ID not found")
|
return nil, newError(responses.ErrorDataNotFound, "ID not found")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
log.Error(r, err)
|
log.Error(r, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return newResponse(), nil
|
return newResponse(), nil
|
||||||
@@ -96,7 +96,7 @@ func (c *MediaAnnotationController) Unstar(w http.ResponseWriter, r *http.Reques
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *MediaAnnotationController) Scrobble(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *MediaAnnotationController) Scrobble(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
ids, err := requiredParamStrings(r, "id", "Required id parameter is missing")
|
ids, err := requiredParamStrings(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -228,7 +228,7 @@ func (c *MediaAnnotationController) setStar(ctx context.Context, star bool, ids
|
|||||||
return newError(responses.ErrorDataNotFound, "ID not found")
|
return newError(responses.ErrorDataNotFound, "ID not found")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
log.Error(ctx, err)
|
log.Error(ctx, err)
|
||||||
return newError(responses.ErrorGeneric, "Internal Error")
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (c *MediaRetrievalController) GetAvatar(w http.ResponseWriter, r *http.Requ
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *MediaRetrievalController) GetCoverArt(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *MediaRetrievalController) GetCoverArt(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
id, err := requiredParamString(r, "id", "id parameter required")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ func (c *MediaRetrievalController) GetCoverArt(w http.ResponseWriter, r *http.Re
|
|||||||
return nil, newError(responses.ErrorDataNotFound, "Artwork not found")
|
return nil, newError(responses.ErrorDataNotFound, "Artwork not found")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
log.Error(r, "Error retrieving coverArt", "id", id, err)
|
log.Error(r, "Error retrieving coverArt", "id", id, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ var _ = Describe("MediaRetrievalController", func() {
|
|||||||
r := newGetRequest()
|
r := newGetRequest()
|
||||||
_, err := controller.GetCoverArt(w, r)
|
_, err := controller.GetCoverArt(w, r)
|
||||||
|
|
||||||
Expect(err).To(MatchError("id parameter required"))
|
Expect(err).To(MatchError("required 'id' parameter is missing"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should fail when the file is not found", func() {
|
It("should fail when the file is not found", func() {
|
||||||
@@ -54,7 +54,7 @@ var _ = Describe("MediaRetrievalController", func() {
|
|||||||
r := newGetRequest("id=34", "size=128")
|
r := newGetRequest("id=34", "size=128")
|
||||||
_, err := controller.GetCoverArt(w, r)
|
_, err := controller.GetCoverArt(w, r)
|
||||||
|
|
||||||
Expect(err).To(MatchError("Internal Error"))
|
Expect(err).To(MatchError("weird error"))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func postFormToQueryParams(next http.Handler) http.Handler {
|
|||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
err := r.ParseForm()
|
err := r.ParseForm()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
SendError(w, r, newError(responses.ErrorGeneric, err.Error()))
|
sendError(w, r, newError(responses.ErrorGeneric, err.Error()))
|
||||||
}
|
}
|
||||||
var parts []string
|
var parts []string
|
||||||
for key, values := range r.Form {
|
for key, values := range r.Form {
|
||||||
@@ -49,7 +49,7 @@ func checkRequiredParameters(next http.Handler) http.Handler {
|
|||||||
if utils.ParamString(r, p) == "" {
|
if utils.ParamString(r, p) == "" {
|
||||||
msg := fmt.Sprintf(`Missing required parameter "%s"`, p)
|
msg := fmt.Sprintf(`Missing required parameter "%s"`, p)
|
||||||
log.Warn(r, msg)
|
log.Warn(r, msg)
|
||||||
SendError(w, r, newError(responses.ErrorMissingParameter, msg))
|
sendError(w, r, newError(responses.ErrorMissingParameter, msg))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,7 +87,7 @@ func authenticate(ds model.DataStore) func(next http.Handler) http.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
SendError(w, r, newError(responses.ErrorAuthenticationFail))
|
sendError(w, r, newError(responses.ErrorAuthenticationFail))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ func (c *PlaylistsController) GetPlaylists(w http.ResponseWriter, r *http.Reques
|
|||||||
allPls, err := c.ds.Playlist(ctx).GetAll()
|
allPls, err := c.ds.Playlist(ctx).GetAll()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, err)
|
log.Error(r, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal error")
|
return nil, err
|
||||||
}
|
}
|
||||||
playlists := make([]responses.Playlist, len(allPls))
|
playlists := make([]responses.Playlist, len(allPls))
|
||||||
for i, p := range allPls {
|
for i, p := range allPls {
|
||||||
@@ -38,7 +38,7 @@ func (c *PlaylistsController) GetPlaylists(w http.ResponseWriter, r *http.Reques
|
|||||||
|
|
||||||
func (c *PlaylistsController) GetPlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *PlaylistsController) GetPlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
id, err := requiredParamString(r, "id", "id parameter required")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ func (c *PlaylistsController) GetPlaylist(w http.ResponseWriter, r *http.Request
|
|||||||
return nil, newError(responses.ErrorDataNotFound, "Directory not found")
|
return nil, newError(responses.ErrorDataNotFound, "Directory not found")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
log.Error(r, err)
|
log.Error(r, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := newResponse()
|
response := newResponse()
|
||||||
@@ -97,7 +97,7 @@ func (c *PlaylistsController) CreatePlaylist(w http.ResponseWriter, r *http.Requ
|
|||||||
err := c.create(r.Context(), playlistId, name, songIds)
|
err := c.create(r.Context(), playlistId, name, songIds)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, err)
|
log.Error(r, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
return newResponse(), nil
|
return newResponse(), nil
|
||||||
}
|
}
|
||||||
@@ -118,7 +118,7 @@ func (c *PlaylistsController) delete(ctx context.Context, playlistId string) err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *PlaylistsController) DeletePlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *PlaylistsController) DeletePlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
id, err := requiredParamString(r, "id", "Required parameter id is missing")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -128,7 +128,7 @@ func (c *PlaylistsController) DeletePlaylist(w http.ResponseWriter, r *http.Requ
|
|||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, err)
|
log.Error(r, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
return newResponse(), nil
|
return newResponse(), nil
|
||||||
}
|
}
|
||||||
@@ -166,7 +166,7 @@ func (p *PlaylistsController) update(ctx context.Context, playlistId string, nam
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *PlaylistsController) UpdatePlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *PlaylistsController) UpdatePlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
playlistId, err := requiredParamString(r, "playlistId", "Required parameter playlistId is missing")
|
playlistId, err := requiredParamString(r, "playlistId")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -192,7 +192,7 @@ func (c *PlaylistsController) UpdatePlaylist(w http.ResponseWriter, r *http.Requ
|
|||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r, err)
|
log.Error(r, err)
|
||||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
return nil, err
|
||||||
}
|
}
|
||||||
return newResponse(), nil
|
return newResponse(), nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func NewSearchingController(ds model.DataStore) *SearchingController {
|
|||||||
func (c *SearchingController) getParams(r *http.Request) (*searchParams, error) {
|
func (c *SearchingController) getParams(r *http.Request) (*searchParams, error) {
|
||||||
var err error
|
var err error
|
||||||
sp := &searchParams{}
|
sp := &searchParams{}
|
||||||
sp.query, err = requiredParamString(r, "query", "Parameter query required")
|
sp.query, err = requiredParamString(r, "query")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func NewStreamController(streamer core.MediaStreamer, archiver core.Archiver, ds
|
|||||||
|
|
||||||
func (c *StreamController) Stream(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *StreamController) Stream(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
id, err := requiredParamString(r, "id", "id parameter required")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,7 @@ func (c *StreamController) Stream(w http.ResponseWriter, r *http.Request) (*resp
|
|||||||
|
|
||||||
func (c *StreamController) Download(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *StreamController) Download(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
id, err := requiredParamString(r, "id", "id parameter required")
|
id, err := requiredParamString(r, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ func NewUsersController() *UsersController {
|
|||||||
|
|
||||||
// TODO This is a placeholder. The real one has to read this info from a config file or the database
|
// TODO This is a placeholder. The real one has to read this info from a config file or the database
|
||||||
func (c *UsersController) GetUser(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *UsersController) GetUser(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
user, err := requiredParamString(r, "username", "Required string parameter 'username' is not present")
|
user, err := requiredParamString(r, "username")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user