From 71bf7e43580377a9bb98c6444c32e95b53602f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Guillot?= Date: Fri, 24 Nov 2017 22:29:20 -0800 Subject: [PATCH] Improve API --- locale/translations.go | 7 +++--- locale/translations/fr_FR.json | 3 ++- model/feed.go | 2 +- reader/feed/handler.go | 15 ++++++++---- reader/http/client.go | 2 +- server/api/controller/entry.go | 44 +++++----------------------------- server/api/payload/payload.go | 12 ++++++---- server/routes.go | 2 +- server/static/bin.go | 2 +- server/static/css.go | 2 +- server/static/js.go | 2 +- server/template/common.go | 2 +- server/template/views.go | 2 +- sql/sql.go | 2 +- storage/feed.go | 4 ++-- 15 files changed, 40 insertions(+), 63 deletions(-) diff --git a/locale/translations.go b/locale/translations.go index dffced48..a5d2d78f 100644 --- a/locale/translations.go +++ b/locale/translations.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-24 16:04:49.318661623 -0800 PST m=+0.006828741 +// 2017-11-24 21:40:33.354922728 -0800 PST m=+0.035838197 package locale @@ -148,12 +148,13 @@ var Translations = map[string]string{ "Refresh all feeds in the background": "Actualiser tous les abonnements en arrière-plan", "Sign in with Google": "Se connecter avec Google", "Unlink my Google account": "Dissocier mon compte Google", - "Link my Google account": "Associer mon compte Google" + "Link my Google account": "Associer mon compte Google", + "Category not found for this user.": "Cette catégorie n'existe pas pour cet utilisateur." } `, } var TranslationsChecksums = map[string]string{ "en_US": "6fe95384260941e8a5a3c695a655a932e0a8a6a572c1e45cb2b1ae8baa01b897", - "fr_FR": "f438ed9116ecc7b71412581255dd9b1332cacd9e2876615b03ec65e4b500bf02", + "fr_FR": "92b360ebbfae5c243897c05f7869e6bef0129a2c8275b6802fbaba0d05410e91", } diff --git a/locale/translations/fr_FR.json b/locale/translations/fr_FR.json index e5b7eb15..01ad8fb9 100644 --- a/locale/translations/fr_FR.json +++ b/locale/translations/fr_FR.json @@ -132,5 +132,6 @@ "Refresh all feeds in the background": "Actualiser tous les abonnements en arrière-plan", "Sign in with Google": "Se connecter avec Google", "Unlink my Google account": "Dissocier mon compte Google", - "Link my Google account": "Associer mon compte Google" + "Link my Google account": "Associer mon compte Google", + "Category not found for this user.": "Cette catégorie n'existe pas pour cet utilisateur." } diff --git a/model/feed.go b/model/feed.go index 17a9b258..dbdb9d6a 100644 --- a/model/feed.go +++ b/model/feed.go @@ -10,7 +10,7 @@ import ( "time" ) -// Feed represents a feed in the database +// Feed represents a feed in the database. type Feed struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` diff --git a/reader/feed/handler.go b/reader/feed/handler.go index c046ad98..c6dc4487 100644 --- a/reader/feed/handler.go +++ b/reader/feed/handler.go @@ -18,11 +18,12 @@ import ( ) var ( - errRequestFailed = "Unable to execute request: %v" - errServerFailure = "Unable to fetch feed (statusCode=%d)." - errDuplicate = "This feed already exists (%s)." - errNotFound = "Feed %d not found" - errEncoding = "Unable to normalize encoding: %v." + errRequestFailed = "Unable to execute request: %v" + errServerFailure = "Unable to fetch feed (statusCode=%d)." + errDuplicate = "This feed already exists (%s)." + errNotFound = "Feed %d not found" + errEncoding = "Unable to normalize encoding: %v." + errCategoryNotFound = "Category not found for this user." ) // Handler contains all the logic to create and refresh feeds. @@ -34,6 +35,10 @@ type Handler struct { func (h *Handler) CreateFeed(userID, categoryID int64, url string) (*model.Feed, error) { defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Handler:CreateFeed] feedUrl=%s", url)) + if !h.store.CategoryExists(userID, categoryID) { + return nil, errors.NewLocalizedError(errCategoryNotFound) + } + client := http.NewClient(url) response, err := client.Get() if err != nil { diff --git a/reader/http/client.go b/reader/http/client.go index 5245e415..de0558cf 100644 --- a/reader/http/client.go +++ b/reader/http/client.go @@ -33,7 +33,7 @@ func (h *Client) Get() (*Response, error) { req := &http.Request{ URL: u, - Method: "GET", + Method: http.MethodGet, Header: h.buildHeaders(), } diff --git a/server/api/controller/entry.go b/server/api/controller/entry.go index 54d52ba5..f5833783 100644 --- a/server/api/controller/entry.go +++ b/server/api/controller/entry.go @@ -6,6 +6,7 @@ package api import ( "errors" + "github.com/miniflux/miniflux2/model" "github.com/miniflux/miniflux2/server/api/payload" "github.com/miniflux/miniflux2/server/core" @@ -99,23 +100,11 @@ func (c *Controller) GetFeedEntries(ctx *core.Context, request *core.Request, re response.JSON().Standard(&payload.EntriesResponse{Total: count, Entries: entries}) } -// SetEntryStatus is the API handler to change the status of an entry. +// SetEntryStatus is the API handler to change the status of entries. func (c *Controller) SetEntryStatus(ctx *core.Context, request *core.Request, response *core.Response) { userID := ctx.UserID() - feedID, err := request.IntegerParam("feedID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - entryID, err := request.IntegerParam("entryID") - if err != nil { - response.JSON().BadRequest(err) - return - } - - status, err := payload.DecodeEntryStatusPayload(request.Body()) + entryIDs, status, err := payload.DecodeEntryStatusPayload(request.Body()) if err != nil { response.JSON().BadRequest(errors.New("Invalid JSON payload")) return @@ -126,31 +115,10 @@ func (c *Controller) SetEntryStatus(ctx *core.Context, request *core.Request, re return } - builder := c.store.GetEntryQueryBuilder(userID, ctx.UserTimezone()) - builder.WithFeedID(feedID) - builder.WithEntryID(entryID) - - entry, err := builder.GetEntry() - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch this entry from the database")) + if err := c.store.SetEntriesStatus(userID, entryIDs, status); err != nil { + response.JSON().ServerError(errors.New("Unable to change entries status")) return } - if entry == nil { - response.JSON().NotFound(errors.New("Entry not found")) - return - } - - if err := c.store.SetEntriesStatus(userID, []int64{entry.ID}, status); err != nil { - response.JSON().ServerError(errors.New("Unable to change entry status")) - return - } - - entry, err = builder.GetEntry() - if err != nil { - response.JSON().ServerError(errors.New("Unable to fetch this entry from the database")) - return - } - - response.JSON().Standard(entry) + response.JSON().NoContent() } diff --git a/server/api/payload/payload.go b/server/api/payload/payload.go index e26f9fc0..4fbc16e0 100644 --- a/server/api/payload/payload.go +++ b/server/api/payload/payload.go @@ -7,8 +7,9 @@ package payload import ( "encoding/json" "fmt" - "github.com/miniflux/miniflux2/model" "io" + + "github.com/miniflux/miniflux2/model" ) type EntriesResponse struct { @@ -41,18 +42,19 @@ func DecodeURLPayload(data io.Reader) (string, error) { return p.URL, nil } -func DecodeEntryStatusPayload(data io.Reader) (string, error) { +func DecodeEntryStatusPayload(data io.Reader) ([]int64, string, error) { type payload struct { - Status string `json:"status"` + EntryIDs []int64 `json:"entry_ids"` + Status string `json:"status"` } var p payload decoder := json.NewDecoder(data) if err := decoder.Decode(&p); err != nil { - return "", fmt.Errorf("invalid JSON payload: %v", err) + return nil, "", fmt.Errorf("invalid JSON payload: %v", err) } - return p.Status, nil + return p.EntryIDs, p.Status, nil } func DecodeFeedCreationPayload(data io.Reader) (string, int64, error) { diff --git a/server/routes.go b/server/routes.go index b6bcbc25..728e4ad6 100644 --- a/server/routes.go +++ b/server/routes.go @@ -62,7 +62,7 @@ func getRoutes(cfg *config.Config, store *storage.Storage, feedHandler *feed.Han router.Handle("/v1/feeds/{feedID}/entries", apiHandler.Use(apiController.GetFeedEntries)).Methods("GET") router.Handle("/v1/feeds/{feedID}/entries/{entryID}", apiHandler.Use(apiController.GetEntry)).Methods("GET") - router.Handle("/v1/feeds/{feedID}/entries/{entryID}", apiHandler.Use(apiController.SetEntryStatus)).Methods("PUT") + router.Handle("/v1/entries", apiHandler.Use(apiController.SetEntryStatus)).Methods("PUT") router.Handle("/stylesheets/{name}.css", uiHandler.Use(uiController.Stylesheet)).Name("stylesheet").Methods("GET") router.Handle("/js", uiHandler.Use(uiController.Javascript)).Name("javascript").Methods("GET") diff --git a/server/static/bin.go b/server/static/bin.go index 8769862d..ebd18889 100644 --- a/server/static/bin.go +++ b/server/static/bin.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-24 16:04:49.314940117 -0800 PST m=+0.003107235 +// 2017-11-24 21:40:33.326996526 -0800 PST m=+0.007911995 package static diff --git a/server/static/css.go b/server/static/css.go index 096fc5c9..7b7d2bbd 100644 --- a/server/static/css.go +++ b/server/static/css.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-24 16:04:49.315340301 -0800 PST m=+0.003507419 +// 2017-11-24 21:40:33.330122316 -0800 PST m=+0.011037785 package static diff --git a/server/static/js.go b/server/static/js.go index 28eed6a1..627cd55a 100644 --- a/server/static/js.go +++ b/server/static/js.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-24 16:04:49.316027642 -0800 PST m=+0.004194760 +// 2017-11-24 21:40:33.333049571 -0800 PST m=+0.013965040 package static diff --git a/server/template/common.go b/server/template/common.go index 40fb76ae..00a6a7c4 100644 --- a/server/template/common.go +++ b/server/template/common.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-24 16:04:49.318279667 -0800 PST m=+0.006446785 +// 2017-11-24 21:40:33.353262943 -0800 PST m=+0.034178412 package template diff --git a/server/template/views.go b/server/template/views.go index d82ab0a8..6a55528f 100644 --- a/server/template/views.go +++ b/server/template/views.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-24 16:04:49.316644027 -0800 PST m=+0.004811145 +// 2017-11-24 21:40:33.335450873 -0800 PST m=+0.016366342 package template diff --git a/sql/sql.go b/sql/sql.go index b8c0419d..f1f5d356 100644 --- a/sql/sql.go +++ b/sql/sql.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-24 16:04:49.314265268 -0800 PST m=+0.002432386 +// 2017-11-24 21:40:33.323320501 -0800 PST m=+0.004235970 package sql diff --git a/storage/feed.go b/storage/feed.go index 0fab4817..ae67db28 100644 --- a/storage/feed.go +++ b/storage/feed.go @@ -143,7 +143,7 @@ func (s *Storage) GetFeedById(userID, feedID int64) (*model.Feed, error) { case err == sql.ErrNoRows: return nil, nil case err != nil: - return nil, fmt.Errorf("Unable to fetch feed: %v", err) + return nil, fmt.Errorf("unable to fetch feed: %v", err) } return &feed, nil @@ -170,7 +170,7 @@ func (s *Storage) CreateFeed(feed *model.Feed) error { ).Scan(&feed.ID) if err != nil { - return fmt.Errorf("Unable to create feed: %v", err) + return fmt.Errorf("unable to create feed: %v", err) } for i := 0; i < len(feed.Entries); i++ {