stub asses

main
Bel LaPointe 2025-05-08 14:55:32 -06:00
parent 6259a4f179
commit 14e80ac2c3
9 changed files with 128 additions and 7 deletions

43
src/asses/db.go Normal file
View File

@ -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
)`,
})
}

29
src/asses/db_test.go Normal file
View File

@ -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)
}
}

39
src/cmd/asses/main.go Normal file
View File

@ -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
}

View File

@ -0,0 +1,8 @@
package asses_test
import (
"testing"
)
func TestOne(t *testing.T) {
}

View File

@ -1,4 +1,4 @@
package cron
package fetch
import (
"bytes"

View File

@ -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)
}
})

View File

@ -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)