77 lines
2.8 KiB
Go
77 lines
2.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// LaunchAleaGame godoc
|
|
// @Summary Launch an Alea Play virtual game
|
|
// @Description Generates an authenticated launch URL for Alea Play virtual games
|
|
// @Tags Alea Virtual Games
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Security BearerAuth
|
|
// @Param game_id query string true "Game identifier (e.g., 'aviator', 'plinko')"
|
|
// @Param currency query string false "Currency code (ISO 4217)" Enums(USD, EUR, GBP) default(USD)
|
|
// @Param mode query string false "Game mode" Enums(real, demo) default(real)
|
|
// @Success 200 {object} map[string]string{launch_url=string} "Returns authenticated game launch URL"
|
|
// @Failure 400 {object} map[string]string "Invalid request parameters"
|
|
// @Failure 401 {object} map[string]string "Unauthorized"
|
|
// @Failure 500 {object} map[string]string "Internal server error"
|
|
// @Router /api/v1/alea-games/launch [get]
|
|
func (h *Handler) LaunchAleaGame(c *fiber.Ctx) error {
|
|
userID := c.Locals("userID").(int64)
|
|
gameID := c.Query("game_id")
|
|
currency := c.Query("currency", "USD")
|
|
mode := c.Query("mode", "real") // real or demo
|
|
|
|
launchURL, err := h.aleaVirtualGameSvc.GenerateGameLaunchURL(c.Context(), userID, gameID, currency, mode)
|
|
if err != nil {
|
|
h.logger.Error("failed to generate Alea launch URL", "error", err)
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"error": "failed to launch game",
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"launch_url": launchURL,
|
|
})
|
|
}
|
|
|
|
// HandleAleaCallback godoc
|
|
// @Summary Process Alea Play game callback
|
|
// @Description Handles webhook callbacks from Alea Play virtual games for bet settlement
|
|
// @Tags Alea Virtual Games
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param callback body domain.AleaPlayCallback true "Callback payload"
|
|
// @Success 200 {object} map[string]string{status=string} "Callback processed successfully"
|
|
// @Failure 400 {object} map[string]string "Invalid callback format"
|
|
// @Failure 401 {object} map[string]string "Invalid signature"
|
|
// @Failure 409 {object} map[string]string "Duplicate transaction"
|
|
// @Failure 500 {object} map[string]string "Internal processing error"
|
|
// @Router /api/v1/webhooks/alea [post]
|
|
func (h *Handler) HandleAleaCallback(c *fiber.Ctx) error {
|
|
var cb domain.AleaPlayCallback
|
|
if err := c.BodyParser(&cb); err != nil {
|
|
h.logger.Error("invalid Alea callback format", "error", err)
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"error": "invalid callback format",
|
|
})
|
|
}
|
|
|
|
if err := h.aleaVirtualGameSvc.HandleCallback(c.Context(), &cb); err != nil {
|
|
h.logger.Error("failed to process Alea callback",
|
|
"transactionID", cb.TransactionID,
|
|
"error", err)
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"error": "failed to process callback",
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"status": "processed",
|
|
})
|
|
}
|