package handlers import ( "strconv" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/response" "github.com/gofiber/fiber/v2" ) // CreateTicket godoc // @Summary Create a temporary ticket // @Description Creates a temporary ticket // @Tags ticket // @Accept json // @Produce json // @Param createTicket body CreateTicketReq true "Creates ticket" // @Success 200 {object} CreateTicketRes // @Failure 400 {object} response.APIResponse // @Failure 500 {object} response.APIResponse // @Router /ticket [post] func (h *Handler) CreateTicket(c *fiber.Ctx) error { type CreateTicketReq struct { Outcomes []int64 `json:"outcomes" validate:"required" example:"[1, 2, 3]"` Amount float32 `json:"amount" validate:"required" example:"100.0"` TotalOdds float32 `json:"total_odds" validate:"required" example:"4.22"` } type CreateTicketRes struct { FastCode int64 `json:"fast_code" example:"1234"` } var req CreateTicketReq if err := c.BodyParser(&req); err != nil { h.logger.Error("Failed to parse CreateTicket request", "error", err) return fiber.NewError(fiber.StatusBadRequest, "Invalid request body") } if valErrs, ok := h.validator.Validate(c, req); !ok { return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", valErrs, nil) } // TODO: Validate Outcomes Here and make sure they didn't expire ticket, err := h.ticketSvc.CreateTicket(c.Context(), domain.CreateTicket{ Outcomes: req.Outcomes, Amount: domain.Currency(req.Amount), TotalOdds: req.TotalOdds, }) if err != nil { h.logger.Error("Failed to create ticket", "error", err) return fiber.NewError(fiber.StatusInternalServerError, "Failed to create ticket") } res := CreateTicketRes{ FastCode: ticket.ID, } return response.WriteJSON(c, fiber.StatusOK, "Ticket created successfully", res, nil) } // GetTicketByID godoc // @Summary Get ticket by ID // @Description Retrieve ticket details by ticket ID // @Tags ticket // @Accept json // @Produce json // @Param id path int true "Ticket ID" // @Success 200 {object} TicketRes // @Failure 400 {object} response.APIResponse // @Failure 500 {object} response.APIResponse // @Router /ticket/{id} [get] func (h *Handler) GetTicketByID(c *fiber.Ctx) error { type TicketRes struct { ID int64 `json:"id" example:"1"` Outcomes []domain.Outcome `json:"outcomes"` Amount float32 `json:"amount" example:"100.0"` TotalOdds float32 `json:"total_odds" example:"4.22"` } ticketID := c.Params("id") id, err := strconv.ParseInt(ticketID, 10, 64) if err != nil { h.logger.Error("Invalid ticket ID", "ticketID", ticketID, "error", err) return fiber.NewError(fiber.StatusBadRequest, "Invalid ticket ID") } ticket, err := h.ticketSvc.GetTicketByID(c.Context(), id) if err != nil { h.logger.Error("Failed to get ticket by ID", "ticketID", id, "error", err) return fiber.NewError(fiber.StatusInternalServerError, "Failed to retrieve ticket") } res := TicketRes{ ID: ticket.ID, Outcomes: ticket.Outcomes, Amount: ticket.Amount.Float64(), TotalOdds: ticket.TotalOdds, } return response.WriteJSON(c, fiber.StatusOK, "Ticket retrieved successfully", res, nil) } // GetAllTickets godoc // @Summary Get all tickets // @Description Retrieve all tickets // @Tags ticket // @Accept json // @Produce json // @Success 200 {array} TicketRes // @Failure 400 {object} response.APIResponse // @Failure 500 {object} response.APIResponse // @Router /ticket [get] func (h *Handler) GetAllTickets(c *fiber.Ctx) error { type TicketRes struct { ID int64 `json:"id" example:"1"` Outcomes []domain.Outcome `json:"outcomes"` Amount float32 `json:"amount" example:"100.0"` TotalOdds float32 `json:"total_odds" example:"4.22"` } tickets, err := h.ticketSvc.GetAllTickets(c.Context()) if err != nil { h.logger.Error("Failed to get tickets", "error", err) return fiber.NewError(fiber.StatusInternalServerError, "Failed to retrieve tickets") } res := make([]TicketRes, len(tickets)) for i, ticket := range tickets { res[i] = TicketRes{ ID: ticket.ID, Outcomes: ticket.Outcomes, Amount: ticket.Amount.Float64(), TotalOdds: ticket.TotalOdds, } } return response.WriteJSON(c, fiber.StatusOK, "All tickets retrieved successfully", res, nil) }