diff options
Diffstat (limited to 'internal/api')
-rw-r--r-- | internal/api/api.go | 1 | ||||
-rw-r--r-- | internal/api/entry.go | 55 |
2 files changed, 55 insertions, 1 deletions
diff --git a/internal/api/api.go b/internal/api/api.go index e00e8272..d6a36376 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -63,6 +63,7 @@ func Serve(router *mux.Router, store *storage.Storage, pool *worker.Pool) { sr.HandleFunc("/entries", handler.getEntries).Methods(http.MethodGet) sr.HandleFunc("/entries", handler.setEntryStatus).Methods(http.MethodPut) sr.HandleFunc("/entries/{entryID}", handler.getEntry).Methods(http.MethodGet) + sr.HandleFunc("/entries/{entryID}", handler.updateEntry).Methods(http.MethodPut) sr.HandleFunc("/entries/{entryID}/bookmark", handler.toggleBookmark).Methods(http.MethodPut) sr.HandleFunc("/entries/{entryID}/save", handler.saveEntry).Methods(http.MethodPost) sr.HandleFunc("/entries/{entryID}/fetch-content", handler.fetchContent).Methods(http.MethodGet) diff --git a/internal/api/entry.go b/internal/api/entry.go index e6c00e3a..2af2b3c7 100644 --- a/internal/api/entry.go +++ b/internal/api/entry.go @@ -18,6 +18,7 @@ import ( "miniflux.app/v2/internal/model" "miniflux.app/v2/internal/proxy" "miniflux.app/v2/internal/reader/processor" + "miniflux.app/v2/internal/reader/readingtime" "miniflux.app/v2/internal/storage" "miniflux.app/v2/internal/urllib" "miniflux.app/v2/internal/validator" @@ -232,6 +233,58 @@ func (h *handler) saveEntry(w http.ResponseWriter, r *http.Request) { json.Accepted(w, r) } +func (h *handler) updateEntry(w http.ResponseWriter, r *http.Request) { + var entryUpdateRequest model.EntryUpdateRequest + if err := json_parser.NewDecoder(r.Body).Decode(&entryUpdateRequest); err != nil { + json.BadRequest(w, r, err) + return + } + + if err := validator.ValidateEntryModification(&entryUpdateRequest); err != nil { + json.BadRequest(w, r, err) + return + } + + loggedUserID := request.UserID(r) + entryID := request.RouteInt64Param(r, "entryID") + + entryBuilder := h.store.NewEntryQueryBuilder(loggedUserID) + entryBuilder.WithEntryID(entryID) + entryBuilder.WithoutStatus(model.EntryStatusRemoved) + + entry, err := entryBuilder.GetEntry() + if err != nil { + json.ServerError(w, r, err) + return + } + + if entry == nil { + json.NotFound(w, r) + return + } + + user, err := h.store.UserByID(loggedUserID) + if err != nil { + json.ServerError(w, r, err) + return + } + + if user == nil { + json.NotFound(w, r) + return + } + + entryUpdateRequest.Patch(entry) + entry.ReadingTime = readingtime.EstimateReadingTime(entry.Content, user.DefaultReadingSpeed, user.CJKReadingSpeed) + + if err := h.store.UpdateEntryTitleAndContent(entry); err != nil { + json.ServerError(w, r, err) + return + } + + json.Created(w, r, entry) +} + func (h *handler) fetchContent(w http.ResponseWriter, r *http.Request) { loggedUserID := request.UserID(r) entryID := request.RouteInt64Param(r, "entryID") @@ -251,7 +304,7 @@ func (h *handler) fetchContent(w http.ResponseWriter, r *http.Request) { return } - user, err := h.store.UserByID(entry.UserID) + user, err := h.store.UserByID(loggedUserID) if err != nil { json.ServerError(w, r, err) return |