Yimaru-BackEnd/internal/web_server/handlers/arifpay.go

180 lines
6.2 KiB
Go

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,
})
}