84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
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())
|
|
}
|
|
|
|
type last struct {
|
|
T time.Time `json:"checked_at"`
|
|
Cksum string `json:"cksum"`
|
|
Modified time.Time `json:"modified"`
|
|
}
|
|
|
|
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, modified
|
|
FROM "asses.checks"
|
|
WHERE p=$1
|
|
`, p)
|
|
}
|
|
|
|
func checked(ctx context.Context, p, cksum string, modified time.Time) error {
|
|
if err := initDB(ctx); err != nil {
|
|
return err
|
|
}
|
|
|
|
return db.Exec(ctx, `
|
|
INSERT INTO "asses.checks"
|
|
(p, checked_at, cksum, modified)
|
|
VALUES ($1, $2, $3, $4)
|
|
|
|
ON CONFLICT DO UPDATE
|
|
SET checked_at=$2, cksum=$3, modified=$4
|
|
WHERE p=$1
|
|
`, p, time.Now(), cksum, modified)
|
|
}
|
|
|
|
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
|
|
)`,
|
|
`ALTER TABLE "asses.checks" ADD COLUMN "modified" TIMESTAMP`,
|
|
})
|
|
}
|