From e54c7a76f9a7139918d092afa15f6742d9506905 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Sun, 27 Apr 2025 11:46:20 -0600 Subject: [PATCH] gonna swap from feeds.Feeds --- go.mod | 1 + go.sum | 2 ++ src/cmd/cron/main.go | 31 ++++++++++++++++++++++++++++--- src/cmd/cron/main_test.go | 19 ++++++++++++++++++- 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 8a06f73..f0e0b24 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect golang.org/x/sys v0.31.0 // indirect modernc.org/libc v1.62.1 // indirect diff --git a/go.sum b/go.sum index e944b01..34bd138 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdh github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= diff --git a/src/cmd/cron/main.go b/src/cmd/cron/main.go index 8f0b0f3..14a8cf3 100644 --- a/src/cmd/cron/main.go +++ b/src/cmd/cron/main.go @@ -2,9 +2,11 @@ package cron import ( "context" - "io" + "fmt" "show-rss/src/feeds" "time" + + "github.com/robfig/cron/v3" ) func Main(ctx context.Context) error { @@ -30,10 +32,33 @@ func One(ctx context.Context) error { } return f.ForEach(ctx, func(feed feeds.Feed) error { - return one(ctx, feed) + if err := one(ctx, feed); err != nil { + return fmt.Errorf("failed to cron %s (%+v): %w", feed.Entry.ID, feed.Version, err) + } + return nil }) } func one(ctx context.Context, feed feeds.Feed) error { - return io.EOF + if schedule, err := cron.NewParser( + cron.SecondOptional | + cron.Minute | + cron.Hour | + cron.Dom | + cron.Month | + cron.Dow | + cron.Descriptor, + ).Parse(feed.Version.Cron); err != nil { + return fmt.Errorf("illegal cron %q", feed.Version.Cron) + } else if next := schedule.Next(feed.Execution.Executed); time.Now().Before(next) { + return nil + } + + return fmt.Errorf("should GET %s", feed.Version.URL) + + f, err := feeds.New(ctx) + if err != nil { + return fmt.Errorf("failed new feeds to executed %s: %w", feed.Entry.ID, err) + } + return f.Executed(ctx, feed.Entry.ID, feed.Version.Created) } diff --git a/src/cmd/cron/main_test.go b/src/cmd/cron/main_test.go index 55debf9..6c995c0 100644 --- a/src/cmd/cron/main_test.go +++ b/src/cmd/cron/main_test.go @@ -2,9 +2,13 @@ package cron_test import ( "context" + "fmt" + "net/http" + "net/http/httptest" "show-rss/src/cmd/cron" "show-rss/src/db" "show-rss/src/feeds" + "slices" "strconv" "testing" "time" @@ -19,6 +23,19 @@ func TestOne(t *testing.T) { return db.Test(t, ctx) }, "feeds": func() context.Context { + gets := []string{} + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gets = append(gets, r.URL.String()) + t.Logf("%s", gets[len(gets)-1]) + })) + t.Cleanup(s.Close) + t.Cleanup(func() { + slices.Sort(gets) + if len(gets) != 2+2+2 { // id=1+id=2 for each of 2 unrecycled ctx, id=1+id=2 for one across shared ctx + t.Errorf("didn't call urls exactly twice: %+v", gets) + } + }) + ctx := db.Test(t, ctx) f, err := feeds.New(ctx) @@ -26,7 +43,7 @@ func TestOne(t *testing.T) { t.Fatal(err) } for i := 0; i < 2; i++ { - if _, err := f.Insert(ctx, strconv.Itoa(i), "* * * * *"); err != nil { + if _, err := f.Insert(ctx, fmt.Sprintf("%s?idx=%d", s.URL, i), "* * * * *"); err != nil { t.Fatal(err) } }