From 6b51a0c0a3a8fb9a01c997d96a6402e3bed0f761 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Thu, 8 May 2025 15:40:53 -0600 Subject: [PATCH] impl asses.checkLast(), .check() --- src/asses/db.go | 44 +++++++++++++++++++++++++++++--- src/asses/db_integration_test.go | 29 +++++++++++++++++++++ src/asses/db_test.go | 22 ++++++++-------- src/asses/one.go | 10 ++++++++ 4 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 src/asses/db_integration_test.go create mode 100644 src/asses/one.go diff --git a/src/asses/db.go b/src/asses/db.go index 02ef093..bdf04ea 100644 --- a/src/asses/db.go +++ b/src/asses/db.go @@ -18,9 +18,9 @@ func Next(ctx context.Context) (time.Time, error) { } result, err := db.QueryOne[Did](ctx, ` SELECT executed_at AS "Did" - FROM "asses.executions" - ORDER BY executed_at DESC - LIMIT 1 + FROM "asses.executions" + ORDER BY executed_at DESC + LIMIT 1 `) return result.Did, err } @@ -33,11 +33,49 @@ func Record(ctx context.Context) error { return db.Exec(ctx, `INSERT INTO "asses.executions" (id, executed_at) VALUES ($1, $2)`, uuid.New().String(), time.Now()) } +type last struct { + T time.Time `json:"checked_at"` + Cksum string `json:"cksum"` +} + +func checkLast(ctx context.Context, p string) (last, error) { + if err := initDB(ctx); err != nil { + return last{}, err + } + + return db.QueryOne[last](ctx, ` + SELECT checked_at, cksum + FROM "asses.checks" + WHERE p=$1 + `, p) +} + +func checked(ctx context.Context, p, cksum string) error { + if err := initDB(ctx); err != nil { + return err + } + + return db.Exec(ctx, ` + INSERT INTO "asses.checks" + (p, checked_at, cksum) + VALUES ($1, $2, $3) + + ON CONFLICT DO UPDATE + SET checked_at=$2, cksum=$3 + WHERE p=$1 + `, p, time.Now(), cksum) +} + 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 )`, + `CREATE TABLE "asses.checks" ( + p TEXT PRIMARY KEY NOT NULL, + checked_at TIMESTAMP NOT NULL, + cksum TEXT NOT NULL + )`, }) } diff --git a/src/asses/db_integration_test.go b/src/asses/db_integration_test.go new file mode 100644 index 0000000..cf7ab74 --- /dev/null +++ b/src/asses/db_integration_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/asses/db_test.go b/src/asses/db_test.go index cf7ab74..3335ccb 100644 --- a/src/asses/db_test.go +++ b/src/asses/db_test.go @@ -1,29 +1,29 @@ -package asses_test +package asses import ( "context" - "show-rss/src/asses" "show-rss/src/db" "testing" - "time" ) -func TestNextRecord(t *testing.T) { +func TestLast(t *testing.T) { ctx := db.Test(t, context.Background()) - if v, err := asses.Next(ctx); err != nil { + if last, err := checkLast(ctx, "p"); err != nil { t.Fatal(err) - } else if zero := v.IsZero(); !zero { - t.Fatal(v) + } else if !last.T.IsZero() || last.Cksum != "" { + t.Fatal(last) } - if err := asses.Record(ctx); err != nil { + if err := checked(ctx, "p", "cksum"); err != nil { + t.Fatal(err) + } else if err := checked(ctx, "p", "cksum"); err != nil { t.Fatal(err) } - if v, err := asses.Next(ctx); err != nil { + if last, err := checkLast(ctx, "p"); err != nil { t.Fatal(err) - } else if since := time.Since(v); since > time.Minute { - t.Fatal(since) + } else if last.T.IsZero() || last.Cksum != "cksum" { + t.Fatal(last) } } diff --git a/src/asses/one.go b/src/asses/one.go new file mode 100644 index 0000000..2785219 --- /dev/null +++ b/src/asses/one.go @@ -0,0 +1,10 @@ +package asses + +import ( + "context" + "io" +) + +func One(ctx context.Context, p string) error { + return io.EOF +}