diff --git a/handlers/common.go b/handlers/common.go index 2d8270f..ba82039 100644 --- a/handlers/common.go +++ b/handlers/common.go @@ -10,6 +10,7 @@ var Tmpl = template.Must(template.ParseFiles( "templates/index.html", "templates/new_draw.html", "templates/new_ticket.html", + "templates/tickets.html", )) var Draws []models.ThunderballResult diff --git a/handlers/ticket_handler.go b/handlers/ticket_handler.go index e23cfc3..410dd89 100644 --- a/handlers/ticket_handler.go +++ b/handlers/ticket_handler.go @@ -48,3 +48,45 @@ func SubmitTicket(db *sql.DB) http.HandlerFunc { 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") + + 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, "tickets", 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) + } + } +} diff --git a/main.go b/main.go index 220179d..059898b 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,8 @@ func main() { handlers.Submit(w, r) case "/ticket": handlers.NewTicket(db) + case "/tickets": + handlers.ListTickets(db) case "/submit-ticket": handlers.SubmitTicket(db) default: diff --git a/models/myticket.go b/models/myticket.go index e3d01fd..4f67040 100644 --- a/models/myticket.go +++ b/models/myticket.go @@ -1,14 +1,15 @@ package models type MyTicket struct { - Id int - GameType string - DrawDate string - Ball1 int - Ball2 int - Ball3 int - Ball4 int - Ball5 int - Bonus1 *int - Bonus2 *int + Id int + GameType string + DrawDate string + Ball1 int + Ball2 int + Ball3 int + Ball4 int + Ball5 int + Bonus1 *int + Bonus2 *int + Duplicate bool } diff --git a/storage/insert.go b/storage/insert.go index a2ccc33..f2121bf 100644 --- a/storage/insert.go +++ b/storage/insert.go @@ -30,7 +30,6 @@ func InsertThunderballResult(db *sql.DB, res models.ThunderballResult) error { } func InsertTicket(db *sql.DB, ticket models.MyTicket) error { - // Convert optional fields to interface{} using manual check var bonus1Val interface{} var bonus2Val interface{} diff --git a/templates/tickets.html b/templates/tickets.html new file mode 100644 index 0000000..935cb0f --- /dev/null +++ b/templates/tickets.html @@ -0,0 +1,36 @@ +{{ define "tickets" }} + {{ define "content" }} + ← Back to Home +

My Tickets

+ + + + + + + + + + + + + {{ range . }} + + + + + + + + {{ else }} + + {{ end }} + +
DateGameNumbersBonusDuplicate?
{{ .DrawDate }}{{ .GameType }}{{ .Ball1 }}, {{ .Ball2 }}, {{ .Ball3 }}, {{ .Ball4 }}, {{ .Ball5 }} + {{ if .Bonus1 }}{{ .Bonus1 }}{{ end }} + {{ if .Bonus2 }}, {{ .Bonus2 }}{{ end }} + + {{ if .Duplicate }}⚠️ Yes{{ else }}✔️ No{{ end }} +
No tickets logged yet.
+ {{ template "layout" . }} +{{ end }} diff --git a/tracker.db b/tracker.db deleted file mode 100644 index 07cd9c5..0000000 Binary files a/tracker.db and /dev/null differ