From 1bae9e493756e585ee9cdbc5998359b34b2a1d59 Mon Sep 17 00:00:00 2001 From: Leonardo Bishop Date: Sun, 10 Aug 2025 19:15:47 +0100 Subject: Add option to skip digests if there is nothing new --- .../internal/db/20250810191816_skipifempty.up.sql | 1 + walrss/internal/db/db.go | 6 ++-- walrss/internal/http/edit.go | 37 ++++++++++++++++++++-- walrss/internal/http/http.go | 8 +++-- walrss/internal/http/mainpage.go | 1 + walrss/internal/http/views/main.qtpl.html | 22 +++++++++++++ walrss/internal/http/views/main.qtpl.html.go | 32 +++++++++++++++++++ walrss/internal/rss/processor.go | 37 ++++++++++++++++------ walrss/internal/urls/urls.go | 1 + 9 files changed, 128 insertions(+), 17 deletions(-) create mode 100644 walrss/internal/db/20250810191816_skipifempty.up.sql diff --git a/walrss/internal/db/20250810191816_skipifempty.up.sql b/walrss/internal/db/20250810191816_skipifempty.up.sql new file mode 100644 index 0000000..e008132 --- /dev/null +++ b/walrss/internal/db/20250810191816_skipifempty.up.sql @@ -0,0 +1 @@ +ALTER TABLE users ADD COLUMN skip_if_empty BOOLEAN DEFAULT FALSE NOT NULL diff --git a/walrss/internal/db/db.go b/walrss/internal/db/db.go index 37e093a..7fed362 100644 --- a/walrss/internal/db/db.go +++ b/walrss/internal/db/db.go @@ -3,12 +3,13 @@ package db import ( "database/sql" "fmt" + "strings" + "time" + _ "github.com/mattn/go-sqlite3" "github.com/rs/zerolog/log" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/sqlitedialect" - "strings" - "time" ) func New(filename string) (*bun.DB, error) { @@ -39,6 +40,7 @@ type User struct { Active bool `bun:"active,notnull"` ScheduleDay SendDay `bun:"schedule_day"` ScheduleHour int `bun:"schedule_hour"` + SkipIfEmpty bool `bun:"skip_if_empty"` } type Feed struct { diff --git a/walrss/internal/http/edit.go b/walrss/internal/http/edit.go index f126710..eb1b7d5 100644 --- a/walrss/internal/http/edit.go +++ b/walrss/internal/http/edit.go @@ -1,13 +1,14 @@ package http import ( + "strconv" + "strings" + "github.com/codemicro/walrss/walrss/internal/core" "github.com/codemicro/walrss/walrss/internal/db" "github.com/codemicro/walrss/walrss/internal/http/views" "github.com/codemicro/walrss/walrss/internal/urls" "github.com/gofiber/fiber/v2" - "strconv" - "strings" ) func (s *Server) editEnabledState(ctx *fiber.Ctx) error { @@ -34,6 +35,37 @@ func (s *Server) editEnabledState(ctx *fiber.Ctx) error { fragmentEmitSuccess(ctx) return ctx.SendString((&views.MainPage{ EnableDigests: user.Active, + SkipIfEmpty: user.SkipIfEmpty, + SelectedDay: user.ScheduleDay, + SelectedTime: user.ScheduleHour, + }).RenderScheduleCard()) +} + +func (s *Server) editSkipEmptyState(ctx *fiber.Ctx) error { + currentUserID := getCurrentUserID(ctx) + if currentUserID == "" { + return requestFragmentSignIn(ctx, urls.Index) + } + + user, err := core.GetUserByID(s.state, currentUserID) + if err != nil { + return err + } + + if strings.ToLower(ctx.FormValue("skipIfEmpty", "off")) == "on" { + user.SkipIfEmpty = true + } else { + user.SkipIfEmpty = false + } + + if err := core.UpdateUser(s.state, user); err != nil { + return err + } + + fragmentEmitSuccess(ctx) + return ctx.SendString((&views.MainPage{ + EnableDigests: user.Active, + SkipIfEmpty: user.SkipIfEmpty, SelectedDay: user.ScheduleDay, SelectedTime: user.ScheduleHour, }).RenderScheduleCard()) @@ -77,6 +109,7 @@ func (s *Server) editTimings(ctx *fiber.Ctx) error { fragmentEmitSuccess(ctx) return ctx.SendString((&views.MainPage{ EnableDigests: user.Active, + SkipIfEmpty: user.SkipIfEmpty, SelectedDay: user.ScheduleDay, SelectedTime: user.ScheduleHour, }).RenderScheduleCard()) diff --git a/walrss/internal/http/http.go b/walrss/internal/http/http.go index f76170c..12a5da9 100644 --- a/walrss/internal/http/http.go +++ b/walrss/internal/http/http.go @@ -3,6 +3,10 @@ package http import ( "context" "errors" + "net/url" + "strings" + "time" + "github.com/codemicro/walrss/walrss/internal/core" "github.com/codemicro/walrss/walrss/internal/http/views" "github.com/codemicro/walrss/walrss/internal/state" @@ -13,9 +17,6 @@ import ( "github.com/rs/zerolog/log" "github.com/stevelacy/daz" "golang.org/x/oauth2" - "net/url" - "strings" - "time" ) const ( @@ -112,6 +113,7 @@ func (s *Server) registerHandlers() { s.app.Get(urls.AuthOIDCCallback, s.authOIDCCallback) s.app.Put(urls.EditEnabledState, s.editEnabledState) + s.app.Put(urls.EditSkipEmptyState, s.editSkipEmptyState) s.app.Put(urls.EditTimings, s.editTimings) s.app.Get(urls.EditFeedItem, s.editFeedItem) diff --git a/walrss/internal/http/mainpage.go b/walrss/internal/http/mainpage.go index 99b26b8..b3530f1 100644 --- a/walrss/internal/http/mainpage.go +++ b/walrss/internal/http/mainpage.go @@ -24,6 +24,7 @@ func (s *Server) mainPage(ctx *fiber.Ctx) error { return views.SendPage(ctx, &views.MainPage{ EnableDigests: user.Active, + SkipIfEmpty: user.SkipIfEmpty, SelectedDay: user.ScheduleDay, SelectedTime: user.ScheduleHour, Feeds: feeds, diff --git a/walrss/internal/http/views/main.qtpl.html b/walrss/internal/http/views/main.qtpl.html index 4619ee6..2e593e0 100644 --- a/walrss/internal/http/views/main.qtpl.html +++ b/walrss/internal/http/views/main.qtpl.html @@ -9,6 +9,7 @@ EnableDigests bool SelectedDay db.SendDay SelectedTime int + SkipIfEmpty bool Feeds db.FeedSlice } %} @@ -268,6 +269,27 @@ +
+
+ + +
+ +
+
+ Loading... +
+
+
+
+
+
+ + +
+ +
+
+ Loading... +
+
+
+ 0 { + newContent = true + } // add new items to DB cache when we're not testing. if we're testing, adding known items to the cache will // stop them from appearing in any scheduled emails later on. @@ -150,7 +155,16 @@ func ProcessUserFeed(st *state.State, user *db.User, progressChannel chan string processedFeeds = append(processedFeeds, pf) } - reportProgress(progressChannel, "Finished fetching feed content\nGenerating email") + reportProgress(progressChannel, "Finished fetching feed content") + + if user.SkipIfEmpty && !newContent { + reportProgress(progressChannel, "There is no new content to send") + if !isTest { + return nil + } + } + + reportProgress(progressChannel, "Generating email") plainContent, htmlContent, err := generateEmail(st, processedFeeds, interval, time.Now().UTC().Sub(startTime)) if err != nil { @@ -166,8 +180,11 @@ func ProcessUserFeed(st *state.State, user *db.User, progressChannel chan string user.Email, "RSS digest for "+time.Now().UTC().Format(dateFormat), ) - - reportProgress(progressChannel, "Done!") + if err != nil { + reportProgress(progressChannel, "Failed to send email") + } else { + reportProgress(progressChannel, "Done!") + } return err } diff --git a/walrss/internal/urls/urls.go b/walrss/internal/urls/urls.go index b0b154d..99943f8 100644 --- a/walrss/internal/urls/urls.go +++ b/walrss/internal/urls/urls.go @@ -17,6 +17,7 @@ const ( Edit = "/edit" EditEnabledState = Edit + "/enabled" + EditSkipEmptyState = Edit + "/skipempty" EditTimings = Edit + "/timings" EditFeedItem = Edit + "/feed/:id" CancelEditFeedItem = Edit + "/feed/:id/cancel" -- cgit v1.2.3-70-g09d2