Add API parameter to filter entries by category

This commit is contained in:
Frédéric Guillot 2019-11-17 22:53:11 -08:00
parent fad9ad2be4
commit e878dca3d7
6 changed files with 58 additions and 17 deletions

View File

@ -164,7 +164,7 @@ func (h *handler) getEntries(w http.ResponseWriter, r *http.Request) {
func (h *handler) setEntryStatus(w http.ResponseWriter, r *http.Request) { func (h *handler) setEntryStatus(w http.ResponseWriter, r *http.Request) {
entryIDs, status, err := decodeEntryStatusPayload(r.Body) entryIDs, status, err := decodeEntryStatusPayload(r.Body)
if err != nil { if err != nil {
json.BadRequest(w , r, errors.New("Invalid JSON payload")) json.BadRequest(w, r, errors.New("Invalid JSON payload"))
return return
} }
@ -193,25 +193,30 @@ func (h *handler) toggleBookmark(w http.ResponseWriter, r *http.Request) {
func configureFilters(builder *storage.EntryQueryBuilder, r *http.Request) { func configureFilters(builder *storage.EntryQueryBuilder, r *http.Request) {
beforeEntryID := request.QueryInt64Param(r, "before_entry_id", 0) beforeEntryID := request.QueryInt64Param(r, "before_entry_id", 0)
if beforeEntryID != 0 { if beforeEntryID > 0 {
builder.BeforeEntryID(beforeEntryID) builder.BeforeEntryID(beforeEntryID)
} }
afterEntryID := request.QueryInt64Param(r, "after_entry_id", 0) afterEntryID := request.QueryInt64Param(r, "after_entry_id", 0)
if afterEntryID != 0 { if afterEntryID > 0 {
builder.AfterEntryID(afterEntryID) builder.AfterEntryID(afterEntryID)
} }
beforeTimestamp := request.QueryInt64Param(r, "before", 0) beforeTimestamp := request.QueryInt64Param(r, "before", 0)
if beforeTimestamp != 0 { if beforeTimestamp > 0 {
builder.BeforeDate(time.Unix(beforeTimestamp, 0)) builder.BeforeDate(time.Unix(beforeTimestamp, 0))
} }
afterTimestamp := request.QueryInt64Param(r, "after", 0) afterTimestamp := request.QueryInt64Param(r, "after", 0)
if afterTimestamp != 0 { if afterTimestamp > 0 {
builder.AfterDate(time.Unix(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") { if request.HasQueryParam(r, "starred") {
builder.WithStarred() builder.WithStarred()
} }

View File

@ -48,7 +48,7 @@ type UserModification struct {
// Users represents a list of users. // Users represents a list of users.
type Users []User type Users []User
// Category represents a category in the system. // Category represents a feed category.
type Category struct { type Category struct {
ID int64 `json:"id,omitempty"` ID int64 `json:"id,omitempty"`
Title string `json:"title,omitempty"` Title string `json:"title,omitempty"`
@ -169,6 +169,7 @@ type Filter struct {
BeforeEntryID int64 BeforeEntryID int64
AfterEntryID int64 AfterEntryID int64
Search string Search string
CategoryID int64
} }
// EntryResultSet represents the response when fetching entries. // EntryResultSet represents the response when fetching entries.

View File

@ -103,7 +103,7 @@ func (e *EntryQueryBuilder) WithFeedID(feedID int64) *EntryQueryBuilder {
// WithCategoryID set the categoryID. // WithCategoryID set the categoryID.
func (e *EntryQueryBuilder) WithCategoryID(categoryID int64) *EntryQueryBuilder { 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.conditions = append(e.conditions, fmt.Sprintf("f.category_id = $%d", len(e.args)+1))
e.args = append(e.args, categoryID) e.args = append(e.args, categoryID)
} }

View File

@ -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) { func TestSearchEntries(t *testing.T) {
client := createClient(t) client := createClient(t)
categories, err := client.Categories() categories, err := client.Categories()
@ -100,7 +134,7 @@ func TestSearchEntries(t *testing.T) {
t.Fatal(err) 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 { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -21,8 +21,8 @@ func TestDiscoverSubscriptions(t *testing.T) {
t.Fatalf(`Invalid number of subscriptions, got "%v" instead of "%v"`, len(subscriptions), 2) t.Fatalf(`Invalid number of subscriptions, got "%v" instead of "%v"`, len(subscriptions), 2)
} }
if subscriptions[0].Title != testFeedTitle { if subscriptions[0].Title != testSubscriptionTitle {
t.Fatalf(`Invalid feed title, got "%v" instead of "%v"`, subscriptions[0].Title, testFeedTitle) t.Fatalf(`Invalid feed title, got "%v" instead of "%v"`, subscriptions[0].Title, testSubscriptionTitle)
} }
if subscriptions[0].Type != "atom" { if subscriptions[0].Type != "atom" {

View File

@ -15,13 +15,14 @@ import (
) )
const ( const (
testBaseURL = "http://127.0.0.1:8080/" testBaseURL = "http://127.0.0.1:8080/"
testAdminUsername = "admin" testAdminUsername = "admin"
testAdminPassword = "test123" testAdminPassword = "test123"
testStandardPassword = "secret" testStandardPassword = "secret"
testFeedURL = "https://github.com/miniflux/miniflux/commits/master.atom" testFeedURL = "https://miniflux.app/feed.xml"
testFeedTitle = "Recent Commits to miniflux:master" testFeedTitle = "Miniflux"
testWebsiteURL = "https://github.com/miniflux/miniflux/commits/master" testSubscriptionTitle = "Miniflux Releases"
testWebsiteURL = "https://miniflux.app/"
) )
func getRandomUsername() string { func getRandomUsername() string {