From 1f58b37a5e86603b16e137031c36f37580e9d410 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Sun, 7 Oct 2018 18:42:43 -0700 Subject: Refactor HTTP response builder --- api/category.go | 29 ++++++++++++++-------------- api/entry.go | 44 +++++++++++++++++++++---------------------- api/feed.go | 46 ++++++++++++++++++++++----------------------- api/icon.go | 7 +++---- api/opml.go | 8 ++++---- api/subscription.go | 7 +++---- api/user.go | 54 ++++++++++++++++++++++++++--------------------------- 7 files changed, 96 insertions(+), 99 deletions(-) (limited to 'api') diff --git a/api/category.go b/api/category.go index b8699e2..6343517 100644 --- a/api/category.go +++ b/api/category.go @@ -16,29 +16,28 @@ import ( func (c *Controller) CreateCategory(w http.ResponseWriter, r *http.Request) { category, err := decodeCategoryPayload(r.Body) if err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } userID := request.UserID(r) category.UserID = userID if err := category.ValidateCategoryCreation(); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } if c, err := c.store.CategoryByTitle(userID, category.Title); err != nil || c != nil { - json.BadRequest(w, errors.New("This category already exists")) + json.BadRequest(w, r, errors.New("This category already exists")) return } - err = c.store.CreateCategory(category) - if err != nil { - json.ServerError(w, err) + if err := c.store.CreateCategory(category); err != nil { + json.ServerError(w, r, err) return } - json.Created(w, category) + json.Created(w, r, category) } // UpdateCategory is the API handler to update a category. @@ -47,31 +46,31 @@ func (c *Controller) UpdateCategory(w http.ResponseWriter, r *http.Request) { category, err := decodeCategoryPayload(r.Body) if err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } category.UserID = request.UserID(r) category.ID = categoryID if err := category.ValidateCategoryModification(); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } err = c.store.UpdateCategory(category) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.Created(w, category) + json.Created(w, r, category) } // GetCategories is the API handler to get a list of categories for a given user. func (c *Controller) GetCategories(w http.ResponseWriter, r *http.Request) { categories, err := c.store.Categories(request.UserID(r)) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } @@ -84,14 +83,14 @@ func (c *Controller) RemoveCategory(w http.ResponseWriter, r *http.Request) { categoryID := request.RouteInt64Param(r, "categoryID") if !c.store.CategoryExists(userID, categoryID) { - json.NotFound(w, errors.New("Category not found")) + json.NotFound(w, r) return } if err := c.store.RemoveCategory(userID, categoryID); err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.NoContent(w) + json.NoContent(w, r) } diff --git a/api/entry.go b/api/entry.go index a1ea87f..c727785 100644 --- a/api/entry.go +++ b/api/entry.go @@ -26,12 +26,12 @@ func (c *Controller) GetFeedEntry(w http.ResponseWriter, r *http.Request) { entry, err := builder.GetEntry() if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } if entry == nil { - json.NotFound(w, errors.New("Entry not found")) + json.NotFound(w, r) return } @@ -46,12 +46,12 @@ func (c *Controller) GetEntry(w http.ResponseWriter, r *http.Request) { entry, err := builder.GetEntry() if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } if entry == nil { - json.NotFound(w, errors.New("Entry not found")) + json.NotFound(w, r) return } @@ -65,27 +65,27 @@ func (c *Controller) GetFeedEntries(w http.ResponseWriter, r *http.Request) { status := request.QueryStringParam(r, "status", "") if status != "" { if err := model.ValidateEntryStatus(status); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } } order := request.QueryStringParam(r, "order", model.DefaultSortingOrder) if err := model.ValidateEntryOrder(order); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } direction := request.QueryStringParam(r, "direction", model.DefaultSortingDirection) if err := model.ValidateDirection(direction); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } limit := request.QueryIntParam(r, "limit", 100) offset := request.QueryIntParam(r, "offset", 0) if err := model.ValidateRange(offset, limit); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } @@ -100,13 +100,13 @@ func (c *Controller) GetFeedEntries(w http.ResponseWriter, r *http.Request) { entries, err := builder.GetEntries() if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } count, err := builder.CountEntries() if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } @@ -118,27 +118,27 @@ func (c *Controller) GetEntries(w http.ResponseWriter, r *http.Request) { status := request.QueryStringParam(r, "status", "") if status != "" { if err := model.ValidateEntryStatus(status); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } } order := request.QueryStringParam(r, "order", model.DefaultSortingOrder) if err := model.ValidateEntryOrder(order); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } direction := request.QueryStringParam(r, "direction", model.DefaultSortingDirection) if err := model.ValidateDirection(direction); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } limit := request.QueryIntParam(r, "limit", 100) offset := request.QueryIntParam(r, "offset", 0) if err := model.ValidateRange(offset, limit); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } @@ -152,13 +152,13 @@ func (c *Controller) GetEntries(w http.ResponseWriter, r *http.Request) { entries, err := builder.GetEntries() if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } count, err := builder.CountEntries() if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } @@ -169,32 +169,32 @@ func (c *Controller) GetEntries(w http.ResponseWriter, r *http.Request) { func (c *Controller) SetEntryStatus(w http.ResponseWriter, r *http.Request) { entryIDs, status, err := decodeEntryStatusPayload(r.Body) if err != nil { - json.BadRequest(w, errors.New("Invalid JSON payload")) + json.BadRequest(w , r, errors.New("Invalid JSON payload")) return } if err := model.ValidateEntryStatus(status); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } if err := c.store.SetEntriesStatus(request.UserID(r), entryIDs, status); err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.NoContent(w) + json.NoContent(w, r) } // ToggleBookmark is the API handler to toggle bookmark status. func (c *Controller) ToggleBookmark(w http.ResponseWriter, r *http.Request) { entryID := request.RouteInt64Param(r, "entryID") if err := c.store.ToggleBookmark(request.UserID(r), entryID); err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.NoContent(w) + json.NoContent(w, r) } func configureFilters(builder *storage.EntryQueryBuilder, r *http.Request) { diff --git a/api/feed.go b/api/feed.go index d193d2e..914ba0d 100644 --- a/api/feed.go +++ b/api/feed.go @@ -16,29 +16,29 @@ import ( func (c *Controller) CreateFeed(w http.ResponseWriter, r *http.Request) { feedInfo, err := decodeFeedCreationPayload(r.Body) if err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } if feedInfo.FeedURL == "" { - json.BadRequest(w, errors.New("The feed_url is required")) + json.BadRequest(w, r, errors.New("The feed_url is required")) return } if feedInfo.CategoryID <= 0 { - json.BadRequest(w, errors.New("The category_id is required")) + json.BadRequest(w, r, errors.New("The category_id is required")) return } userID := request.UserID(r) if c.store.FeedURLExists(userID, feedInfo.FeedURL) { - json.BadRequest(w, errors.New("This feed_url already exists")) + json.BadRequest(w, r, errors.New("This feed_url already exists")) return } if !c.store.CategoryExists(userID, feedInfo.CategoryID) { - json.BadRequest(w, errors.New("This category_id doesn't exists or doesn't belongs to this user")) + json.BadRequest(w, r, errors.New("This category_id doesn't exists or doesn't belongs to this user")) return } @@ -52,7 +52,7 @@ func (c *Controller) CreateFeed(w http.ResponseWriter, r *http.Request) { feedInfo.Password, ) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } @@ -60,7 +60,7 @@ func (c *Controller) CreateFeed(w http.ResponseWriter, r *http.Request) { FeedID int64 `json:"feed_id"` } - json.Created(w, &result{FeedID: feed.ID}) + json.Created(w, r, &result{FeedID: feed.ID}) } // RefreshFeed is the API handler to refresh a feed. @@ -69,17 +69,17 @@ func (c *Controller) RefreshFeed(w http.ResponseWriter, r *http.Request) { userID := request.UserID(r) if !c.store.FeedExists(userID, feedID) { - json.NotFound(w, errors.New("Unable to find this feed")) + json.NotFound(w, r) return } err := c.feedHandler.RefreshFeed(userID, feedID) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.NoContent(w) + json.NoContent(w, r) } // UpdateFeed is the API handler that is used to update a feed. @@ -87,7 +87,7 @@ func (c *Controller) UpdateFeed(w http.ResponseWriter, r *http.Request) { feedID := request.RouteInt64Param(r, "feedID") feedChanges, err := decodeFeedModificationPayload(r.Body) if err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } @@ -95,41 +95,41 @@ func (c *Controller) UpdateFeed(w http.ResponseWriter, r *http.Request) { originalFeed, err := c.store.FeedByID(userID, feedID) if err != nil { - json.NotFound(w, errors.New("Unable to find this feed")) + json.NotFound(w, r) return } if originalFeed == nil { - json.NotFound(w, errors.New("Feed not found")) + json.NotFound(w, r) return } feedChanges.Update(originalFeed) if !c.store.CategoryExists(userID, originalFeed.Category.ID) { - json.BadRequest(w, errors.New("This category_id doesn't exists or doesn't belongs to this user")) + json.BadRequest(w, r, errors.New("This category_id doesn't exists or doesn't belongs to this user")) return } if err := c.store.UpdateFeed(originalFeed); err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } originalFeed, err = c.store.FeedByID(userID, feedID) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.Created(w, originalFeed) + json.Created(w, r, originalFeed) } // GetFeeds is the API handler that get all feeds that belongs to the given user. func (c *Controller) GetFeeds(w http.ResponseWriter, r *http.Request) { feeds, err := c.store.Feeds(request.UserID(r)) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } @@ -141,12 +141,12 @@ func (c *Controller) GetFeed(w http.ResponseWriter, r *http.Request) { feedID := request.RouteInt64Param(r, "feedID") feed, err := c.store.FeedByID(request.UserID(r), feedID) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } if feed == nil { - json.NotFound(w, errors.New("Feed not found")) + json.NotFound(w, r) return } @@ -159,14 +159,14 @@ func (c *Controller) RemoveFeed(w http.ResponseWriter, r *http.Request) { userID := request.UserID(r) if !c.store.FeedExists(userID, feedID) { - json.NotFound(w, errors.New("Feed not found")) + json.NotFound(w, r) return } if err := c.store.RemoveFeed(userID, feedID); err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.NoContent(w) + json.NoContent(w, r) } diff --git a/api/icon.go b/api/icon.go index de01fad..1954769 100644 --- a/api/icon.go +++ b/api/icon.go @@ -5,7 +5,6 @@ package api // import "miniflux.app/api" import ( - "errors" "net/http" "miniflux.app/http/request" @@ -17,18 +16,18 @@ func (c *Controller) FeedIcon(w http.ResponseWriter, r *http.Request) { feedID := request.RouteInt64Param(r, "feedID") if !c.store.HasIcon(feedID) { - json.NotFound(w, errors.New("This feed doesn't have any icon")) + json.NotFound(w, r) return } icon, err := c.store.IconByFeedID(request.UserID(r), feedID) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } if icon == nil { - json.NotFound(w, errors.New("This feed doesn't have any icon")) + json.NotFound(w, r) return } diff --git a/api/opml.go b/api/opml.go index eb214f3..199c0e7 100644 --- a/api/opml.go +++ b/api/opml.go @@ -18,11 +18,11 @@ func (c *Controller) Export(w http.ResponseWriter, r *http.Request) { opmlHandler := opml.NewHandler(c.store) opml, err := opmlHandler.Export(request.UserID(r)) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - xml.OK(w, opml) + xml.OK(w, r, opml) } // Import is the API handler that import an OPML file. @@ -31,9 +31,9 @@ func (c *Controller) Import(w http.ResponseWriter, r *http.Request) { err := opmlHandler.Import(request.UserID(r), r.Body) defer r.Body.Close() if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.Created(w, map[string]string{"message": "Feeds imported successfully"}) + json.Created(w, r, map[string]string{"message": "Feeds imported successfully"}) } diff --git a/api/subscription.go b/api/subscription.go index ff4c7cf..701759d 100644 --- a/api/subscription.go +++ b/api/subscription.go @@ -5,7 +5,6 @@ package api // import "miniflux.app/api" import ( - "fmt" "net/http" "miniflux.app/http/response/json" @@ -16,7 +15,7 @@ import ( func (c *Controller) GetSubscriptions(w http.ResponseWriter, r *http.Request) { subscriptionInfo, err := decodeURLPayload(r.Body) if err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } @@ -27,12 +26,12 @@ func (c *Controller) GetSubscriptions(w http.ResponseWriter, r *http.Request) { subscriptionInfo.Password, ) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } if subscriptions == nil { - json.NotFound(w, fmt.Errorf("No subscription found")) + json.NotFound(w, r) return } diff --git a/api/user.go b/api/user.go index b9274bb..db1e049 100644 --- a/api/user.go +++ b/api/user.go @@ -16,7 +16,7 @@ import ( func (c *Controller) CurrentUser(w http.ResponseWriter, r *http.Request) { user, err := c.store.UserByID(request.UserID(r)) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } @@ -26,85 +26,85 @@ func (c *Controller) CurrentUser(w http.ResponseWriter, r *http.Request) { // CreateUser is the API handler to create a new user. func (c *Controller) CreateUser(w http.ResponseWriter, r *http.Request) { if !request.IsAdminUser(r) { - json.Forbidden(w) + json.Forbidden(w, r) return } user, err := decodeUserCreationPayload(r.Body) if err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } if err := user.ValidateUserCreation(); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } if c.store.UserExists(user.Username) { - json.BadRequest(w, errors.New("This user already exists")) + json.BadRequest(w, r, errors.New("This user already exists")) return } err = c.store.CreateUser(user) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } user.Password = "" - json.Created(w, user) + json.Created(w, r, user) } // UpdateUser is the API handler to update the given user. func (c *Controller) UpdateUser(w http.ResponseWriter, r *http.Request) { if !request.IsAdminUser(r) { - json.Forbidden(w) + json.Forbidden(w, r) return } userID := request.RouteInt64Param(r, "userID") userChanges, err := decodeUserModificationPayload(r.Body) if err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } originalUser, err := c.store.UserByID(userID) if err != nil { - json.BadRequest(w, errors.New("Unable to fetch this user from the database")) + json.BadRequest(w, r, errors.New("Unable to fetch this user from the database")) return } if originalUser == nil { - json.NotFound(w, errors.New("User not found")) + json.NotFound(w, r) return } userChanges.Update(originalUser) if err := originalUser.ValidateUserModification(); err != nil { - json.BadRequest(w, err) + json.BadRequest(w, r, err) return } if err = c.store.UpdateUser(originalUser); err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } - json.Created(w, originalUser) + json.Created(w, r, originalUser) } // Users is the API handler to get the list of users. func (c *Controller) Users(w http.ResponseWriter, r *http.Request) { if !request.IsAdminUser(r) { - json.Forbidden(w) + json.Forbidden(w, r) return } users, err := c.store.Users() if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } @@ -115,19 +115,19 @@ func (c *Controller) Users(w http.ResponseWriter, r *http.Request) { // UserByID is the API handler to fetch the given user by the ID. func (c *Controller) UserByID(w http.ResponseWriter, r *http.Request) { if !request.IsAdminUser(r) { - json.Forbidden(w) + json.Forbidden(w, r) return } userID := request.RouteInt64Param(r, "userID") user, err := c.store.UserByID(userID) if err != nil { - json.BadRequest(w, errors.New("Unable to fetch this user from the database")) + json.BadRequest(w, r, errors.New("Unable to fetch this user from the database")) return } if user == nil { - json.NotFound(w, errors.New("User not found")) + json.NotFound(w, r) return } @@ -138,19 +138,19 @@ func (c *Controller) UserByID(w http.ResponseWriter, r *http.Request) { // UserByUsername is the API handler to fetch the given user by the username. func (c *Controller) UserByUsername(w http.ResponseWriter, r *http.Request) { if !request.IsAdminUser(r) { - json.Forbidden(w) + json.Forbidden(w, r) return } username := request.RouteStringParam(r, "username") user, err := c.store.UserByUsername(username) if err != nil { - json.BadRequest(w, errors.New("Unable to fetch this user from the database")) + json.BadRequest(w, r, errors.New("Unable to fetch this user from the database")) return } if user == nil { - json.NotFound(w, errors.New("User not found")) + json.NotFound(w, r) return } @@ -160,26 +160,26 @@ func (c *Controller) UserByUsername(w http.ResponseWriter, r *http.Request) { // RemoveUser is the API handler to remove an existing user. func (c *Controller) RemoveUser(w http.ResponseWriter, r *http.Request) { if !request.IsAdminUser(r) { - json.Forbidden(w) + json.Forbidden(w, r) return } userID := request.RouteInt64Param(r, "userID") user, err := c.store.UserByID(userID) if err != nil { - json.ServerError(w, err) + json.ServerError(w, r, err) return } if user == nil { - json.NotFound(w, errors.New("User not found")) + json.NotFound(w, r) return } if err := c.store.RemoveUser(user.ID); err != nil { - json.BadRequest(w, errors.New("Unable to remove this user from the database")) + json.BadRequest(w, r, errors.New("Unable to remove this user from the database")) return } - json.NoContent(w) + json.NoContent(w, r) } -- cgit v1.2.3