package handlers import ( "database/sql" "fmt" "log" "net/http" "synlotto-website/helpers" "synlotto-website/models" "synlotto-website/storage" ) func CreateSyndicateHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) tmpl := helpers.LoadTemplateFiles("create-syndicate.html", "templates/syndicate/create.html") tmpl.ExecuteTemplate(w, "layout", context) case http.MethodPost: name := r.FormValue("name") description := r.FormValue("description") userId, ok := helpers.GetCurrentUserID(r) if !ok || name == "" { helpers.SetFlash(w, r, "Invalid data submitted") http.Redirect(w, r, "/syndicate/create", http.StatusSeeOther) return } _, err := storage.CreateSyndicate(db, userId, name, description) if err != nil { log.Printf("❌ CreateSyndicate failed: %v", err) helpers.SetFlash(w, r, "Failed to create syndicate") } else { helpers.SetFlash(w, r, "Syndicate created successfully") } http.Redirect(w, r, "/syndicate", http.StatusSeeOther) default: helpers.RenderError(w, r, http.StatusMethodNotAllowed) } } } func ListSyndicatesHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { userID, ok := helpers.GetCurrentUserID(r) if !ok { helpers.RenderError(w, r, 403) // ToDo need to make this use the handler so i dont need to define errors. return } managed := storage.GetSyndicatesByOwner(db, userID) member := storage.GetSyndicatesByMember(db, userID) // Filter out syndicates where the user is both the owner and a member managedMap := make(map[int]bool) for _, s := range managed { managedMap[s.ID] = true } var filteredJoined []models.Syndicate for _, s := range member { if !managedMap[s.ID] { filteredJoined = append(filteredJoined, s) } } data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) context["ManagedSyndicates"] = managed context["JoinedSyndicates"] = filteredJoined tmpl := helpers.LoadTemplateFiles("syndicates.html", "templates/syndicate/index.html") tmpl.ExecuteTemplate(w, "layout", context) } } func ViewSyndicateHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { userID, ok := helpers.GetCurrentUserID(r) if !ok { helpers.RenderError(w, r, 403) return } syndicateID := helpers.Atoi(r.URL.Query().Get("id")) syndicate, err := storage.GetSyndicateByID(db, syndicateID) if err != nil || syndicate == nil { helpers.RenderError(w, r, 404) return } isManager := userID == syndicate.OwnerID isMember := storage.IsSyndicateMember(db, syndicateID, userID) if !isManager && !isMember { helpers.RenderError(w, r, 403) return } members := storage.GetSyndicateMembers(db, syndicateID) data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) context["Syndicate"] = syndicate context["Members"] = members context["IsManager"] = isManager tmpl := helpers.LoadTemplateFiles("syndicate-view.html", "templates/syndicate/view.html") tmpl.ExecuteTemplate(w, "layout", context) } } func SyndicateLogTicketHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { userID, ok := helpers.GetCurrentUserID(r) if !ok { helpers.RenderError(w, r, 403) return } syndicateId := helpers.Atoi(r.URL.Query().Get("id")) syndicate, err := storage.GetSyndicateByID(db, syndicateId) if err != nil || syndicate.OwnerID != userID { helpers.RenderError(w, r, 403) return } switch r.Method { case http.MethodGet: data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) context["Syndicate"] = syndicate tmpl := helpers.LoadTemplateFiles("syndicate-log-ticket.html", "templates/syndicate/log_ticket.html") tmpl.ExecuteTemplate(w, "layout", context) case http.MethodPost: gameType := r.FormValue("game_type") drawDate := r.FormValue("draw_date") method := r.FormValue("purchase_method") err := storage.InsertTicket(db, models.Ticket{ UserId: userID, GameType: gameType, DrawDate: drawDate, PurchaseMethod: method, SyndicateId: &syndicateId, // ToDo image path }) if err != nil { helpers.SetFlash(w, r, "Failed to add ticket.") } else { helpers.SetFlash(w, r, "Ticket added for syndicate.") } http.Redirect(w, r, fmt.Sprintf("/syndicate/view?id=%d", syndicateId), http.StatusSeeOther) default: helpers.RenderError(w, r, 405) } } } func SyndicateTicketsHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { userID, ok := helpers.GetCurrentUserID(r) if !ok { helpers.RenderError(w, r, 403) return } syndicateID := helpers.Atoi(r.URL.Query().Get("id")) if syndicateID == 0 { helpers.RenderError(w, r, 400) return } // Check membership if !storage.IsSyndicateMember(db, syndicateID, userID) { helpers.RenderError(w, r, 403) return } tickets := storage.GetSyndicateTickets(db, syndicateID) data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) context["SyndicateID"] = syndicateID context["Tickets"] = tickets tmpl := helpers.LoadTemplateFiles("syndicate-tickets.html", "templates/syndicate/tickets.html") tmpl.ExecuteTemplate(w, "layout", context) } }