From c361f2313999d139048e1478c84d775df7caca72 Mon Sep 17 00:00:00 2001 From: ze0s <43699394+zze0s@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:03:39 +0200 Subject: [PATCH] feat(http): improve error handling (#1006) --- internal/http/apikey.go | 9 +++--- internal/http/feed.go | 60 ++++++++++++++++++----------------- internal/http/filter.go | 26 ++++++--------- internal/http/indexer.go | 15 ++++++--- internal/http/irc.go | 32 ++++++++++++++++--- internal/http/notification.go | 18 +++++++---- 6 files changed, 94 insertions(+), 66 deletions(-) diff --git a/internal/http/apikey.go b/internal/http/apikey.go index 34df20b..8d4cb6b 100644 --- a/internal/http/apikey.go +++ b/internal/http/apikey.go @@ -58,14 +58,12 @@ func (h apikeyHandler) store(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } if err := h.service.Store(ctx, &data); err != nil { - // encode error - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } @@ -74,8 +72,9 @@ func (h apikeyHandler) store(w http.ResponseWriter, r *http.Request) { func (h apikeyHandler) delete(w http.ResponseWriter, r *http.Request) { if err := h.service.Delete(r.Context(), chi.URLParam(r, "apikey")); err != nil { - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } + h.encoder.NoContent(w) } diff --git a/internal/http/feed.go b/internal/http/feed.go index 4ce5c24..8e831b1 100644 --- a/internal/http/feed.go +++ b/internal/http/feed.go @@ -38,12 +38,15 @@ func newFeedHandler(encoder encoder, service feedService) *feedHandler { func (h feedHandler) Routes(r chi.Router) { r.Get("/", h.find) - r.Get("/{feedID}/latest", h.latestRun) r.Post("/", h.store) r.Post("/test", h.test) - r.Put("/{feedID}", h.update) - r.Patch("/{feedID}/enabled", h.toggleEnabled) - r.Delete("/{feedID}", h.delete) + + r.Route("/{feedID}", func(r chi.Router) { + r.Put("/", h.update) + r.Delete("/", h.delete) + r.Patch("/enabled", h.toggleEnabled) + r.Get("/latest", h.latestRun) + }) } func (h feedHandler) find(w http.ResponseWriter, r *http.Request) { @@ -65,15 +68,13 @@ func (h feedHandler) store(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error - h.encoder.StatusNotFound(w) + h.encoder.Error(w, err) return } err := h.service.Store(ctx, data) if err != nil { - // encode error - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } @@ -87,14 +88,12 @@ func (h feedHandler) test(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } if err := h.service.Test(ctx, data); err != nil { - // encode error - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } @@ -108,15 +107,13 @@ func (h feedHandler) update(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } err := h.service.Update(ctx, data) if err != nil { - // encode error - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } @@ -132,18 +129,19 @@ func (h feedHandler) toggleEnabled(w http.ResponseWriter, r *http.Request) { } ) - id, _ := strconv.Atoi(filterID) - - if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error - h.encoder.StatusInternalError(w) + id, err := strconv.Atoi(filterID) + if err != nil { + h.encoder.Error(w, err) return } - err := h.service.ToggleEnabled(ctx, id, data.Enabled) - if err != nil { - // encode error - h.encoder.StatusInternalError(w) + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + h.encoder.Error(w, err) + return + } + + if err := h.service.ToggleEnabled(ctx, id, data.Enabled); err != nil { + h.encoder.Error(w, err) return } @@ -156,10 +154,14 @@ func (h feedHandler) delete(w http.ResponseWriter, r *http.Request) { filterID = chi.URLParam(r, "feedID") ) - id, _ := strconv.Atoi(filterID) + id, err := strconv.Atoi(filterID) + if err != nil { + h.encoder.Error(w, err) + return + } if err := h.service.Delete(ctx, id); err != nil { - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } @@ -174,13 +176,13 @@ func (h feedHandler) latestRun(w http.ResponseWriter, r *http.Request) { id, err := strconv.Atoi(filterID) if err != nil { - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } feed, err := h.service.GetLastRunData(ctx, id) if err != nil { - h.encoder.StatusInternalError(w) + h.encoder.Error(w, err) return } diff --git a/internal/http/filter.go b/internal/http/filter.go index 05a983c..ccfbd60 100644 --- a/internal/http/filter.go +++ b/internal/http/filter.go @@ -42,13 +42,17 @@ func newFilterHandler(encoder encoder, service filterService) *filterHandler { func (h filterHandler) Routes(r chi.Router) { r.Get("/", h.getFilters) - r.Get("/{filterID}", h.getByID) - r.Get("/{filterID}/duplicate", h.duplicate) r.Post("/", h.store) - r.Put("/{filterID}", h.update) - r.Patch("/{filterID}", h.updatePartial) - r.Put("/{filterID}/enabled", h.toggleEnabled) - r.Delete("/{filterID}", h.delete) + + r.Route("/{filterID}", func(r chi.Router) { + r.Get("/", h.getByID) + r.Put("/", h.update) + r.Patch("/", h.updatePartial) + r.Delete("/", h.delete) + + r.Get("/duplicate", h.duplicate) + r.Put("/enabled", h.toggleEnabled) + }) } func (h filterHandler) getFilters(w http.ResponseWriter, r *http.Request) { @@ -92,7 +96,6 @@ func (h filterHandler) getFilters(w http.ResponseWriter, r *http.Request) { trackers, err := h.service.Find(ctx, params) if err != nil { - // h.encoder.Error(w, err) return } @@ -149,14 +152,12 @@ func (h filterHandler) store(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error h.encoder.Error(w, err) return } filter, err := h.service.Store(ctx, data) if err != nil { - // encode error h.encoder.Error(w, err) return } @@ -171,14 +172,12 @@ func (h filterHandler) update(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error h.encoder.Error(w, err) return } filter, err := h.service.Update(ctx, data) if err != nil { - // encode error h.encoder.Error(w, err) return } @@ -202,13 +201,11 @@ func (h filterHandler) updatePartial(w http.ResponseWriter, r *http.Request) { data.ID = id if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error h.encoder.Error(w, err) return } if err := h.service.UpdatePartial(ctx, data); err != nil { - // encode error h.encoder.Error(w, err) return } @@ -232,13 +229,11 @@ func (h filterHandler) toggleEnabled(w http.ResponseWriter, r *http.Request) { } if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error h.encoder.Error(w, err) return } if err := h.service.ToggleEnabled(ctx, id, data.Enabled); err != nil { - // encode error h.encoder.Error(w, err) return } @@ -259,7 +254,6 @@ func (h filterHandler) delete(w http.ResponseWriter, r *http.Request) { } if err := h.service.Delete(ctx, id); err != nil { - // return err h.encoder.Error(w, err) } diff --git a/internal/http/indexer.go b/internal/http/indexer.go index 114d615..814f796 100644 --- a/internal/http/indexer.go +++ b/internal/http/indexer.go @@ -44,8 +44,11 @@ func (h indexerHandler) Routes(r chi.Router) { r.Put("/", h.update) r.Get("/", h.getAll) r.Get("/options", h.list) - r.Delete("/{indexerID}", h.delete) - r.Post("/{id}/api/test", h.testApi) + + r.Route("/{indexerID}", func(r chi.Router) { + r.Delete("/", h.delete) + r.Post("/api/test", h.testApi) + }) } func (h indexerHandler) getSchema(w http.ResponseWriter, r *http.Request) { @@ -104,7 +107,11 @@ func (h indexerHandler) delete(w http.ResponseWriter, r *http.Request) { idParam = chi.URLParam(r, "indexerID") ) - id, _ := strconv.Atoi(idParam) + id, err := strconv.Atoi(idParam) + if err != nil { + h.encoder.Error(w, err) + return + } if err := h.service.Delete(ctx, id); err != nil { h.encoder.Error(w, err) @@ -139,7 +146,7 @@ func (h indexerHandler) list(w http.ResponseWriter, r *http.Request) { func (h indexerHandler) testApi(w http.ResponseWriter, r *http.Request) { var ( ctx = r.Context() - idParam = chi.URLParam(r, "id") + idParam = chi.URLParam(r, "indexerID") req domain.IndexerTestApiRequest ) diff --git a/internal/http/irc.go b/internal/http/irc.go index a62c040..357647c 100644 --- a/internal/http/irc.go +++ b/internal/http/irc.go @@ -87,11 +87,16 @@ func (h ircHandler) getNetworkByID(w http.ResponseWriter, r *http.Request) { networkID = chi.URLParam(r, "networkID") ) - id, _ := strconv.Atoi(networkID) + id, err := strconv.Atoi(networkID) + if err != nil { + h.encoder.Error(w, err) + return + } network, err := h.service.GetNetworkByID(ctx, int64(id)) if err != nil { h.encoder.Error(w, err) + return } h.encoder.StatusResponse(w, http.StatusOK, network) @@ -103,10 +108,15 @@ func (h ircHandler) restartNetwork(w http.ResponseWriter, r *http.Request) { networkID = chi.URLParam(r, "networkID") ) - id, _ := strconv.Atoi(networkID) + id, err := strconv.Atoi(networkID) + if err != nil { + h.encoder.Error(w, err) + return + } if err := h.service.RestartNetwork(ctx, int64(id)); err != nil { h.encoder.Error(w, err) + return } h.encoder.NoContent(w) @@ -154,7 +164,11 @@ func (h ircHandler) sendCmd(w http.ResponseWriter, r *http.Request) { data domain.SendIrcCmdRequest ) - id, _ := strconv.Atoi(networkID) + id, err := strconv.Atoi(networkID) + if err != nil { + h.encoder.Error(w, err) + return + } if err := json.NewDecoder(r.Body).Decode(&data); err != nil { h.encoder.Error(w, err) @@ -178,7 +192,11 @@ func (h ircHandler) storeChannel(w http.ResponseWriter, r *http.Request) { data domain.IrcChannel ) - id, _ := strconv.Atoi(networkID) + id, err := strconv.Atoi(networkID) + if err != nil { + h.encoder.Error(w, err) + return + } if err := json.NewDecoder(r.Body).Decode(&data); err != nil { h.encoder.Error(w, err) @@ -199,7 +217,11 @@ func (h ircHandler) deleteNetwork(w http.ResponseWriter, r *http.Request) { networkID = chi.URLParam(r, "networkID") ) - id, _ := strconv.Atoi(networkID) + id, err := strconv.Atoi(networkID) + if err != nil { + h.encoder.Error(w, err) + return + } if err := h.service.DeleteNetwork(ctx, int64(id)); err != nil { h.encoder.Error(w, err) diff --git a/internal/http/notification.go b/internal/http/notification.go index e48edec..085f8be 100644 --- a/internal/http/notification.go +++ b/internal/http/notification.go @@ -39,8 +39,11 @@ func (h notificationHandler) Routes(r chi.Router) { r.Get("/", h.list) r.Post("/", h.store) r.Post("/test", h.test) - r.Put("/{notificationID}", h.update) - r.Delete("/{notificationID}", h.delete) + + r.Route("/{notificationID}", func(r chi.Router) { + r.Put("/", h.update) + r.Delete("/", h.delete) + }) } func (h notificationHandler) list(w http.ResponseWriter, r *http.Request) { @@ -62,13 +65,13 @@ func (h notificationHandler) store(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error + h.encoder.Error(w, err) return } filter, err := h.service.Store(ctx, data) if err != nil { - // encode error + h.encoder.Error(w, err) return } @@ -82,13 +85,13 @@ func (h notificationHandler) update(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { - // encode error + h.encoder.Error(w, err) return } filter, err := h.service.Update(ctx, data) if err != nil { - // encode error + h.encoder.Error(w, err) return } @@ -104,7 +107,8 @@ func (h notificationHandler) delete(w http.ResponseWriter, r *http.Request) { id, _ := strconv.Atoi(notificationID) if err := h.service.Delete(ctx, id); err != nil { - // return err + h.encoder.Error(w, err) + return } h.encoder.StatusResponse(w, http.StatusNoContent, nil)