mirror of
https://github.com/miniflux/v2.git
synced 2024-09-28 05:11:51 +02:00
Add API parameter to filter entries by category
This commit is contained in:
parent
fad9ad2be4
commit
e878dca3d7
15
api/entry.go
15
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) {
|
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()
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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" {
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user