aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net>2019-11-17 22:53:11 -0800
committerGravatar Frédéric Guillot <fred@miniflux.net>2019-11-17 23:05:22 -0800
commite878dca3d74e1b8644d56e4f717b0a8e0362e888 (patch)
tree3a352dcc9a19244d7ff683f80a725cd28b21a471
parentfad9ad2be4fc800f8710e2a498cc8f536af8827c (diff)
Add API parameter to filter entries by category
-rw-r--r--api/entry.go15
-rw-r--r--client/core.go3
-rw-r--r--storage/entry_query_builder.go2
-rw-r--r--tests/entry_test.go36
-rw-r--r--tests/subscription_test.go4
-rw-r--r--tests/tests.go15
6 files changed, 58 insertions, 17 deletions
diff --git a/api/entry.go b/api/entry.go
index 3b948f6..f0a0f99 100644
--- a/api/entry.go
+++ b/api/entry.go
@@ -164,7 +164,7 @@ func (h *handler) getEntries(w http.ResponseWriter, r *http.Request) {
func (h *handler) setEntryStatus(w http.ResponseWriter, r *http.Request) {
entryIDs, status, err := decodeEntryStatusPayload(r.Body)
if err != nil {
- json.BadRequest(w , r, errors.New("Invalid JSON payload"))
+ json.BadRequest(w, r, errors.New("Invalid JSON payload"))
return
}
@@ -193,25 +193,30 @@ func (h *handler) toggleBookmark(w http.ResponseWriter, r *http.Request) {
func configureFilters(builder *storage.EntryQueryBuilder, r *http.Request) {
beforeEntryID := request.QueryInt64Param(r, "before_entry_id", 0)
- if beforeEntryID != 0 {
+ if beforeEntryID > 0 {
builder.BeforeEntryID(beforeEntryID)
}
afterEntryID := request.QueryInt64Param(r, "after_entry_id", 0)
- if afterEntryID != 0 {
+ if afterEntryID > 0 {
builder.AfterEntryID(afterEntryID)
}
beforeTimestamp := request.QueryInt64Param(r, "before", 0)
- if beforeTimestamp != 0 {
+ if beforeTimestamp > 0 {
builder.BeforeDate(time.Unix(beforeTimestamp, 0))
}
afterTimestamp := request.QueryInt64Param(r, "after", 0)
- if afterTimestamp != 0 {
+ if afterTimestamp > 0 {
builder.AfterDate(time.Unix(afterTimestamp, 0))
}
+ categoryID := request.QueryInt64Param(r, "category_id", 0)
+ if categoryID > 0 {
+ builder.WithCategoryID(categoryID)
+ }
+
if request.HasQueryParam(r, "starred") {
builder.WithStarred()
}
diff --git a/client/core.go b/client/core.go
index 91366e2..275f176 100644
--- a/client/core.go
+++ b/client/core.go
@@ -48,7 +48,7 @@ type UserModification struct {
// Users represents a list of users.
type Users []User
-// Category represents a category in the system.
+// Category represents a feed category.
type Category struct {
ID int64 `json:"id,omitempty"`
Title string `json:"title,omitempty"`
@@ -169,6 +169,7 @@ type Filter struct {
BeforeEntryID int64
AfterEntryID int64
Search string
+ CategoryID int64
}
// EntryResultSet represents the response when fetching entries.
diff --git a/storage/entry_query_builder.go b/storage/entry_query_builder.go
index 66f1d64..6f84987 100644
--- a/storage/entry_query_builder.go
+++ b/storage/entry_query_builder.go
@@ -103,7 +103,7 @@ func (e *EntryQueryBuilder) WithFeedID(feedID int64) *EntryQueryBuilder {
// WithCategoryID set the categoryID.
func (e *EntryQueryBuilder) WithCategoryID(categoryID int64) *EntryQueryBuilder {
- if categoryID != 0 {
+ if categoryID > 0 {
e.conditions = append(e.conditions, fmt.Sprintf("f.category_id = $%d", len(e.args)+1))
e.args = append(e.args, categoryID)
}
diff --git a/tests/entry_test.go b/tests/entry_test.go
index ba22bb9..fa887b0 100644
--- a/tests/entry_test.go
+++ b/tests/entry_test.go
@@ -93,6 +93,40 @@ func TestGetAllEntries(t *testing.T) {
}
}
+func TestFilterEntriesByCategory(t *testing.T) {
+ client := createClient(t)
+ category, err := client.CreateCategory("Test Filter by Category")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ feedID, err := client.CreateFeed(testFeedURL, category.ID)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if feedID == 0 {
+ t.Fatalf(`Invalid feed ID, got %q`, feedID)
+ }
+
+ results, err := client.Entries(&miniflux.Filter{CategoryID: category.ID})
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if results.Total == 0 {
+ t.Fatalf(`We should have more than one entry`)
+ }
+
+ if results.Entries[0].Feed.Category == nil {
+ t.Fatalf(`The entry feed category should not be nil`)
+ }
+
+ if results.Entries[0].Feed.Category.ID != category.ID {
+ t.Errorf(`Entries should be filtered by category_id=%d`, category.ID)
+ }
+}
+
func TestSearchEntries(t *testing.T) {
client := createClient(t)
categories, err := client.Categories()
@@ -100,7 +134,7 @@ func TestSearchEntries(t *testing.T) {
t.Fatal(err)
}
- feedID, err := client.CreateFeed("https://miniflux.app/feed.xml", categories[0].ID)
+ feedID, err := client.CreateFeed(testFeedURL, categories[0].ID)
if err != nil {
t.Fatal(err)
}
diff --git a/tests/subscription_test.go b/tests/subscription_test.go
index 5d98cc4..dd4d3d5 100644
--- a/tests/subscription_test.go
+++ b/tests/subscription_test.go
@@ -21,8 +21,8 @@ func TestDiscoverSubscriptions(t *testing.T) {
t.Fatalf(`Invalid number of subscriptions, got "%v" instead of "%v"`, len(subscriptions), 2)
}
- if subscriptions[0].Title != testFeedTitle {
- t.Fatalf(`Invalid feed title, got "%v" instead of "%v"`, subscriptions[0].Title, testFeedTitle)
+ if subscriptions[0].Title != testSubscriptionTitle {
+ t.Fatalf(`Invalid feed title, got "%v" instead of "%v"`, subscriptions[0].Title, testSubscriptionTitle)
}
if subscriptions[0].Type != "atom" {
diff --git a/tests/tests.go b/tests/tests.go
index 8183327..afc5ef0 100644
--- a/tests/tests.go
+++ b/tests/tests.go
@@ -15,13 +15,14 @@ import (
)
const (
- testBaseURL = "http://127.0.0.1:8080/"
- testAdminUsername = "admin"
- testAdminPassword = "test123"
- testStandardPassword = "secret"
- testFeedURL = "https://github.com/miniflux/miniflux/commits/master.atom"
- testFeedTitle = "Recent Commits to miniflux:master"
- testWebsiteURL = "https://github.com/miniflux/miniflux/commits/master"
+ testBaseURL = "http://127.0.0.1:8080/"
+ testAdminUsername = "admin"
+ testAdminPassword = "test123"
+ testStandardPassword = "secret"
+ testFeedURL = "https://miniflux.app/feed.xml"
+ testFeedTitle = "Miniflux"
+ testSubscriptionTitle = "Miniflux Releases"
+ testWebsiteURL = "https://miniflux.app/"
)
func getRandomUsername() string {