Allow get feed by tag

master
Bel LaPointe 2018-10-10 14:43:58 -06:00
parent 03befc13d1
commit c59398bf83
2 changed files with 53 additions and 7 deletions

41
main.go
View File

@ -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 {

View File

@ -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) {
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel>
<title>fake.com</title>
<link>/feed</link>
<link>`+*rssserverURL+`/feed</link>
<description>this is fake</description>
<item>
<title>title A</title>
<link>/itemA</link>
<link>`+*rssserverURL+`/itemA</link>
<description></description>
<pubDate>Wed, 10 Oct 2018 04:00:00 -0000</pubDate>
</item>
<item>
<title>title B</title>
<link>/itemB</link>
<link>`+*rssserverURL+`/itemB</link>
<description>content B</description>
<pubDate>Wed, 10 Oct 2018 04:00:00 -0000</pubDate>
</item>
@ -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()