From e7bfc3b0a3caba54798ce0a04278de7af4a8625b Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Wed, 1 Jul 2020 20:15:12 +0100 Subject: [PATCH] feed/folder list endpoints --- server/handlers.go | 23 +++++++++++++++++++---- server/server.go | 8 ++++++++ storage/feed.go | 20 ++++++++++---------- storage/folder.go | 6 +++--- storage/storage.go | 2 +- 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/server/handlers.go b/server/handlers.go index 1a04df3..14c8d41 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -39,7 +39,19 @@ func StaticHandler(rw http.ResponseWriter, req *http.Request) { io.Copy(rw, f) } +func StatusHandler(rw http.ResponseWriter, req *http.Request) { + writeJSON(rw, map[string]interface{}{ + "running": handler(req).fetchRunning, + "stats": map[string]int64{}, + }) +} + func FolderListHandler(rw http.ResponseWriter, req *http.Request) { + if req.Method == "GET" { + list := db(req).ListFolders() + fmt.Println(list) + json.NewEncoder(rw).Encode(list) + } } func FolderHandler(rw http.ResponseWriter, req *http.Request) { @@ -51,7 +63,10 @@ type NewFeed struct { } func FeedListHandler(rw http.ResponseWriter, req *http.Request) { - if req.Method == "POST" { + if req.Method == "GET" { + list := db(req).ListFeeds() + json.NewEncoder(rw).Encode(list) + } else if req.Method == "POST" { var feed NewFeed if err := json.NewDecoder(req.Body).Decode(&feed); err != nil { log.Print(err) @@ -88,13 +103,13 @@ func FeedListHandler(rw http.ResponseWriter, req *http.Request) { } else if len(sources) == 1 { feedUrl = sources[0].Url fmt.Println("feedUrl:", feedUrl) - err = createFeed(db(req), feedUrl, 0) + err = createFeed(db(req), feedUrl, feed.FolderID) if err == nil { writeJSON(rw, map[string]string{"status": "success"}) } } } else if strings.HasPrefix(contentType, "text/xml") || strings.HasPrefix(contentType, "application/xml") { - err = createFeed(db(req), feedUrl, 0) + err = createFeed(db(req), feedUrl, feed.FolderID) if err == nil { writeJSON(rw, map[string]string{"status": "success"}) } @@ -105,7 +120,7 @@ func FeedListHandler(rw http.ResponseWriter, req *http.Request) { } } -func createFeed(s *storage.Storage, url string, folderId int64) error { +func createFeed(s *storage.Storage, url string, folderId *int64) error { fmt.Println(s, url) fp := gofeed.NewParser() feed, err := fp.ParseURL(url) diff --git a/server/server.go b/server/server.go index cb872a0..0afe356 100644 --- a/server/server.go +++ b/server/server.go @@ -17,6 +17,7 @@ type Route struct { type Handler struct { db *storage.Storage + fetchRunning bool } func p(path string, handler func(http.ResponseWriter, *http.Request)) Route { @@ -38,6 +39,7 @@ func p(path string, handler func(http.ResponseWriter, *http.Request)) Route { var routes []Route = []Route{ p("/", IndexHandler), p("/static/*path", StaticHandler), + p("/api/status", StatusHandler), p("/api/folders", FolderListHandler), p("/api/folders/:id", FolderHandler), p("/api/feeds", FeedListHandler), @@ -59,15 +61,21 @@ func db(req *http.Request) *storage.Storage { return nil } +func handler(req *http.Request) *Handler { + return req.Context().Value(ctxHandler).(*Handler) +} + const ( ctxDB = 1 ctxVars = 2 + ctxHandler = 3 ) func (h Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { for _, route := range routes { if route.urlRegex.MatchString(req.URL.Path) { ctx := context.WithValue(req.Context(), ctxDB, h.db) + ctx = context.WithValue(ctx, ctxHandler, &h) if route.urlRegex.NumSubexp() > 0 { vars := make(map[string]string) matches := route.urlRegex.FindStringSubmatchIndex(req.URL.Path) diff --git a/storage/feed.go b/storage/feed.go index 0028bf2..55fd681 100644 --- a/storage/feed.go +++ b/storage/feed.go @@ -1,22 +1,22 @@ package storage type Feed struct { - Id int64 - FolderId int64 - Title string - Description string - Link string - FeedLink string - Icon string + Id int64 `json:"id"` + FolderId *int64 `json:"folder_id"` + Title string `json:"title"` + Description string `json:"description"` + Link string `json:"link"` + FeedLink string `json:"feed_link"` + Icon string `json:"icon"` } -func (s *Storage) CreateFeed(title, description, link, feedLink, icon string, folderId int64) *Feed { +func (s *Storage) CreateFeed(title, description, link, feedLink, icon string, folderId *int64) *Feed { result, err := s.db.Exec(` insert into feeds (title, description, link, feed_link, icon, folder_id) values (?, ?, ?, ?, ?, ?) on conflict (feed_link) do update set folder_id=?`, - title, description, link, feedLink, icon, intOrNil(folderId), - intOrNil(folderId), + title, description, link, feedLink, icon, folderId, + folderId, ) if err != nil { return nil diff --git a/storage/folder.go b/storage/folder.go index 3bd6d87..71bbbda 100644 --- a/storage/folder.go +++ b/storage/folder.go @@ -5,9 +5,9 @@ import ( ) type Folder struct { - Id int64 - Title string - IsExpanded bool + Id int64 `json:"id"` + Title string `json:"title"` + IsExpanded bool `json:"is_expanded"` } func (s *Storage) CreateFolder(title string) *Folder { diff --git a/storage/storage.go b/storage/storage.go index e426f82..13bfebe 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -11,7 +11,7 @@ var initQuery string = ` create table if not exists folders ( id integer primary key autoincrement, title text not null, - is_expanded boolean + is_expanded boolean not null default false ); create table if not exists feeds (