110 lines
2.9 KiB
Go
110 lines
2.9 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|