229 lines
9.1 KiB
Go
229 lines
9.1 KiB
Go
package handlers
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/response"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type TransactionRes struct {
|
|
ID int64 `json:"id" example:"1"`
|
|
Amount float32 `json:"amount" example:"100.0"`
|
|
BranchID int64 `json:"branch_id" example:"1"`
|
|
CashierID int64 `json:"cashier_id" example:"1"`
|
|
BetID int64 `json:"bet_id" example:"1"`
|
|
|
|
PaymentOption domain.PaymentOption `json:"payment_option" example:"1"`
|
|
FullName string `json:"full_name" example:"John Smith"`
|
|
PhoneNumber string `json:"phone_number" example:"0911111111"`
|
|
BankCode string `json:"bank_code"`
|
|
BeneficiaryName string `json:"beneficiary_name"`
|
|
AccountName string `json:"account_name"`
|
|
AccountNumber string `json:"account_number"`
|
|
ReferenceNumber string `json:"reference_number"`
|
|
Verified bool `json:"verified" example:"true"`
|
|
}
|
|
|
|
type CreateTransactionReq struct {
|
|
Amount float32 `json:"amount" example:"100.0"`
|
|
BranchID int64 `json:"branch_id" example:"1"`
|
|
CashierID int64 `json:"cashier_id" example:"1"`
|
|
BetID int64 `json:"bet_id" example:"1"`
|
|
PaymentOption domain.PaymentOption `json:"payment_option" example:"1"`
|
|
FullName string `json:"full_name" example:"John Smith"`
|
|
PhoneNumber string `json:"phone_number" example:"0911111111"`
|
|
// Payment Details for bank
|
|
BankCode string `json:"bank_code"`
|
|
BeneficiaryName string `json:"beneficiary_name"`
|
|
AccountName string `json:"account_name"`
|
|
AccountNumber string `json:"account_number"`
|
|
ReferenceNumber string `json:"reference_number"`
|
|
}
|
|
|
|
func convertTransaction(transaction domain.Transaction) TransactionRes {
|
|
return TransactionRes{
|
|
ID: transaction.ID,
|
|
Amount: transaction.Amount.Float64(),
|
|
BranchID: transaction.BranchID,
|
|
CashierID: transaction.CashierID,
|
|
BetID: transaction.BetID,
|
|
PaymentOption: transaction.PaymentOption,
|
|
FullName: transaction.FullName,
|
|
PhoneNumber: transaction.PhoneNumber,
|
|
BankCode: transaction.BankCode,
|
|
BeneficiaryName: transaction.BeneficiaryName,
|
|
AccountName: transaction.AccountName,
|
|
AccountNumber: transaction.AccountNumber,
|
|
ReferenceNumber: transaction.ReferenceNumber,
|
|
Verified: transaction.Verified,
|
|
}
|
|
}
|
|
|
|
// CreateTransaction godoc
|
|
// @Summary Create a transaction
|
|
// @Description Creates a transaction
|
|
// @Tags transaction
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param createBet body CreateTransactionReq true "Creates transaction"
|
|
// @Success 200 {object} TransactionRes
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /transaction [post]
|
|
// Update transaction handler to include deposit bonus
|
|
func (h *Handler) CreateTransaction(c *fiber.Ctx) error {
|
|
type CreateTransactionReq struct {
|
|
Amount float32 `json:"amount" validate:"required" example:"100.0"`
|
|
BranchID int64 `json:"branch_id" example:"1"`
|
|
CashierID int64 `json:"cashier_id" example:"1"`
|
|
BetID int64 `json:"bet_id" example:"1"`
|
|
PaymentOption domain.PaymentOption `json:"payment_option" validate:"required" example:"1"`
|
|
FullName string `json:"full_name" example:"John Smith"`
|
|
PhoneNumber string `json:"phone_number" validate:"required" example:"0911111111"`
|
|
BankCode string `json:"bank_code"`
|
|
BeneficiaryName string `json:"beneficiary_name"`
|
|
AccountName string `json:"account_name"`
|
|
AccountNumber string `json:"account_number"`
|
|
ReferenceNumber string `json:"reference_number"`
|
|
}
|
|
|
|
var req CreateTransactionReq
|
|
if err := c.BodyParser(&req); err != nil {
|
|
h.logger.Error("CreateTransaction failed to parse request", "error", err)
|
|
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
|
|
}
|
|
|
|
if valErrs, ok := h.validator.Validate(c, req); !ok {
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", valErrs, nil)
|
|
}
|
|
|
|
isDeposit := req.PaymentOption == domain.BANK
|
|
|
|
transaction, err := h.transactionSvc.CreateTransaction(c.Context(), domain.CreateTransaction{
|
|
Amount: domain.Currency(req.Amount),
|
|
BranchID: req.BranchID,
|
|
CashierID: req.CashierID,
|
|
BetID: req.BetID,
|
|
PaymentOption: req.PaymentOption,
|
|
FullName: req.FullName,
|
|
PhoneNumber: req.PhoneNumber,
|
|
BankCode: req.BankCode,
|
|
BeneficiaryName: req.BeneficiaryName,
|
|
AccountName: req.AccountName,
|
|
AccountNumber: req.AccountNumber,
|
|
ReferenceNumber: req.ReferenceNumber,
|
|
})
|
|
if err != nil {
|
|
h.logger.Error("CreateTransaction failed", "error", err)
|
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to create transaction")
|
|
}
|
|
|
|
if isDeposit {
|
|
if err := h.referralSvc.ProcessDepositBonus(c.Context(), req.PhoneNumber, float64(req.Amount)); err != nil {
|
|
h.logger.Warn("Failed to process deposit bonus", "phone", req.PhoneNumber, "amount", req.Amount, "error", err)
|
|
}
|
|
}
|
|
|
|
res := convertTransaction(transaction)
|
|
return response.WriteJSON(c, fiber.StatusOK, "Transaction created successfully", res, nil)
|
|
}
|
|
|
|
// GetAllTransactions godoc
|
|
// @Summary Gets all transactions
|
|
// @Description Gets all the transactions
|
|
// @Tags transaction
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {array} TransactionRes
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /transaction [get]
|
|
func (h *Handler) GetAllTransactions(c *fiber.Ctx) error {
|
|
transactions, err := h.transactionSvc.GetAllTransactions(c.Context())
|
|
if err != nil {
|
|
h.logger.Error("Failed to get transactions", "error", err)
|
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to retrieve transactions")
|
|
}
|
|
|
|
res := make([]TransactionRes, len(transactions))
|
|
for i, transaction := range transactions {
|
|
res[i] = convertTransaction(transaction)
|
|
}
|
|
|
|
return response.WriteJSON(c, fiber.StatusOK, "All transactions retrieved", res, nil)
|
|
}
|
|
|
|
// GetTransactionByID godoc
|
|
// @Summary Gets transaction by id
|
|
// @Description Gets a single transaction by id
|
|
// @Tags transaction
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path int true "Transaction ID"
|
|
// @Success 200 {object} TransactionRes
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /transaction/{id} [get]
|
|
func (h *Handler) GetTransactionByID(c *fiber.Ctx) error {
|
|
transactionID := c.Params("id")
|
|
id, err := strconv.ParseInt(transactionID, 10, 64)
|
|
if err != nil {
|
|
h.logger.Error("Invalid transaction ID", "transactionID", transactionID, "error", err)
|
|
return fiber.NewError(fiber.StatusBadRequest, "Invalid transaction ID")
|
|
}
|
|
|
|
transaction, err := h.transactionSvc.GetTransactionByID(c.Context(), id)
|
|
if err != nil {
|
|
h.logger.Error("Failed to get transaction by ID", "transactionID", id, "error", err)
|
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to retrieve transaction")
|
|
}
|
|
|
|
res := convertTransaction(transaction)
|
|
return response.WriteJSON(c, fiber.StatusOK, "Transaction retrieved successfully", res, nil)
|
|
}
|
|
|
|
// UpdateTransactionVerified godoc
|
|
// @Summary Updates the verified field of a transaction
|
|
// @Description Updates the verified status of a transaction
|
|
// @Tags transaction
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path int true "Transaction ID"
|
|
// @Param updateVerified body UpdateTransactionVerifiedReq true "Updates Transaction Verification"
|
|
// @Success 200 {object} response.APIResponse
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /transaction/{id} [patch]
|
|
func (h *Handler) UpdateTransactionVerified(c *fiber.Ctx) error {
|
|
type UpdateTransactionVerifiedReq struct {
|
|
Verified bool `json:"verified" validate:"required" example:"true"`
|
|
}
|
|
|
|
transactionID := c.Params("id")
|
|
id, err := strconv.ParseInt(transactionID, 10, 64)
|
|
if err != nil {
|
|
h.logger.Error("Invalid transaction ID", "transactionID", transactionID, "error", err)
|
|
return fiber.NewError(fiber.StatusBadRequest, "Invalid transaction ID")
|
|
}
|
|
|
|
var req UpdateTransactionVerifiedReq
|
|
if err := c.BodyParser(&req); err != nil {
|
|
h.logger.Error("Failed to parse UpdateTransactionVerified request", "error", err)
|
|
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
|
|
}
|
|
|
|
if valErrs, ok := h.validator.Validate(c, req); !ok {
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", valErrs, nil)
|
|
}
|
|
|
|
err = h.transactionSvc.UpdateTransactionVerified(c.Context(), id, req.Verified)
|
|
if err != nil {
|
|
h.logger.Error("Failed to update transaction verification", "transactionID", id, "error", err)
|
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to update transaction verification")
|
|
}
|
|
|
|
return response.WriteJSON(c, fiber.StatusOK, "Transaction updated successfully", nil, nil)
|
|
}
|