package handlers import ( "encoding/json" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/gofiber/fiber/v2" ) // CreateCheckoutSessionHandler initializes a checkout session with Arifpay. // // @Summary Create Arifpay Checkout Session // @Description Creates a payment session using Arifpay and returns a redirect URL. // @Tags Arifpay // @Accept json // @Produce json // @Param request body domain.CreateCheckoutSessionRequest true "Checkout session request payload" // @Success 200 {object} domain.Response // @Failure 400 {object} domain.ErrorResponse // @Failure 500 {object} domain.ErrorResponse // @Router /api/v1/arifpay/checkout [post] func (h *Handler) CreateCheckoutSessionHandler(c *fiber.Ctx) error { var req domain.CreateCheckoutSessionRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Error: err.Error(), Message: "Failed to process your request", }) } paymentURL, err := h.arifpaySvc.CreateCheckoutSession(req) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{ Error: err.Error(), Message: "Failed to process your request", }) } return c.Status(fiber.StatusOK).JSON(domain.Response{ Message: "Checkout session created successfully", Data: paymentURL, Success: true, StatusCode: fiber.StatusOK, }) } // B2CTransferHandler handles Arifpay B2C transfers based on the transfer_mode. // // @Summary Initiate B2C Transfer // @Description Initiates a B2C transfer via Telebirr, CBE, or MPESA through Arifpay // @Tags Arifpay // @Accept json // @Produce json // @Param transfer_mode query string true "Transfer mode (Telebirr, CBE, MPESA)" // @Param request body domain.ArifPayB2CRequest true "Transfer request payload" // @Success 200 {object} domain.Response // @Failure 400 {object} domain.ErrorResponse // @Failure 502 {object} domain.ErrorResponse // @Router /api/v1/arifpay/b2c/transfer [post] func (h *Handler) B2CTransferHandler(c *fiber.Ctx) error { transferMode := c.Query("transfer_mode") var endpoint string switch transferMode { case "Telebirr": endpoint = "https://telebirr-b2c.arifpay.net/api/Telebirr/b2c/transfer" case "CBE": endpoint = "https://cbe-b2c.arifpay.net/api/Cbebirr/b2c/transfer" case "MPESA": endpoint = "https://mpesa-b2c.arifpay.net/api/Mpesa/b2c/transfer" default: return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Error: "invalid transfer_mode. Allowed values: Telebirr, CBE, MPESA", Message: "Failed to process your request", }) } var req domain.ArifPayB2CRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Error: err.Error(), Message: "Failed to process your request", }) } resp, err := h.arifpaySvc.B2CTransfer(c.Context(), req, endpoint) if err != nil { return c.Status(fiber.StatusBadGateway).JSON(domain.ErrorResponse{ Error: err.Error(), Message: "Failed to process your request", }) } return c.Status(fiber.StatusOK).JSON(domain.Response{ Message: "Transfer initiated successfully", Data: resp, Success: true, StatusCode: fiber.StatusOK, }) } // ArifpayVerifyByTransactionIDHandler godoc // @Summary Verify Arifpay Transaction // @Description Verifies a transaction using transaction ID and payment type // @Tags Arifpay // @Accept json // @Produce json // @Param request body domain.ArifpayVerifyByTransactionIDRequest true "Transaction verification payload" // @Success 200 {object} domain.Response // @Failure 400 {object} domain.ErrorResponse // @Failure 502 {object} domain.ErrorResponse // @Router /api/v1/arifpay/transaction-id/verify-transaction [post] func (h *Handler) ArifpayVerifyByTransactionIDHandler(c *fiber.Ctx) error { var req domain.ArifpayVerifyByTransactionIDRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Error: err.Error(), Message: "Failed to parse request body", }) } if req.TransactionID == "" || req.PaymentType == 0 { return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Error: "missing transactionId or paymentType", Message: "transactionId and paymentType are required fields", }) } resp, err := h.arifpaySvc.VerifyByTransactionID(req.TransactionID, req.PaymentType) if err != nil { return c.Status(fiber.StatusBadGateway).JSON(domain.ErrorResponse{ Error: err.Error(), Message: "Failed to verify transaction", }) } return c.Status(fiber.StatusOK).JSON(domain.Response{ Message: "Transaction verified successfully", Data: json.RawMessage(resp), Success: true, StatusCode: fiber.StatusOK, }) } // ArifpayVerifyBySessionIDHandler godoc // @Summary Verify Arifpay Transaction by Session ID // @Description Verifies an Arifpay transaction using a session ID // @Tags Arifpay // @Accept json // @Produce json // @Param session_id query string true "Arifpay Session ID" // @Success 200 {object} domain.Response // @Failure 400 {object} domain.ErrorResponse // @Failure 502 {object} domain.ErrorResponse // @Router /api/v1/arifpay/session-id/verify-transaction/{session_id} [get] func (h *Handler) ArifpayVerifyBySessionIDHandler(c *fiber.Ctx) error { sessionID := c.Query("session_id") if sessionID == "" { return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Error: "missing session_id", Message: "session_id query parameter is required", }) } resp, err := h.arifpaySvc.VerifyBySessionID(sessionID) if err != nil { return c.Status(fiber.StatusBadGateway).JSON(domain.ErrorResponse{ Error: err.Error(), Message: "Failed to verify session", }) } return c.Status(fiber.StatusOK).JSON(domain.Response{ Message: "Session verified successfully", Data: json.RawMessage(resp), Success: true, StatusCode: fiber.StatusOK, }) }