From 14e80ac2c364b2509c6d5d9cd9dc21e9f70adb74 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Thu, 8 May 2025 14:55:32 -0600 Subject: [PATCH] stub asses --- src/asses/db.go | 43 ++++++++++++++++++++++++++ src/asses/db_test.go | 29 +++++++++++++++++ src/cmd/asses/main.go | 39 +++++++++++++++++++++++ src/cmd/asses/main_test.go | 8 +++++ src/cmd/{cron => fetch}/main.go | 2 +- src/cmd/{cron => fetch}/main_test.go | 8 ++--- src/cmd/{cron => fetch}/testdata/0.rss | 0 src/cmd/{cron => fetch}/testdata/1.rss | 0 src/cmd/main.go | 6 ++-- 9 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 src/asses/db.go create mode 100644 src/asses/db_test.go create mode 100644 src/cmd/asses/main.go create mode 100644 src/cmd/asses/main_test.go rename src/cmd/{cron => fetch}/main.go (99%) rename src/cmd/{cron => fetch}/main_test.go (93%) rename src/cmd/{cron => fetch}/testdata/0.rss (100%) rename src/cmd/{cron => fetch}/testdata/1.rss (100%) diff --git a/src/asses/db.go b/src/asses/db.go new file mode 100644 index 0000000..02ef093 --- /dev/null +++ b/src/asses/db.go @@ -0,0 +1,43 @@ +package asses + +import ( + "context" + "show-rss/src/db" + "time" + + "github.com/google/uuid" +) + +func Next(ctx context.Context) (time.Time, error) { + if err := initDB(ctx); err != nil { + return time.Time{}, err + } + + type Did struct { + Did time.Time + } + result, err := db.QueryOne[Did](ctx, ` + SELECT executed_at AS "Did" + FROM "asses.executions" + ORDER BY executed_at DESC + LIMIT 1 + `) + return result.Did, err +} + +func Record(ctx context.Context) error { + if err := initDB(ctx); err != nil { + return err + } + + return db.Exec(ctx, `INSERT INTO "asses.executions" (id, executed_at) VALUES ($1, $2)`, uuid.New().String(), time.Now()) +} + +func initDB(ctx context.Context) error { + return db.InitializeSchema(ctx, "asses", []string{ + `CREATE TABLE "asses.executions" ( + id TEXT PRIMARY KEY NOT NULL, + executed_at TIMESTAMP NOT NULL + )`, + }) +} diff --git a/src/asses/db_test.go b/src/asses/db_test.go new file mode 100644 index 0000000..cf7ab74 --- /dev/null +++ b/src/asses/db_test.go @@ -0,0 +1,29 @@ +package asses_test + +import ( + "context" + "show-rss/src/asses" + "show-rss/src/db" + "testing" + "time" +) + +func TestNextRecord(t *testing.T) { + ctx := db.Test(t, context.Background()) + + if v, err := asses.Next(ctx); err != nil { + t.Fatal(err) + } else if zero := v.IsZero(); !zero { + t.Fatal(v) + } + + if err := asses.Record(ctx); err != nil { + t.Fatal(err) + } + + if v, err := asses.Next(ctx); err != nil { + t.Fatal(err) + } else if since := time.Since(v); since > time.Minute { + t.Fatal(since) + } +} diff --git a/src/cmd/asses/main.go b/src/cmd/asses/main.go new file mode 100644 index 0000000..fac5ea2 --- /dev/null +++ b/src/cmd/asses/main.go @@ -0,0 +1,39 @@ +package asses + +import ( + "context" + "io" + "show-rss/src/asses" + "time" +) + +func Main(ctx context.Context) error { + next, err := asses.Next(ctx) + if err != nil { + return err + } + + c := time.NewTicker(3 * time.Hour) + defer c.Stop() + for { + select { + case <-ctx.Done(): + case <-c.C: + case <-time.After(time.Until(next)): + } + + if err := One(ctx); err != nil { + return err + } + + next, err = asses.Next(ctx) + if err != nil { + return err + } + } + return ctx.Err() +} + +func One(ctx context.Context) error { + return io.EOF +} diff --git a/src/cmd/asses/main_test.go b/src/cmd/asses/main_test.go new file mode 100644 index 0000000..cef415b --- /dev/null +++ b/src/cmd/asses/main_test.go @@ -0,0 +1,8 @@ +package asses_test + +import ( + "testing" +) + +func TestOne(t *testing.T) { +} diff --git a/src/cmd/cron/main.go b/src/cmd/fetch/main.go similarity index 99% rename from src/cmd/cron/main.go rename to src/cmd/fetch/main.go index 337f7f9..ca845f2 100644 --- a/src/cmd/cron/main.go +++ b/src/cmd/fetch/main.go @@ -1,4 +1,4 @@ -package cron +package fetch import ( "bytes" diff --git a/src/cmd/cron/main_test.go b/src/cmd/fetch/main_test.go similarity index 93% rename from src/cmd/cron/main_test.go rename to src/cmd/fetch/main_test.go index b920057..ca59d6b 100644 --- a/src/cmd/cron/main_test.go +++ b/src/cmd/fetch/main_test.go @@ -1,4 +1,4 @@ -package cron_test +package fetch_test import ( "bytes" @@ -7,7 +7,7 @@ import ( "io" "net/http" "os" - "show-rss/src/cmd/cron" + "show-rss/src/cmd/fetch" "show-rss/src/db" "show-rss/src/feeds" "strconv" @@ -85,7 +85,7 @@ func TestOne(t *testing.T) { ctx := aCtx(t) for i := 0; i < 2; i++ { t.Run(strconv.Itoa(i), func(t *testing.T) { - if err := cron.One(ctx); err != nil && ctx.Err() == nil { + if err := fetch.One(ctx); err != nil && ctx.Err() == nil { t.Fatalf("failed %d: %v", i, err) } }) @@ -96,7 +96,7 @@ func TestOne(t *testing.T) { for i := 0; i < 2; i++ { t.Run(strconv.Itoa(i), func(t *testing.T) { ctx := aCtx(t) - if err := cron.One(ctx); err != nil && ctx.Err() == nil { + if err := fetch.One(ctx); err != nil && ctx.Err() == nil { t.Fatalf("failed %d: %v", i, err) } }) diff --git a/src/cmd/cron/testdata/0.rss b/src/cmd/fetch/testdata/0.rss similarity index 100% rename from src/cmd/cron/testdata/0.rss rename to src/cmd/fetch/testdata/0.rss diff --git a/src/cmd/cron/testdata/1.rss b/src/cmd/fetch/testdata/1.rss similarity index 100% rename from src/cmd/cron/testdata/1.rss rename to src/cmd/fetch/testdata/1.rss diff --git a/src/cmd/main.go b/src/cmd/main.go index 0ef70cd..ee86c5a 100644 --- a/src/cmd/main.go +++ b/src/cmd/main.go @@ -4,7 +4,8 @@ import ( "context" "fmt" "log" - "show-rss/src/cmd/cron" + "show-rss/src/cmd/asses" + "show-rss/src/cmd/fetch" "show-rss/src/cmd/server" "show-rss/src/pool" "time" @@ -22,7 +23,8 @@ func Main(ctx context.Context, args []string) error { foos := map[string]func(context.Context) error{ "server": server.Main, - "cron": cron.Main, + "fetch": fetch.Main, + "asses": asses.Main, } p := pool.New(len(foos)) defer p.Wait(ctx)