From 9a25332dedd0c90bd18ba8e162b586e9370ef564 Mon Sep 17 00:00:00 2001 From: Marcus Noble Date: Sun, 8 Nov 2020 20:19:41 +0000 Subject: [PATCH] Added support for saving items --- internal/feeds/store.go | 21 +++++++++++++++++++++ internal/server/api.go | 9 +++++++++ internal/server/main.go | 2 ++ views/index.html | 34 +++++++++++++++++++++++++++++++++- 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/internal/feeds/store.go b/internal/feeds/store.go index b63535d..20da5f8 100644 --- a/internal/feeds/store.go +++ b/internal/feeds/store.go @@ -57,6 +57,18 @@ func (fs *FeedStore) GetUnread() *[]ItemWithFeed { return items } +func (fs *FeedStore) GetSaved() *[]ItemWithFeed { + items := &[]ItemWithFeed{} + fs.getDB().Table("items"). + Where("save = ?", true). + Select("items.*, feeds.title as feed_title, feeds.homepage_url as feed_homepage_url"). + Order("items.created desc, items.title"). + Joins("left join feeds on feeds.id = items.feed_id"). + Find(items) + + return items +} + func (fs *FeedStore) DeleteOldReadItems() { t := time.Now() threshold := t.Add(-time.Hour * 24 * 7) @@ -98,3 +110,12 @@ func (fs *FeedStore) MarkAsRead(itemID string) { fs.getDB().Save(*item) } + +func (fs *FeedStore) ToggleSaved(itemID string) { + item := &Item{} + fs.getDB().Where("id = ?", itemID).First(item) + + item.Save = !item.Save + + fs.getDB().Save(*item) +} diff --git a/internal/server/api.go b/internal/server/api.go index 87981cd..fb884d6 100644 --- a/internal/server/api.go +++ b/internal/server/api.go @@ -33,6 +33,10 @@ func (a *API) GetUnread(c *fiber.Ctx) error { return c.JSON(a.FeedStore.GetUnread()) } +func (a *API) GetSaved(c *fiber.Ctx) error { + return c.JSON(a.FeedStore.GetSaved()) +} + func (a *API) GetAll(c *fiber.Ctx) error { return c.JSON(a.FeedStore.GetAll()) } @@ -60,3 +64,8 @@ func (a *API) RefreshAll(c *fiber.Ctx) error { return c.JSON(a.FeedStore.GetUnread()) } + +func (a *API) SaveItem(c *fiber.Ctx) error { + a.FeedStore.ToggleSaved(c.Params("id")) + return nil +} diff --git a/internal/server/main.go b/internal/server/main.go index f004787..3248657 100644 --- a/internal/server/main.go +++ b/internal/server/main.go @@ -51,7 +51,9 @@ func Start(port string) error { app.Post("/api/feeds", api.PostFeed) app.Get("/api/feed/:id", api.GetFeed) app.Get("/api/item/:id", api.GetItem) + app.Post("/api/item/:id/save", api.SaveItem) app.Get("/api/unread", api.GetUnread) + app.Get("/api/saved", api.GetSaved) app.Get("/api/all", api.GetAll) app.Post("/api/read/:id", api.PostRead) app.Post("/api/read", api.PostReadAll) diff --git a/views/index.html b/views/index.html index 1300005..313167e 100644 --- a/views/index.html +++ b/views/index.html @@ -60,6 +60,11 @@ {{feed.Title}} ({{unreadCounts[feed.ID] || '0'}}) +
+ + Saved ({{saved}}) +
+
+ +
@@ -120,6 +131,7 @@ data: { feeds: [], items: [], + savedItems: [], selectedFeed: '', selectedItem: undefined, showAddModal: false, @@ -133,6 +145,8 @@ shownItems() { if (this.selectedFeed === '') { return this.items.filter(item => item.ID == this.selectedItem || !item.Read || item.Read === this.showRead); + } else if (this.selectedFeed === 'SAVED') { + return this.savedItems; } else { return this.items.filter(item => item.ID == this.selectedItem || item.FeedID === this.selectedFeed && (!item.Read || item.Read === this.showRead)); } @@ -140,6 +154,9 @@ unread() { return this.items.filter(item => !item.Read).length; }, + saved() { + return this.savedItems.length; + }, unreadCounts() { return this.items.filter(item => !item.Read).reduce((acc, item) => { if (!acc[item.FeedID]) acc[item.FeedID] = 0; @@ -172,6 +189,20 @@ fetch(`/api/read/${item.ID}`, {method: "POST"}) } }, + saveItem(item) { + this.setBusy(true); + fetch(`/api/item/${item.ID}/save`, {method: "POST"}) + .then(() => { + item.Save = !item.Save; + + if (item.Save) { + this.savedItems.push(item); + } else { + this.savedItems = this.savedItems.filter(i => item.ID != i.ID); + } + this.setBusy(false); + }) + }, nextItem() { let currentItem = -1; if (this.selectedItem != undefined) { @@ -294,7 +325,8 @@ this.setBusy(true); Promise.all([ fetch(`/api/feeds`).then(res => res.json()).then(feeds => this.feeds = feeds), - fetch(`/api/unread`).then(res => res.json()).then(items => this.items = items) + fetch(`/api/unread`).then(res => res.json()).then(items => this.items = items), + fetch(`/api/saved`).then(res => res.json()).then(items => this.savedItems = items) ]) .then(() => { this.setBusy(false);