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

124 lines
3.6 KiB
Go

package handlers
import (
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
"github.com/gofiber/fiber/v2"
)
// InitiateDirectDeposit godoc
// @Summary Initiate a direct deposit
// @Description Customer initiates a direct deposit from mobile banking
// @Tags Direct Deposits
// @Accept json
// @Produce json
// @Param request body domain.DirectDepositRequest true "Deposit details"
// @Success 201 {object} domain.Response
// @Failure 400 {object} domain.ErrorResponse
// @Failure 500 {object} domain.ErrorResponse
// @Router /api/v1/direct_deposit [post]
func (h *Handler) InitiateDirectDeposit(c *fiber.Ctx) error {
var req domain.DirectDepositRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{
Error: err.Error(),
Message: "Invalid request payload",
})
}
deposit, err := h.walletSvc.InitiateDirectDeposit(
c.Context(),
req.CustomerID,
req.Amount,
req.BankReference,
req.SenderAccount,
)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{
Error: err.Error(),
Message: "Failed to initiate direct deposit",
})
}
return c.Status(fiber.StatusCreated).JSON(domain.Response{
Message: "Direct deposit initiated successfully",
Data: deposit,
Success: true,
StatusCode: fiber.StatusCreated,
})
}
// VerifyDirectDeposit godoc
// @Summary Verify a direct deposit
// @Description Cashier verifies a direct deposit transaction
// @Tags Direct Deposits
// @Accept json
// @Produce json
// @Param request body domain.VerifyDepositRequest true "Verification details"
// @Success 200 {object} domain.Response
// @Failure 400 {object} domain.ErrorResponse
// @Failure 401 {object} domain.ErrorResponse
// @Failure 500 {object} domain.ErrorResponse
// @Router /api/v1/direct_deposit/verify [post]
func (h *Handler) VerifyDirectDeposit(c *fiber.Ctx) error {
var req domain.VerifyDirectDepositRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{
Error: err.Error(),
Message: "Invalid verification request",
})
}
cashierID := c.Locals("user_id")
if cashierID == nil {
return c.Status(fiber.StatusUnauthorized).JSON(domain.ErrorResponse{
Error: "missing user_id in context",
Message: "Unauthorized access",
})
}
deposit, err := h.walletSvc.VerifyDirectDeposit(
c.Context(),
req.DepositID,
cashierID.(int64),
req.IsVerified,
req.Notes,
)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{
Error: err.Error(),
Message: "Failed to verify deposit",
})
}
return c.Status(fiber.StatusOK).JSON(domain.Response{
Message: "Deposit verification processed successfully",
Data: deposit,
Success: true,
StatusCode: fiber.StatusOK,
})
}
// GetPendingDeposits godoc
// @Summary Get pending direct deposits
// @Description Get list of direct deposits needing verification
// @Tags Direct Deposits
// @Produce json
// @Success 200 {object} domain.Response
// @Failure 500 {object} domain.ErrorResponse
// @Router /api/v1/direct_deposit/pending [get]
func (h *Handler) GetPendingDirectDeposits(c *fiber.Ctx) error {
deposits, err := h.walletSvc.GetPendingDirectDeposits(c.Context())
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{
Error: err.Error(),
Message: "Failed to retrieve pending deposits",
})
}
return c.Status(fiber.StatusOK).JSON(domain.Response{
Message: "Pending deposits retrieved successfully",
Data: deposits,
Success: true,
StatusCode: fiber.StatusOK,
})
}