Simplify error responses

This commit is contained in:
Deluan 2020-10-27 15:23:29 -04:00
parent 0f418a93cd
commit 4777cf0aba
14 changed files with 126 additions and 122 deletions

@ -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
}