package handlers import ( "database/sql" "html/template" "log" "net/http" "synlotto-website/helpers" "synlotto-website/models" "synlotto-website/storage" "github.com/gorilla/csrf" ) func NewTicket(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { log.Println("➡️ New ticket form opened") tmpl := template.Must(template.ParseFiles( "templates/layout.html", "templates/new_ticket.html", )) err := tmpl.ExecuteTemplate(w, "layout", map[string]interface{}{ "csrfField": csrf.TemplateField(r), "Page": "new_ticket", "Data": nil, }) if err != nil { log.Println("❌ Template error:", err) http.Error(w, "Error rendering form", http.StatusInternalServerError) } } } func SubmitTicket(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if _, ok := helpers.GetCurrentUserID(r); !ok { http.Redirect(w, r, "/login", http.StatusSeeOther) return } ticket := models.MyTicket{ GameType: r.FormValue("game_type"), DrawDate: r.FormValue("draw_date"), Ball1: helpers.Atoi(r.FormValue("ball1")), Ball2: helpers.Atoi(r.FormValue("ball2")), Ball3: helpers.Atoi(r.FormValue("ball3")), Ball4: helpers.Atoi(r.FormValue("ball4")), Ball5: helpers.Atoi(r.FormValue("ball5")), Bonus1: helpers.Nullable(helpers.Atoi(r.FormValue("bonus1"))), Bonus2: helpers.Nullable(helpers.Atoi(r.FormValue("bonus2"))), } if err := storage.InsertTicket(db, ticket); err != nil { log.Println("❌ Failed to insert ticket:", err) http.Error(w, "Error storing ticket", http.StatusInternalServerError) return } http.Redirect(w, r, "/", http.StatusSeeOther) } } func ListTickets(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { log.Println("📋 Tickets page hit") tmpl := template.Must(template.ParseFiles( "templates/layout.html", "templates/tickets.html", )) rows, err := db.Query(` SELECT id, game_type, draw_date, ball1, ball2, ball3, ball4, ball5, bonus1, bonus2, duplicate FROM my_tickets ORDER BY draw_date DESC `) if err != nil { log.Println("❌ Failed to query tickets:", err) http.Error(w, "Could not load tickets", http.StatusInternalServerError) return } defer rows.Close() var tickets []models.MyTicket for rows.Next() { var t models.MyTicket err := rows.Scan( &t.Id, &t.GameType, &t.DrawDate, &t.Ball1, &t.Ball2, &t.Ball3, &t.Ball4, &t.Ball5, &t.Bonus1, &t.Bonus2, &t.Duplicate, ) if err != nil { log.Println("❌ Row scan error:", err) continue } tickets = append(tickets, t) } err = tmpl.ExecuteTemplate(w, "layout", map[string]any{ "Page": "tickets", "Data": tickets, }) if err != nil { log.Println("❌ Template rendering error:", err) http.Error(w, "Could not render page", http.StatusInternalServerError) } } }