From 7bfae2f00472491a061b2f4dd499893be55330d7 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Tue, 23 Apr 2019 13:56:14 -0600 Subject: [PATCH] add api/list/tag/tag_name_here --- exchange/exchange.go | 26 ++++++++++++++++++++++++++ main.go | 1 + main_test.go | 5 +++++ server/server.go | 31 ++++++++++++++++++++++++++++++- server/server_test.go | 8 +++++++- 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/exchange/exchange.go b/exchange/exchange.go index c4c9fb3..8254d6e 100644 --- a/exchange/exchange.go +++ b/exchange/exchange.go @@ -112,6 +112,32 @@ func (ex *Exchange) GetFeedItem(ID string) (string, error) { 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) { feedNames, err := ex.SClient.List(nsForFeeds, "", true, -1) if err != nil { diff --git a/main.go b/main.go index 3115af1..4bf11d0 100644 --- a/main.go +++ b/main.go @@ -42,6 +42,7 @@ func core() { ex.GetFeedRSS, ex.GetFeedItem, ex.GetFeedTagRSS, + ex.ListTag, ); err != nil { panic(err) } diff --git a/main_test.go b/main_test.go index 42b6f6f..c2dcf63 100644 --- a/main_test.go +++ b/main_test.go @@ -110,6 +110,11 @@ func Test_Core(t *testing.T) { status: 200, post: func() { time.Sleep(time.Second * 15) }, }, + { + method: "get", + path: "api/list/tag/gotest", + status: 200, + }, } for _, c := range cases { c.method = strings.ToUpper(c.method) diff --git a/server/server.go b/server/server.go index 1eb8195..dde5741 100644 --- a/server/server.go +++ b/server/server.go @@ -22,15 +22,24 @@ type Server struct { getFeedHandler func(string, int) (string, error) getFeedItemHandler 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{ addr: addr, newFeedHandler: newFeedHandler, getFeedHandler: getFeedHandler, getFeedItemHandler: getFeedItemHandler, getFeedTagHandler: getFeedTagHandler, + getListTagHandler: getListTagHandler, }, nil } @@ -81,6 +90,8 @@ func (s *Server) api(w http.ResponseWriter, r *http.Request) { switch advance(r) { case "feed": s.feed(w, r) + case "list": + s.list(w, r) default: s.notFound(w, r) } @@ -198,6 +209,24 @@ func (s *Server) getFeed(w http.ResponseWriter, r *http.Request) { 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 { _, err := url.ParseRequestURI(loc) return err == nil diff --git a/server/server_test.go b/server/server_test.go index f533094..79ab6d1 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -19,7 +19,7 @@ func Test_Server(t *testing.T) { testPort = strings.Split(server.Listener.Addr().String(), ":")[1] 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 { 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 { 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) }