package handlers import ( "database/sql" "html/template" "log" "net/http" "strconv" ory "github.com/ory/client-go" "decor-by-hannahs/internal/db" ) type AdminBooking struct { ID int64 UserEmail string ServiceName string ServiceOption string EventType string EventDate string Address string Notes string Status string CreatedAt string } type AdminData struct { ActivePage string Authenticated bool OryLoginURL string Bookings []AdminBooking } func AdminHandler(q *db.Queries, tmpl *template.Template, oryClient *ory.APIClient) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { data := AdminData{ ActivePage: "admin", Authenticated: isAuthenticated(r, oryClient), OryLoginURL: "/login", } bookings, err := q.ListAllBookingsWithDetails(r.Context()) if err != nil { log.Printf("Error fetching bookings: %v", err) } else { for _, b := range bookings { data.Bookings = append(data.Bookings, AdminBooking{ ID: b.ID, UserEmail: b.UserEmail, ServiceName: b.ServiceName, ServiceOption: nullStringToString(b.ServiceOption), EventType: nullStringToString(b.EventType), EventDate: b.EventDate.Format("January 2, 2006"), Address: nullStringToString(b.Address), Notes: nullStringToString(b.Notes), Status: nullStringToString(b.Status), CreatedAt: b.CreatedAt.Time.Format("Jan 2, 2006 3:04 PM"), }) } } if err := tmpl.ExecuteTemplate(w, "admin.tmpl", data); err != nil { log.Printf("Error rendering admin template: %v", err) http.Error(w, "Failed to render page", http.StatusInternalServerError) return } } } func AdminUpdateBookingHandler(q *db.Queries, oryClient *ory.APIClient) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) return } bookingID, err := strconv.ParseInt(r.FormValue("booking_id"), 10, 64) if err != nil { http.Error(w, "Invalid booking ID", http.StatusBadRequest) return } status := r.FormValue("status") if status == "" { http.Error(w, "Status is required", http.StatusBadRequest) return } err = q.UpdateBookingStatus(r.Context(), db.UpdateBookingStatusParams{ ID: bookingID, Status: sql.NullString{String: status, Valid: true}, }) if err != nil { log.Printf("Error updating booking: %v", err) http.Error(w, "Failed to update booking", http.StatusInternalServerError) return } http.Redirect(w, r, "/admin", http.StatusSeeOther) } }