package main import ( "context" "flag" "fmt" "os" "gitea.lab.audasmedia.com.au/sam/compass_teams_nhs/internal/config" "gitea.lab.audasmedia.com.au/sam/compass_teams_nhs/internal/store" ) // scanCommand is the `school scan` entry point. It only records the outcome of a // scan; the scan itself runs the patchright fetcher on the host and then // `school parse` (AGENTS.md ยง11 Phase 4). // // `school scan record` exists so a fetch failure is written to the append-only // `scans` table with ok = 0 (FR-12/FR-13): the dashboard can then show an // explicit failure instead of an empty day. func scanCommand(args []string) { if len(args) == 0 || args[0] != "record" { fmt.Fprintln(os.Stderr, "usage: school scan record --child NAME [--ok] [--pages N] [--items N] --message TEXT") os.Exit(2) } fs := flag.NewFlagSet("scan record", flag.ContinueOnError) var ( child string pages int items int message string ok bool ) fs.StringVar(&child, "child", "", "child name (Harry or Finn)") fs.BoolVar(&ok, "ok", false, "true when the scan succeeded") fs.IntVar(&pages, "pages", 0, "pages fetched") fs.IntVar(&items, "items", 0, "items found") fs.StringVar(&message, "message", "", "failure message (required when --ok=false)") _ = fs.Parse(args[1:]) if child == "" { fmt.Fprintln(os.Stderr, "school scan record: --child is required") os.Exit(2) } if !ok && message == "" { fmt.Fprintln(os.Stderr, "school scan record: --message is required for a failed scan") os.Exit(2) } if err := runScanRecord(child, pages, items, ok, message); err != nil { fmt.Fprintln(os.Stderr, "school scan:", err) os.Exit(1) } } func runScanRecord(child string, pages, items int, ok bool, message string) error { ctx := context.Background() cfg, err := config.LoadDB() if err != nil { return err } st, err := store.Open(cfg.DBPath) if err != nil { return err } defer st.Close() if err := st.Migrate(ctx); err != nil { return err } if err := st.SeedChildren(ctx, seedChildren...); err != nil { return err } c, err := st.ChildByName(ctx, child) if err != nil { return err } if c == nil { return fmt.Errorf("unknown child %q", child) } id, err := st.RecordScan(ctx, &c.ID, pages, items, ok, message) if err != nil { return err } status := "ok" if !ok { status = "failed" } fmt.Printf("scan=%d child=%s status=%s pages=%d items=%d\n", id, c.Name, status, pages, items) return nil }