From c59398bf831c100893112e678fd45ebec5940827 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 10 Oct 2018 14:43:58 -0600 Subject: [PATCH] Allow get feed by tag --- main.go | 41 ++++++++++++++++++++++++++++++++++++++++- main_test.go | 19 +++++++++++++------ 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/main.go b/main.go index 7a1b90f..8cd3739 100644 --- a/main.go +++ b/main.go @@ -130,7 +130,46 @@ func core() { return item.Content, nil }, func(tag string) (string, error) { - return "", errors.New("not implemented") + feedNames, err := sclient.List(nsForFeeds, "", false, -1) + if err != nil { + return "", err + } + combinedItems := []*rss.Item{} + for _, feedName := range feedNames { + b, err := sclient.Get(nsForFeeds, feedName) + if err != nil { + return "", err + } + feed, err := rss.Deserialize(b) + if err != nil { + return "", err + } + for i := range feed.Tags { + if feed.Tags[i] == tag { + itemKeys, err := sclient.List(feed.ID(), "", false, 20) // TODO variable, or pick most recent n or something + if err != nil { + return "", err + } + for i := range itemKeys { + b, err := sclient.Get(feed.ID(), itemKeys[i]) + if err != nil { + return "", errors.New("cannot get feed item " + itemKeys[i]) + } + item, err := rss.DeserializeItem(b) + if err != nil { + return "", errors.New("cannot deserialize feed item" + itemKeys[i]) + } + combinedItems = append(combinedItems, item) + } + break + } + } + } + combinedFeed, err := rss.New(tag, "", "", nil, time.Minute) + if err != nil { + return "", err + } + return rss.ToRSS(combinedFeed, combinedItems) }, ) if err != nil { diff --git a/main_test.go b/main_test.go index e589a34..0820d8f 100644 --- a/main_test.go +++ b/main_test.go @@ -18,6 +18,7 @@ func Test_Core(t *testing.T) { server := httptest.NewUnstartedServer(nil) server.Close() + var rssserverURL *string rssserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/feed" { fmt.Fprintln(w, @@ -25,17 +26,17 @@ func Test_Core(t *testing.T) { fake.com - /feed + `+*rssserverURL+`/feed this is fake title A - /itemA + `+*rssserverURL+`/itemA Wed, 10 Oct 2018 04:00:00 -0000 title B - /itemB + `+*rssserverURL+`/itemB content B Wed, 10 Oct 2018 04:00:00 -0000 @@ -51,6 +52,7 @@ func Test_Core(t *testing.T) { } })) defer server.Close() + rssserverURL = &rssserver.URL wasDBPath := os.Getenv("DBPATH") wasPort := os.Getenv("PORT") @@ -82,7 +84,7 @@ func Test_Core(t *testing.T) { { method: "post", path: "api/feed", - body: `{"url":"` + rssserver.URL + `/feed", "refresh":"30m", "items":"[AB]", "content":"2"}`, + body: `{"url":"` + rssserver.URL + `/feed", "refresh":"30m", "items":"[AB]", "content":"2", "tags": ["gotest"]}`, status: 200, post: func() { time.Sleep(time.Second * 10) }, }, @@ -95,7 +97,12 @@ func Test_Core(t *testing.T) { { method: "get", path: "api/feed/item", - body: "http___127_0_0_1_" + strings.Split(rssserver.URL, ":")[2] + "_feed.20181010__itemB", + body: "http___127_0_0_1_" + strings.Split(rssserver.URL, ":")[2] + "_feed.20181010_http___127_0_0_1_" + strings.Split(rssserver.URL, ":")[2] + "_itemB", + status: 200, + }, + { + method: "get", + path: "api/feed/tag?url=gotest", status: 200, }, { @@ -134,7 +141,7 @@ func Test_Core(t *testing.T) { } else if b, err := ioutil.ReadAll(resp.Body); err != nil { t.Errorf("cannot read body on %s to %s: %v", c.method, loc.String(), err) } else { - t.Logf("resp body: %s", b) + t.Logf("%s resp body: %s", loc.String(), b) } if c.post != nil { c.post()