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