stub asses
parent
6259a4f179
commit
14e80ac2c3
|
|
@ -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
|
||||||
|
)`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
package asses_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestOne(t *testing.T) {
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package cron
|
package fetch
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package cron_test
|
package fetch_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"show-rss/src/cmd/cron"
|
"show-rss/src/cmd/fetch"
|
||||||
"show-rss/src/db"
|
"show-rss/src/db"
|
||||||
"show-rss/src/feeds"
|
"show-rss/src/feeds"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
@ -85,7 +85,7 @@ func TestOne(t *testing.T) {
|
||||||
ctx := aCtx(t)
|
ctx := aCtx(t)
|
||||||
for i := 0; i < 2; i++ {
|
for i := 0; i < 2; i++ {
|
||||||
t.Run(strconv.Itoa(i), func(t *testing.T) {
|
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)
|
t.Fatalf("failed %d: %v", i, err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -96,7 +96,7 @@ func TestOne(t *testing.T) {
|
||||||
for i := 0; i < 2; i++ {
|
for i := 0; i < 2; i++ {
|
||||||
t.Run(strconv.Itoa(i), func(t *testing.T) {
|
t.Run(strconv.Itoa(i), func(t *testing.T) {
|
||||||
ctx := aCtx(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)
|
t.Fatalf("failed %d: %v", i, err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -4,7 +4,8 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"show-rss/src/cmd/cron"
|
"show-rss/src/cmd/asses"
|
||||||
|
"show-rss/src/cmd/fetch"
|
||||||
"show-rss/src/cmd/server"
|
"show-rss/src/cmd/server"
|
||||||
"show-rss/src/pool"
|
"show-rss/src/pool"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -22,7 +23,8 @@ func Main(ctx context.Context, args []string) error {
|
||||||
|
|
||||||
foos := map[string]func(context.Context) error{
|
foos := map[string]func(context.Context) error{
|
||||||
"server": server.Main,
|
"server": server.Main,
|
||||||
"cron": cron.Main,
|
"fetch": fetch.Main,
|
||||||
|
"asses": asses.Main,
|
||||||
}
|
}
|
||||||
p := pool.New(len(foos))
|
p := pool.New(len(foos))
|
||||||
defer p.Wait(ctx)
|
defer p.Wait(ctx)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue