|
|
|
|
@ -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) {
|
|
|
|
|
|