From e32eb58500ebb6a8b2564a225ff3ebed06502031 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Fri, 7 Mar 2025 00:13:28 -0900 Subject: [PATCH] make generate button work maybe --- web/server.go | 60 +++++++++++++++++++++++++++++++++++- web/templates/heats.templ | 2 +- web/templates/heats_templ.go | 2 +- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/web/server.go b/web/server.go index 8a2a3b0..02b5ed7 100644 --- a/web/server.go +++ b/web/server.go @@ -139,7 +139,7 @@ func (s *Server) routes() { // Add heats API routes s.router.Route("/api/heats", func(r chi.Router) { - r.Post("/save", s.handleSaveHeats()) + r.Post("/generate", s.handleGenerateHeats()) }) // Main page @@ -832,6 +832,64 @@ func (s *Server) handleHeatsContent() http.HandlerFunc { } } +// handleGenerateHeats generates heats for a group +func (s *Server) handleGenerateHeats() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + // Get selected group ID from query parameter + groupIDStr := r.URL.Query().Get("group_id") + if groupIDStr == "" { + http.Error(w, "Group ID is required", http.StatusBadRequest) + return + } + + groupID, err := strconv.ParseInt(groupIDStr, 10, 64) + if err != nil { + http.Error(w, "Invalid group ID", http.StatusBadRequest) + return + } + + // Get racers for the group + racers, err := s.db.GetRacersByGroup(groupID) + if err != nil { + s.logger.Error("Failed to get racers", "error", err) + http.Error(w, "Failed to get racers", http.StatusInternalServerError) + return + } + + // Convert models.Racer to derby.Racer + derbyRacers := make([]derby.Racer, len(racers)) + for i, r := range racers { + derbyRacers[i] = derby.Racer{ + ID: r.ID, + FirstName: r.FirstName, + LastName: r.LastName, + CarNumber: r.CarNumber, + } + } + + // Generate and convert heats + derbyHeats := derby.GenerateHeats(derbyRacers) + heats := make([]models.Heat, len(derbyHeats)) + for i, h := range derbyHeats { + heats[i] = models.Heat{ + HeatNum: i + 1, + Lane1ID: h.Lane1ID, + Lane2ID: h.Lane2ID, + Lane3ID: h.Lane3ID, + Lane4ID: h.Lane4ID, + } + } + s.db.SaveHeats(groupID, heats) + + // Render template + component := templates.HeatsContent(heats, racers, groupID) + if err := component.Render(r.Context(), w); err != nil { + s.logger.Error("Failed to render heats content", "error", err) + http.Error(w, "Failed to render content", http.StatusInternalServerError) + } + } +} + // handleSaveHeats saves heats for a group func (s *Server) handleSaveHeats() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { diff --git a/web/templates/heats.templ b/web/templates/heats.templ index d76559d..bb9c302 100644 --- a/web/templates/heats.templ +++ b/web/templates/heats.templ @@ -82,7 +82,7 @@ templ HeatsContent(heats []models.Heat, racers []models.Racer, groupID int64) { ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "\" hx-target=\"#heats-content\" hx-swap=\"innerHTML\">Regenerate Heats") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }