package main import ( "context" "flag" "fmt" "os" "strings" "gitea.lab.audasmedia.com.au/sam/compass_teams_nhs/internal/config" "gitea.lab.audasmedia.com.au/sam/compass_teams_nhs/internal/store" ) // itemsCommand is the `school items` entry point. It currently supports purging // items for one child, which Phase 4 uses to drop rows that a shared page // stored against the wrong child ("nothing may leak between children"). func itemsCommand(args []string) { if len(args) == 0 || args[0] != "purge" { fmt.Fprintln(os.Stderr, "usage: school items purge --child NAME [--source compass|teams] [--type message|task|event] [--source-page SLUG ...]") os.Exit(2) } fs := flag.NewFlagSet("items purge", flag.ContinueOnError) var ( child string source string typ string sourcePages multiFlag ) fs.StringVar(&child, "child", "", "child name (Harry or Finn)") fs.StringVar(&source, "source", "", "limit to one source") fs.StringVar(&typ, "type", "", "limit to one type") fs.Var(&sourcePages, "source-page", "limit to one stored page slug (repeatable)") _ = fs.Parse(args[1:]) if child == "" { fmt.Fprintln(os.Stderr, "school items purge: --child is required") os.Exit(2) } if err := runItemsPurge(child, source, typ, sourcePages); err != nil { fmt.Fprintln(os.Stderr, "school items:", err) os.Exit(1) } } // multiFlag collects a repeatable string flag. type multiFlag []string func (m *multiFlag) String() string { return strings.Join(*m, ",") } func (m *multiFlag) Set(v string) error { *m = append(*m, v) return nil } func runItemsPurge(child, source, typ string, sourcePages []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 } c, err := st.ChildByName(ctx, child) if err != nil { return err } if c == nil { return fmt.Errorf("unknown child %q", child) } var n int64 if len(sourcePages) > 0 { n, err = st.DeleteItemsFromPages(ctx, c.ID, source, typ, sourcePages...) } else { n, err = st.DeleteItems(ctx, c.ID, source, typ) } if err != nil { return err } fmt.Printf("child=%s purged=%d source=%q type=%q pages=%v\n", c.Name, n, source, typ, sourcePages) return nil }