180 lines
6.2 KiB
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,
|
|
})
|
|
}
|