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") }