add api/list/tag/tag_name_here

master
Bel LaPointe 2019-04-23 13:56:14 -06:00
parent ba3487852c
commit 7bfae2f004
5 changed files with 69 additions and 2 deletions

View File

@ -112,6 +112,32 @@ func (ex *Exchange) GetFeedItem(ID string) (string, error) {
return item.Content, nil return item.Content, nil
} }
func (ex *Exchange) ListTag(tag string, n int) (string, error) {
feeds := []*rss.Feed{}
feedNames, err := ex.SClient.List(nsForFeeds, "", true, -1)
if err != nil {
return "", err
}
for _, feedName := range feedNames {
b, err := ex.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 {
feeds = append(feeds, feed)
}
}
}
b, err := json.Marshal(feeds)
return string(b), err
}
func (ex *Exchange) GetFeedTagRSS(tag string) (string, error) { func (ex *Exchange) GetFeedTagRSS(tag string) (string, error) {
feedNames, err := ex.SClient.List(nsForFeeds, "", true, -1) feedNames, err := ex.SClient.List(nsForFeeds, "", true, -1)
if err != nil { if err != nil {

View File

@ -42,6 +42,7 @@ func core() {
ex.GetFeedRSS, ex.GetFeedRSS,
ex.GetFeedItem, ex.GetFeedItem,
ex.GetFeedTagRSS, ex.GetFeedTagRSS,
ex.ListTag,
); err != nil { ); err != nil {
panic(err) panic(err)
} }

View File

@ -110,6 +110,11 @@ func Test_Core(t *testing.T) {
status: 200, status: 200,
post: func() { time.Sleep(time.Second * 15) }, post: func() { time.Sleep(time.Second * 15) },
}, },
{
method: "get",
path: "api/list/tag/gotest",
status: 200,
},
} }
for _, c := range cases { for _, c := range cases {
c.method = strings.ToUpper(c.method) c.method = strings.ToUpper(c.method)

View File

@ -22,15 +22,24 @@ type Server struct {
getFeedHandler func(string, int) (string, error) getFeedHandler func(string, int) (string, error)
getFeedItemHandler func(string) (string, error) getFeedItemHandler func(string) (string, error)
getFeedTagHandler func(string) (string, error) getFeedTagHandler func(string) (string, error)
getListTagHandler func(string, int) (string, error)
} }
func New(addr string, newFeedHandler func(string, string, string, []string, time.Duration), getFeedHandler func(string, int) (string, error), getFeedItemHandler func(string) (string, error), getFeedTagHandler func(string) (string, error)) (*Server, error) { func New(
addr string,
newFeedHandler func(string, string, string, []string, time.Duration),
getFeedHandler func(string, int) (string, error),
getFeedItemHandler func(string) (string, error),
getFeedTagHandler func(string) (string, error),
getListTagHandler func(string, int) (string, error),
) (*Server, error) {
return &Server{ return &Server{
addr: addr, addr: addr,
newFeedHandler: newFeedHandler, newFeedHandler: newFeedHandler,
getFeedHandler: getFeedHandler, getFeedHandler: getFeedHandler,
getFeedItemHandler: getFeedItemHandler, getFeedItemHandler: getFeedItemHandler,
getFeedTagHandler: getFeedTagHandler, getFeedTagHandler: getFeedTagHandler,
getListTagHandler: getListTagHandler,
}, nil }, nil
} }
@ -81,6 +90,8 @@ func (s *Server) api(w http.ResponseWriter, r *http.Request) {
switch advance(r) { switch advance(r) {
case "feed": case "feed":
s.feed(w, r) s.feed(w, r)
case "list":
s.list(w, r)
default: default:
s.notFound(w, r) s.notFound(w, r)
} }
@ -198,6 +209,24 @@ func (s *Server) getFeed(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, feedBody) fmt.Fprintln(w, feedBody)
} }
func (s *Server) list(w http.ResponseWriter, r *http.Request) {
switch advance(r) {
case "tag":
s.listTag(w, r)
default:
s.notFound(w, r)
}
}
func (s *Server) listTag(w http.ResponseWriter, r *http.Request) {
tag := advance(r)
out, err := s.getListTagHandler(tag, -1)
if err != nil {
panic(err)
}
fmt.Fprintln(w, out)
}
func validURL(loc string) bool { func validURL(loc string) bool {
_, err := url.ParseRequestURI(loc) _, err := url.ParseRequestURI(loc)
return err == nil return err == nil

View File

@ -19,7 +19,7 @@ func Test_Server(t *testing.T) {
testPort = strings.Split(server.Listener.Addr().String(), ":")[1] testPort = strings.Split(server.Listener.Addr().String(), ":")[1]
var err error var err error
s, err := New(testPort, func(string, string, string, []string, time.Duration) {}, func(string, int) (string, error) { return "", nil }, func(string) (string, error) { return "", nil }, func(string) (string, error) { return "", nil }) s, err := New(testPort, func(string, string, string, []string, time.Duration) {}, func(string, int) (string, error) { return "", nil }, func(string) (string, error) { return "", nil }, func(string) (string, error) { return "", nil }, func(string, int) (string, error) { return "", nil })
if err != nil { if err != nil {
t.Errorf("failed to create server: %v", err) t.Errorf("failed to create server: %v", err)
} }
@ -58,6 +58,12 @@ func Test_Server(t *testing.T) {
if err := checkStatus("GET", "api/feed/tag/b", http.StatusOK); err != nil { if err := checkStatus("GET", "api/feed/tag/b", http.StatusOK); err != nil {
t.Errorf(err.Error()) t.Errorf(err.Error())
} }
if err := checkStatus("GET", "api/feed/tag/b", http.StatusOK); err != nil {
t.Errorf(err.Error())
}
if err := checkStatus("GET", "api/list/tag/b", http.StatusOK); err != nil {
t.Errorf(err.Error())
}
syscall.Kill(syscall.Getpid(), syscall.SIGINT) syscall.Kill(syscall.Getpid(), syscall.SIGINT)
} }