aboutsummaryrefslogtreecommitdiff
path: root/internal/api
diff options
context:
space:
mode:
Diffstat (limited to 'internal/api')
-rw-r--r--internal/api/api.go2
-rw-r--r--internal/api/api_integration_test.go112
-rw-r--r--internal/api/enclosure.go80
-rw-r--r--internal/api/entry.go17
4 files changed, 196 insertions, 15 deletions
diff --git a/internal/api/api.go b/internal/api/api.go
index 2963a990..1109acda 100644
--- a/internal/api/api.go
+++ b/internal/api/api.go
@@ -72,6 +72,8 @@ func Serve(router *mux.Router, store *storage.Storage, pool *worker.Pool) {
sr.HandleFunc("/entries/{entryID}/fetch-content", handler.fetchContent).Methods(http.MethodGet)
sr.HandleFunc("/flush-history", handler.flushHistory).Methods(http.MethodPut, http.MethodDelete)
sr.HandleFunc("/icons/{iconID}", handler.getIconByIconID).Methods(http.MethodGet)
+ sr.HandleFunc("/enclosures/{enclosureID}", handler.getEnclosureById).Methods(http.MethodGet)
+ sr.HandleFunc("/enclosures/{enclosureID}", handler.updateEnclosureById).Methods(http.MethodPut)
sr.HandleFunc("/version", handler.versionHandler).Methods(http.MethodGet)
}
diff --git a/internal/api/api_integration_test.go b/internal/api/api_integration_test.go
index c4bef142..3fd98119 100644
--- a/internal/api/api_integration_test.go
+++ b/internal/api/api_integration_test.go
@@ -2044,6 +2044,118 @@ func TestGetGlobalEntriesEndpoint(t *testing.T) {
}
}
+func TestUpdateEnclosureEndpoint(t *testing.T) {
+ testConfig := newIntegrationTestConfig()
+ if !testConfig.isConfigured() {
+ t.Skip(skipIntegrationTestsMessage)
+ }
+
+ adminClient := miniflux.NewClient(testConfig.testBaseURL, testConfig.testAdminUsername, testConfig.testAdminPassword)
+
+ regularTestUser, err := adminClient.CreateUser(testConfig.genRandomUsername(), testConfig.testRegularPassword, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer adminClient.DeleteUser(regularTestUser.ID)
+
+ regularUserClient := miniflux.NewClient(testConfig.testBaseURL, regularTestUser.Username, testConfig.testRegularPassword)
+
+ feedID, err := regularUserClient.CreateFeed(&miniflux.FeedCreationRequest{
+ FeedURL: testConfig.testFeedURL,
+ })
+
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ result, err := regularUserClient.FeedEntries(feedID, nil)
+ if err != nil {
+ t.Fatalf(`Failed to get entries: %v`, err)
+ }
+
+ var enclosure *miniflux.Enclosure
+
+ for _, entry := range result.Entries {
+ if len(entry.Enclosures) > 0 {
+ enclosure = entry.Enclosures[0]
+ break
+ }
+ }
+
+ if enclosure == nil {
+ t.Skip(`Skipping test, missing enclosure in feed.`)
+ }
+
+ err = regularUserClient.UpdateEnclosure(enclosure.ID, &miniflux.EnclosureUpdateRequest{
+ MediaProgression: 20,
+ })
+
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ updatedEnclosure, err := regularUserClient.Enclosure(enclosure.ID)
+
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if updatedEnclosure.MediaProgression != 20 {
+ t.Fatalf(`Failed to update media_progression, expected %d but got %d`, 20, updatedEnclosure.MediaProgression)
+ }
+}
+
+func TestGetEnclosureEndpoint(t *testing.T) {
+ testConfig := newIntegrationTestConfig()
+ if !testConfig.isConfigured() {
+ t.Skip(skipIntegrationTestsMessage)
+ }
+
+ adminClient := miniflux.NewClient(testConfig.testBaseURL, testConfig.testAdminUsername, testConfig.testAdminPassword)
+
+ regularTestUser, err := adminClient.CreateUser(testConfig.genRandomUsername(), testConfig.testRegularPassword, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer adminClient.DeleteUser(regularTestUser.ID)
+
+ regularUserClient := miniflux.NewClient(testConfig.testBaseURL, regularTestUser.Username, testConfig.testRegularPassword)
+
+ feedID, err := regularUserClient.CreateFeed(&miniflux.FeedCreationRequest{
+ FeedURL: testConfig.testFeedURL,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ result, err := regularUserClient.FeedEntries(feedID, nil)
+ if err != nil {
+ t.Fatalf(`Failed to get entries: %v`, err)
+ }
+
+ var expectedEnclosure *miniflux.Enclosure
+
+ for _, entry := range result.Entries {
+ if len(entry.Enclosures) > 0 {
+ expectedEnclosure = entry.Enclosures[0]
+ break
+ }
+ }
+
+ if expectedEnclosure == nil {
+ t.Skip(`Skipping test, missing enclosure in feed.`)
+ }
+
+ enclosure, err := regularUserClient.Enclosure(expectedEnclosure.ID)
+
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if enclosure.ID != expectedEnclosure.ID {
+ t.Fatalf(`Invalid enclosureID, got %d while expecting %d`, enclosure.ID, expectedEnclosure.ID)
+ }
+}
func TestGetEntryEndpoints(t *testing.T) {
testConfig := newIntegrationTestConfig()
if !testConfig.isConfigured() {
diff --git a/internal/api/enclosure.go b/internal/api/enclosure.go
new file mode 100644
index 00000000..45222b33
--- /dev/null
+++ b/internal/api/enclosure.go
@@ -0,0 +1,80 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package api // import "miniflux.app/v2/internal/api"
+
+import (
+ json_parser "encoding/json"
+ "net/http"
+
+ "miniflux.app/v2/internal/http/request"
+ "miniflux.app/v2/internal/http/response/json"
+ "miniflux.app/v2/internal/model"
+ "miniflux.app/v2/internal/validator"
+)
+
+func (h *handler) getEnclosureById(w http.ResponseWriter, r *http.Request) {
+ enclosureID := request.RouteInt64Param(r, "enclosureID")
+
+ enclosure, err := h.store.GetEnclosure(enclosureID)
+
+ if err != nil {
+ json.NotFound(w, r)
+ return
+ }
+
+ userID := request.UserID(r)
+
+ if enclosure.UserID != userID {
+ json.NotFound(w, r)
+ return
+ }
+
+ enclosure.ProxifyEnclosureURL(h.router)
+
+ json.OK(w, r, enclosure)
+}
+
+func (h *handler) updateEnclosureById(w http.ResponseWriter, r *http.Request) {
+ enclosureID := request.RouteInt64Param(r, "enclosureID")
+
+ var enclosureUpdateRequest model.EnclosureUpdateRequest
+
+ if err := json_parser.NewDecoder(r.Body).Decode(&enclosureUpdateRequest); err != nil {
+ json.BadRequest(w, r, err)
+ return
+ }
+
+ if err := validator.ValidateEnclosureUpdateRequest(&enclosureUpdateRequest); err != nil {
+ json.BadRequest(w, r, err)
+ return
+ }
+
+ enclosure, err := h.store.GetEnclosure(enclosureID)
+
+ if err != nil {
+ json.BadRequest(w, r, err)
+ return
+ }
+
+ if enclosure == nil {
+ json.NotFound(w, r)
+ return
+ }
+
+ userID := request.UserID(r)
+
+ if enclosure.UserID != userID {
+ json.NotFound(w, r)
+ return
+ }
+
+ enclosure.MediaProgression = enclosureUpdateRequest.MediaProgression
+
+ if err := h.store.UpdateEnclosure(enclosure); err != nil {
+ json.ServerError(w, r, err)
+ return
+ }
+
+ json.NoContent(w, r)
+}
diff --git a/internal/api/entry.go b/internal/api/entry.go
index 121d2701..508bbee4 100644
--- a/internal/api/entry.go
+++ b/internal/api/entry.go
@@ -8,10 +8,8 @@ import (
"errors"
"net/http"
"strconv"
- "strings"
"time"
- "miniflux.app/v2/internal/config"
"miniflux.app/v2/internal/http/request"
"miniflux.app/v2/internal/http/response/json"
"miniflux.app/v2/internal/integration"
@@ -20,7 +18,6 @@ import (
"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"
)
@@ -37,18 +34,8 @@ func (h *handler) getEntryFromBuilder(w http.ResponseWriter, r *http.Request, b
}
entry.Content = mediaproxy.RewriteDocumentWithAbsoluteProxyURL(h.router, entry.Content)
- proxyOption := config.Opts.MediaProxyMode()
-
- for i := range entry.Enclosures {
- if proxyOption == "all" || proxyOption != "none" && !urllib.IsHTTPS(entry.Enclosures[i].URL) {
- for _, mediaType := range config.Opts.MediaProxyResourceTypes() {
- if strings.HasPrefix(entry.Enclosures[i].MimeType, mediaType+"/") {
- entry.Enclosures[i].URL = mediaproxy.ProxifyAbsoluteURL(h.router, entry.Enclosures[i].URL)
- break
- }
- }
- }
- }
+
+ entry.Enclosures.ProxifyEnclosureURL(h.router)
json.OK(w, r, entry)
}