mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-24 07:30:57 +03:00
Simplify error responses
This commit is contained in:
parent
0f418a93cd
commit
4777cf0aba
@ -28,7 +28,7 @@ func NewAlbumListController(ds model.DataStore, nowPlaying core.NowPlaying) *Alb
|
||||
}
|
||||
|
||||
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 {
|
||||
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)
|
||||
if err != nil {
|
||||
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)
|
||||
if err != nil {
|
||||
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)
|
||||
if err != nil {
|
||||
log.Error(r, "Error retrieving starred mediaFiles", "error", err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response := newResponse()
|
||||
@ -137,7 +137,7 @@ func (c *AlbumListController) GetNowPlaying(w http.ResponseWriter, r *http.Reque
|
||||
npInfo, err := c.nowPlaying.GetAll()
|
||||
if err != nil {
|
||||
log.Error(r, "Error retrieving now playing list", "error", err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response := newResponse()
|
||||
@ -146,7 +146,7 @@ func (c *AlbumListController) GetNowPlaying(w http.ResponseWriter, r *http.Reque
|
||||
for i, np := range npInfo {
|
||||
mf, err := c.ds.MediaFile(ctx).Get(np.TrackID)
|
||||
if err != nil {
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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))
|
||||
if err != nil {
|
||||
log.Error(r, "Error retrieving random songs", "error", err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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))
|
||||
if err != nil {
|
||||
log.Error(r, "Error retrieving random songs", "error", err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response := newResponse()
|
||||
|
@ -44,7 +44,7 @@ var _ = Describe("AlbumListController", func() {
|
||||
r := newGetRequest()
|
||||
_, 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() {
|
||||
@ -76,7 +76,7 @@ var _ = Describe("AlbumListController", func() {
|
||||
r := newGetRequest()
|
||||
_, 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() {
|
||||
|
@ -19,7 +19,7 @@ import (
|
||||
|
||||
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 {
|
||||
Artwork core.Artwork
|
||||
@ -64,107 +64,111 @@ func (api *Router) routes() http.Handler {
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initSystemController(api)
|
||||
withPlayer := r.With(getPlayer(api.Players))
|
||||
H(withPlayer, "ping", c.Ping)
|
||||
H(withPlayer, "getLicense", c.GetLicense)
|
||||
h(withPlayer, "ping", c.Ping)
|
||||
h(withPlayer, "getLicense", c.GetLicense)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initBrowsingController(api)
|
||||
withPlayer := r.With(getPlayer(api.Players))
|
||||
H(withPlayer, "getMusicFolders", c.GetMusicFolders)
|
||||
H(withPlayer, "getIndexes", c.GetIndexes)
|
||||
H(withPlayer, "getArtists", c.GetArtists)
|
||||
H(withPlayer, "getGenres", c.GetGenres)
|
||||
H(withPlayer, "getMusicDirectory", c.GetMusicDirectory)
|
||||
H(withPlayer, "getArtist", c.GetArtist)
|
||||
H(withPlayer, "getAlbum", c.GetAlbum)
|
||||
H(withPlayer, "getSong", c.GetSong)
|
||||
H(withPlayer, "getArtistInfo", c.GetArtistInfo)
|
||||
H(withPlayer, "getArtistInfo2", c.GetArtistInfo2)
|
||||
H(withPlayer, "getTopSongs", c.GetTopSongs)
|
||||
H(withPlayer, "getSimilarSongs", c.GetSimilarSongs)
|
||||
H(withPlayer, "getSimilarSongs2", c.GetSimilarSongs2)
|
||||
h(withPlayer, "getMusicFolders", c.GetMusicFolders)
|
||||
h(withPlayer, "getIndexes", c.GetIndexes)
|
||||
h(withPlayer, "getArtists", c.GetArtists)
|
||||
h(withPlayer, "getGenres", c.GetGenres)
|
||||
h(withPlayer, "getMusicDirectory", c.GetMusicDirectory)
|
||||
h(withPlayer, "getArtist", c.GetArtist)
|
||||
h(withPlayer, "getAlbum", c.GetAlbum)
|
||||
h(withPlayer, "getSong", c.GetSong)
|
||||
h(withPlayer, "getArtistInfo", c.GetArtistInfo)
|
||||
h(withPlayer, "getArtistInfo2", c.GetArtistInfo2)
|
||||
h(withPlayer, "getTopSongs", c.GetTopSongs)
|
||||
h(withPlayer, "getSimilarSongs", c.GetSimilarSongs)
|
||||
h(withPlayer, "getSimilarSongs2", c.GetSimilarSongs2)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initAlbumListController(api)
|
||||
withPlayer := r.With(getPlayer(api.Players))
|
||||
H(withPlayer, "getAlbumList", c.GetAlbumList)
|
||||
H(withPlayer, "getAlbumList2", c.GetAlbumList2)
|
||||
H(withPlayer, "getStarred", c.GetStarred)
|
||||
H(withPlayer, "getStarred2", c.GetStarred2)
|
||||
H(withPlayer, "getNowPlaying", c.GetNowPlaying)
|
||||
H(withPlayer, "getRandomSongs", c.GetRandomSongs)
|
||||
H(withPlayer, "getSongsByGenre", c.GetSongsByGenre)
|
||||
h(withPlayer, "getAlbumList", c.GetAlbumList)
|
||||
h(withPlayer, "getAlbumList2", c.GetAlbumList2)
|
||||
h(withPlayer, "getStarred", c.GetStarred)
|
||||
h(withPlayer, "getStarred2", c.GetStarred2)
|
||||
h(withPlayer, "getNowPlaying", c.GetNowPlaying)
|
||||
h(withPlayer, "getRandomSongs", c.GetRandomSongs)
|
||||
h(withPlayer, "getSongsByGenre", c.GetSongsByGenre)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initMediaAnnotationController(api)
|
||||
H(r, "setRating", c.SetRating)
|
||||
H(r, "star", c.Star)
|
||||
H(r, "unstar", c.Unstar)
|
||||
H(r, "scrobble", c.Scrobble)
|
||||
h(r, "setRating", c.SetRating)
|
||||
h(r, "star", c.Star)
|
||||
h(r, "unstar", c.Unstar)
|
||||
h(r, "scrobble", c.Scrobble)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initPlaylistsController(api)
|
||||
withPlayer := r.With(getPlayer(api.Players))
|
||||
H(withPlayer, "getPlaylists", c.GetPlaylists)
|
||||
H(withPlayer, "getPlaylist", c.GetPlaylist)
|
||||
H(withPlayer, "createPlaylist", c.CreatePlaylist)
|
||||
H(withPlayer, "deletePlaylist", c.DeletePlaylist)
|
||||
H(withPlayer, "updatePlaylist", c.UpdatePlaylist)
|
||||
h(withPlayer, "getPlaylists", c.GetPlaylists)
|
||||
h(withPlayer, "getPlaylist", c.GetPlaylist)
|
||||
h(withPlayer, "createPlaylist", c.CreatePlaylist)
|
||||
h(withPlayer, "deletePlaylist", c.DeletePlaylist)
|
||||
h(withPlayer, "updatePlaylist", c.UpdatePlaylist)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initBookmarksController(api)
|
||||
withPlayer := r.With(getPlayer(api.Players))
|
||||
H(withPlayer, "getBookmarks", c.GetBookmarks)
|
||||
H(withPlayer, "createBookmark", c.CreateBookmark)
|
||||
H(withPlayer, "deleteBookmark", c.DeleteBookmark)
|
||||
H(withPlayer, "getPlayQueue", c.GetPlayQueue)
|
||||
H(withPlayer, "savePlayQueue", c.SavePlayQueue)
|
||||
h(withPlayer, "getBookmarks", c.GetBookmarks)
|
||||
h(withPlayer, "createBookmark", c.CreateBookmark)
|
||||
h(withPlayer, "deleteBookmark", c.DeleteBookmark)
|
||||
h(withPlayer, "getPlayQueue", c.GetPlayQueue)
|
||||
h(withPlayer, "savePlayQueue", c.SavePlayQueue)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initSearchingController(api)
|
||||
withPlayer := r.With(getPlayer(api.Players))
|
||||
H(withPlayer, "search2", c.Search2)
|
||||
H(withPlayer, "search3", c.Search3)
|
||||
h(withPlayer, "search2", c.Search2)
|
||||
h(withPlayer, "search3", c.Search3)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initUsersController(api)
|
||||
H(r, "getUser", c.GetUser)
|
||||
h(r, "getUser", c.GetUser)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initMediaRetrievalController(api)
|
||||
// configure request throttling
|
||||
maxRequests := utils.MaxInt(2, runtime.NumCPU())
|
||||
withThrottle := r.With(middleware.ThrottleBacklog(maxRequests, consts.RequestThrottleBacklogLimit, consts.RequestThrottleBacklogTimeout))
|
||||
H(withThrottle, "getAvatar", c.GetAvatar)
|
||||
H(withThrottle, "getCoverArt", c.GetCoverArt)
|
||||
h(withThrottle, "getAvatar", c.GetAvatar)
|
||||
h(withThrottle, "getCoverArt", c.GetCoverArt)
|
||||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
c := initStreamController(api)
|
||||
withPlayer := r.With(getPlayer(api.Players))
|
||||
H(withPlayer, "stream", c.Stream)
|
||||
H(withPlayer, "download", c.Download)
|
||||
h(withPlayer, "stream", c.Stream)
|
||||
h(withPlayer, "download", c.Download)
|
||||
})
|
||||
|
||||
// Deprecated/Out of scope endpoints
|
||||
HGone(r, "getChatMessages")
|
||||
HGone(r, "addChatMessage")
|
||||
HGone(r, "getVideos")
|
||||
HGone(r, "getVideoInfo")
|
||||
HGone(r, "getCaptions")
|
||||
h410(r, "getChatMessages")
|
||||
h410(r, "addChatMessage")
|
||||
h410(r, "getVideos")
|
||||
h410(r, "getVideoInfo")
|
||||
h410(r, "getCaptions")
|
||||
return r
|
||||
}
|
||||
|
||||
// Add the Subsonic handler, with and without `.view` extension
|
||||
// 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) {
|
||||
res, err := f(w, r)
|
||||
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
|
||||
}
|
||||
if res != nil {
|
||||
SendResponse(w, r, res)
|
||||
sendResponse(w, r, res)
|
||||
}
|
||||
}
|
||||
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
|
||||
func HGone(r chi.Router, path string) {
|
||||
func h410(r chi.Router, path string) {
|
||||
handle := func(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(410)
|
||||
_, _ = 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)
|
||||
}
|
||||
|
||||
func SendError(w http.ResponseWriter, r *http.Request, err error) {
|
||||
func sendError(w http.ResponseWriter, r *http.Request, err error) {
|
||||
response := newResponse()
|
||||
code := responses.ErrorGeneric
|
||||
if e, ok := err.(Error); ok {
|
||||
if e, ok := err.(subError); ok {
|
||||
code = e.code
|
||||
}
|
||||
response.Status = "fail"
|
||||
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")
|
||||
var response []byte
|
||||
switch f {
|
||||
|
@ -24,7 +24,7 @@ func (c *BookmarksController) GetBookmarks(w http.ResponseWriter, r *http.Reques
|
||||
repo := c.ds.MediaFile(r.Context())
|
||||
bmks, err := repo.GetBookmarks()
|
||||
if err != nil {
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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) {
|
||||
id, err := requiredParamString(r, "id", "id parameter required")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -55,13 +55,13 @@ func (c *BookmarksController) CreateBookmark(w http.ResponseWriter, r *http.Requ
|
||||
repo := c.ds.MediaFile(r.Context())
|
||||
err = repo.AddBookmark(id, comment, position)
|
||||
if err != nil {
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
return newResponse(), nil
|
||||
}
|
||||
|
||||
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 {
|
||||
return nil, err
|
||||
}
|
||||
@ -69,7 +69,7 @@ func (c *BookmarksController) DeleteBookmark(w http.ResponseWriter, r *http.Requ
|
||||
repo := c.ds.MediaFile(r.Context())
|
||||
err = repo.DeleteBookmark(id)
|
||||
if err != nil {
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
return newResponse(), nil
|
||||
}
|
||||
@ -80,7 +80,7 @@ func (c *BookmarksController) GetPlayQueue(w http.ResponseWriter, r *http.Reques
|
||||
repo := c.ds.PlayQueue(r.Context())
|
||||
pq, err := repo.Retrieve(user.ID)
|
||||
if err != nil {
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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) {
|
||||
ids, err := requiredParamStrings(r, "id", "id parameter required")
|
||||
ids, err := requiredParamStrings(r, "id")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -125,7 +125,7 @@ func (c *BookmarksController) SavePlayQueue(w http.ResponseWriter, r *http.Reque
|
||||
repo := c.ds.PlayQueue(r.Context())
|
||||
err = repo.Store(pq)
|
||||
if err != nil {
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
return newResponse(), nil
|
||||
}
|
||||
|
@ -41,13 +41,13 @@ func (c *BrowsingController) getArtistIndex(ctx context.Context, mediaFolderId i
|
||||
folder, err := c.ds.MediaFolder(ctx).Get(int32(mediaFolderId))
|
||||
if err != nil {
|
||||
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")
|
||||
if err != nil {
|
||||
log.Error(ctx, "Error retrieving LastScan property", err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var indexes model.ArtistIndexes
|
||||
@ -57,7 +57,7 @@ func (c *BrowsingController) getArtistIndex(ctx context.Context, mediaFolderId i
|
||||
indexes, err = c.ds.Artist(ctx).GetIndex()
|
||||
if err != nil {
|
||||
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")
|
||||
case err != nil:
|
||||
log.Error(err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var dir *responses.Directory
|
||||
@ -133,7 +133,7 @@ func (c *BrowsingController) GetMusicDirectory(w http.ResponseWriter, r *http.Re
|
||||
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response := newResponse()
|
||||
@ -152,13 +152,13 @@ func (c *BrowsingController) GetArtist(w http.ResponseWriter, r *http.Request) (
|
||||
return nil, newError(responses.ErrorDataNotFound, "Artist not found")
|
||||
case err != nil:
|
||||
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)
|
||||
if err != nil {
|
||||
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()
|
||||
@ -177,13 +177,13 @@ func (c *BrowsingController) GetAlbum(w http.ResponseWriter, r *http.Request) (*
|
||||
return nil, newError(responses.ErrorDataNotFound, "Album not found")
|
||||
case err != nil:
|
||||
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)
|
||||
if err != nil {
|
||||
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()
|
||||
@ -202,7 +202,7 @@ func (c *BrowsingController) GetSong(w http.ResponseWriter, r *http.Request) (*r
|
||||
return nil, newError(responses.ErrorDataNotFound, "Song not found")
|
||||
case err != nil:
|
||||
log.Error(r, "Error retrieving MediaFile", "id", id, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response := newResponse()
|
||||
@ -216,7 +216,7 @@ func (c *BrowsingController) GetGenres(w http.ResponseWriter, r *http.Request) (
|
||||
genres, err := c.ds.Genre(ctx).GetAll()
|
||||
if err != nil {
|
||||
log.Error(r, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
for i, g := range genres {
|
||||
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) {
|
||||
ctx := r.Context()
|
||||
id, err := requiredParamString(r, "id", "id parameter required")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
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) {
|
||||
ctx := r.Context()
|
||||
id, err := requiredParamString(r, "id", "id parameter required")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
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) {
|
||||
ctx := r.Context()
|
||||
artist, err := requiredParamString(r, "artist", "artist parameter required")
|
||||
artist, err := requiredParamString(r, "artist")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -17,43 +17,43 @@ func newResponse() *responses.Subsonic {
|
||||
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)
|
||||
if p == "" {
|
||||
return "", newError(responses.ErrorMissingParameter, msg)
|
||||
return "", newError(responses.ErrorMissingParameter, "required '%s' parameter is missing", param)
|
||||
}
|
||||
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)
|
||||
if len(ps) == 0 {
|
||||
return nil, newError(responses.ErrorMissingParameter, msg)
|
||||
return nil, newError(responses.ErrorMissingParameter, "required '%s' parameter is missing", param)
|
||||
}
|
||||
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)
|
||||
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
|
||||
}
|
||||
|
||||
type Error struct {
|
||||
type subError struct {
|
||||
code int
|
||||
messages []interface{}
|
||||
}
|
||||
|
||||
func newError(code int, message ...interface{}) error {
|
||||
return Error{
|
||||
return subError{
|
||||
code: code,
|
||||
messages: message,
|
||||
}
|
||||
}
|
||||
|
||||
func (e Error) Error() string {
|
||||
func (e subError) Error() string {
|
||||
var msg string
|
||||
if len(e.messages) == 0 {
|
||||
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) {
|
||||
id, err := requiredParamString(r, "id", "Required id parameter is missing")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rating, err := requiredParamInt(r, "rating", "Required rating parameter is missing")
|
||||
rating, err := requiredParamInt(r, "rating")
|
||||
if err != nil {
|
||||
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")
|
||||
case err != nil:
|
||||
log.Error(r, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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) {
|
||||
ids, err := requiredParamStrings(r, "id", "Required id parameter is missing")
|
||||
ids, err := requiredParamStrings(r, "id")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -228,7 +228,7 @@ func (c *MediaAnnotationController) setStar(ctx context.Context, star bool, ids
|
||||
return newError(responses.ErrorDataNotFound, "ID not found")
|
||||
case err != nil:
|
||||
log.Error(ctx, err)
|
||||
return newError(responses.ErrorGeneric, "Internal Error")
|
||||
return err
|
||||
}
|
||||
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) {
|
||||
id, err := requiredParamString(r, "id", "id parameter required")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
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")
|
||||
case err != nil:
|
||||
log.Error(r, "Error retrieving coverArt", "id", id, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
|
@ -38,7 +38,7 @@ var _ = Describe("MediaRetrievalController", func() {
|
||||
r := newGetRequest()
|
||||
_, 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() {
|
||||
@ -54,7 +54,7 @@ var _ = Describe("MediaRetrievalController", func() {
|
||||
r := newGetRequest("id=34", "size=128")
|
||||
_, 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) {
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
SendError(w, r, newError(responses.ErrorGeneric, err.Error()))
|
||||
sendError(w, r, newError(responses.ErrorGeneric, err.Error()))
|
||||
}
|
||||
var parts []string
|
||||
for key, values := range r.Form {
|
||||
@ -49,7 +49,7 @@ func checkRequiredParameters(next http.Handler) http.Handler {
|
||||
if utils.ParamString(r, p) == "" {
|
||||
msg := fmt.Sprintf(`Missing required parameter "%s"`, p)
|
||||
log.Warn(r, msg)
|
||||
SendError(w, r, newError(responses.ErrorMissingParameter, msg))
|
||||
sendError(w, r, newError(responses.ErrorMissingParameter, msg))
|
||||
return
|
||||
}
|
||||
}
|
||||
@ -87,7 +87,7 @@ func authenticate(ds model.DataStore) func(next http.Handler) http.Handler {
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
SendError(w, r, newError(responses.ErrorAuthenticationFail))
|
||||
sendError(w, r, newError(responses.ErrorAuthenticationFail))
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,7 @@ func (c *PlaylistsController) GetPlaylists(w http.ResponseWriter, r *http.Reques
|
||||
allPls, err := c.ds.Playlist(ctx).GetAll()
|
||||
if err != nil {
|
||||
log.Error(r, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal error")
|
||||
return nil, err
|
||||
}
|
||||
playlists := make([]responses.Playlist, len(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) {
|
||||
ctx := r.Context()
|
||||
id, err := requiredParamString(r, "id", "id parameter required")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
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")
|
||||
case err != nil:
|
||||
log.Error(r, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response := newResponse()
|
||||
@ -97,7 +97,7 @@ func (c *PlaylistsController) CreatePlaylist(w http.ResponseWriter, r *http.Requ
|
||||
err := c.create(r.Context(), playlistId, name, songIds)
|
||||
if err != nil {
|
||||
log.Error(r, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
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) {
|
||||
id, err := requiredParamString(r, "id", "Required parameter id is missing")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -128,7 +128,7 @@ func (c *PlaylistsController) DeletePlaylist(w http.ResponseWriter, r *http.Requ
|
||||
}
|
||||
if err != nil {
|
||||
log.Error(r, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
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) {
|
||||
playlistId, err := requiredParamString(r, "playlistId", "Required parameter playlistId is missing")
|
||||
playlistId, err := requiredParamString(r, "playlistId")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -192,7 +192,7 @@ func (c *PlaylistsController) UpdatePlaylist(w http.ResponseWriter, r *http.Requ
|
||||
}
|
||||
if err != nil {
|
||||
log.Error(r, err)
|
||||
return nil, newError(responses.ErrorGeneric, "Internal Error")
|
||||
return nil, err
|
||||
}
|
||||
return newResponse(), nil
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ func NewSearchingController(ds model.DataStore) *SearchingController {
|
||||
func (c *SearchingController) getParams(r *http.Request) (*searchParams, error) {
|
||||
var err error
|
||||
sp := &searchParams{}
|
||||
sp.query, err = requiredParamString(r, "query", "Parameter query required")
|
||||
sp.query, err = requiredParamString(r, "query")
|
||||
if err != nil {
|
||||
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) {
|
||||
ctx := r.Context()
|
||||
id, err := requiredParamString(r, "id", "id parameter required")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
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) {
|
||||
ctx := r.Context()
|
||||
id, err := requiredParamString(r, "id", "id parameter required")
|
||||
id, err := requiredParamString(r, "id")
|
||||
if err != nil {
|
||||
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
|
||||
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 {
|
||||
return nil, err
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user