2026-09-30 09:36:18 +07:00
|
|
|
package handler
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"github.com/google/uuid"
|
|
|
|
|
|
|
|
|
|
"apskel-pos-be/internal/appcontext"
|
|
|
|
|
"apskel-pos-be/internal/constants"
|
|
|
|
|
"apskel-pos-be/internal/contract"
|
|
|
|
|
"apskel-pos-be/internal/logger"
|
|
|
|
|
"apskel-pos-be/internal/models"
|
|
|
|
|
"apskel-pos-be/internal/service"
|
|
|
|
|
"apskel-pos-be/internal/util"
|
|
|
|
|
"apskel-pos-be/internal/validator"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// WalletAdminHandler serves /marketing/customers/:id/wallet (docs/prd-point-coin.md F7).
|
|
|
|
|
type WalletAdminHandler struct {
|
|
|
|
|
walletAdminService service.WalletAdminService
|
|
|
|
|
walletValidator validator.WalletValidator
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewWalletAdminHandler(walletAdminService service.WalletAdminService, walletValidator validator.WalletValidator) *WalletAdminHandler {
|
|
|
|
|
return &WalletAdminHandler{walletAdminService: walletAdminService, walletValidator: walletValidator}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (h *WalletAdminHandler) GetCustomerWallet(c *gin.Context) {
|
|
|
|
|
ctx := c.Request.Context()
|
|
|
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
|
|
|
|
|
|
customerID, err := uuid.Parse(c.Param("id"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{
|
|
|
|
|
contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid customer ID"),
|
|
|
|
|
}), "WalletAdminHandler::GetCustomerWallet")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var query models.ListCustomerWalletTransactionsQuery
|
|
|
|
|
if err := c.ShouldBindQuery(&query); err != nil {
|
|
|
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{
|
|
|
|
|
contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, err.Error()),
|
|
|
|
|
}), "WalletAdminHandler::GetCustomerWallet")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
response := h.walletAdminService.GetCustomerWallet(ctx, contextInfo, customerID, query)
|
|
|
|
|
if response.HasErrors() {
|
|
|
|
|
logger.FromContext(ctx).WithError(response.GetErrors()[0]).Error("WalletAdminHandler::GetCustomerWallet -> service call failed")
|
|
|
|
|
}
|
|
|
|
|
util.HandleResponse(c.Writer, c.Request, response, "WalletAdminHandler::GetCustomerWallet")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (h *WalletAdminHandler) AdjustCustomerWallet(c *gin.Context) {
|
|
|
|
|
ctx := c.Request.Context()
|
|
|
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
|
|
|
|
|
|
customerID, err := uuid.Parse(c.Param("id"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{
|
|
|
|
|
contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid customer ID"),
|
|
|
|
|
}), "WalletAdminHandler::AdjustCustomerWallet")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var req contract.AdjustCustomerWalletRequest
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
|
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{
|
|
|
|
|
contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error()),
|
|
|
|
|
}), "WalletAdminHandler::AdjustCustomerWallet")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if validationError, code := h.walletValidator.ValidateAdjustRequest(&req); validationError != nil {
|
|
|
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{
|
|
|
|
|
contract.NewResponseError(code, constants.RequestEntity, validationError.Error()),
|
|
|
|
|
}), "WalletAdminHandler::AdjustCustomerWallet")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
response := h.walletAdminService.AdjustCustomerWallet(ctx, contextInfo, customerID, &req)
|
|
|
|
|
if response.HasErrors() {
|
|
|
|
|
logger.FromContext(ctx).WithError(response.GetErrors()[0]).Error("WalletAdminHandler::AdjustCustomerWallet -> service call failed")
|
|
|
|
|
}
|
|
|
|
|
util.HandleResponse(c.Writer, c.Request, response, "WalletAdminHandler::AdjustCustomerWallet")
|
|
|
|
|
}
|
2026-09-30 12:25:17 +07:00
|
|
|
|
|
|
|
|
// TraceTransaction is GET /marketing/wallet-transactions/:id/trace.
|
|
|
|
|
func (h *WalletAdminHandler) TraceTransaction(c *gin.Context) {
|
|
|
|
|
ctx := c.Request.Context()
|
|
|
|
|
transactionID, ok := parseUUIDParam(c, "id", "WalletAdminHandler::TraceTransaction")
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
response := h.walletAdminService.TraceTransaction(ctx, appcontext.FromGinContext(ctx), transactionID)
|
|
|
|
|
if response.HasErrors() {
|
|
|
|
|
logger.FromContext(ctx).WithError(response.GetErrors()[0]).Error("WalletAdminHandler::TraceTransaction -> service call failed")
|
|
|
|
|
}
|
|
|
|
|
util.HandleResponse(c.Writer, c.Request, response, "WalletAdminHandler::TraceTransaction")
|
|
|
|
|
}
|