From 64ae38e11cc2c1e2e66c29b17d8b4b3783eb2a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Jovanovi=C4=87?= Date: Thu, 10 Sep 2026 11:47:38 +0200 Subject: [PATCH] add reconcile function, loud log multiple reps per dept --- reconcile.go | 41 +++++++++++++++++++++++++++++++++++++++++ server.go | 6 ------ 2 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 reconcile.go diff --git a/reconcile.go b/reconcile.go new file mode 100644 index 0000000..ba4f0e4 --- /dev/null +++ b/reconcile.go @@ -0,0 +1,41 @@ +package main + +import ( + "context" + "log" +) + +func (s *Server) reconcile(ctx context.Context, runID int64, rep *User, dept string) error { + reps, err := s.store.RepsFor(rep.ChapterID, dept) + if err != nil { + return err + } + if len(reps) == 0 { + // Shouldn't happen: the webhook fired for a rep in this department. + log.Printf("run %d: no reps found for chapter %d dept %q", runID, rep.ChapterID, dept) + return nil + } + if len(reps) > 1 { + log.Printf("WARNING: run %d: %d reps for chapter %d dept %q; assigning all to %d (fill-only mode)", + runID, len(reps), rep.ChapterID, dept, reps[0]) + } + agent := reps[0] + + members, err := s.store.EligibleMembers(rep.ChapterID, dept) + if err != nil { + return err + } + + assigned, skipped := 0, 0 + for _, m := range members { + // ... ActiveAgent check, AssignAgent or skip + } + + if assigned == 0 && skipped > 0 { + log.Printf("WARNING: run %d: assigned nobody; all %d members already have agents", + runID, skipped) + } + log.Printf("run %d: %d assigned, %d skipped, dept %q chapter %d", + runID, assigned, skipped, dept, rep.ChapterID) + return nil +} diff --git a/server.go b/server.go index 073fc42..ef3fadb 100644 --- a/server.go +++ b/server.go @@ -189,12 +189,6 @@ func (s *Server) handleWebhook(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } -// reconcile is stubbed until piece 3 lands. -func (s *Server) reconcile(ctx context.Context, runID int64, rep *User, dept string) error { - log.Printf("run %d: would reconcile dept %q for rep %d", runID, dept, rep.ID) - return nil -} - // ST doesn't support setting headers so we use the URL func (s *Server) validSecret(r *http.Request) bool {