apskel-pos-backend/internal/handler/voucher_handler.go
Aditya Siregar cfe690a40f voucher
2025-09-13 15:37:26 +07:00

178 lines
7.5 KiB
Go

package handler
import (
"apskel-pos-be/internal/constants"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/logger"
"apskel-pos-be/internal/service"
"apskel-pos-be/internal/util"
"apskel-pos-be/internal/validator"
"strconv"
"github.com/gin-gonic/gin"
)
type VoucherHandler struct {
voucherService service.VoucherService
voucherValidator validator.VoucherValidator
}
func NewVoucherHandler(
voucherService service.VoucherService,
voucherValidator validator.VoucherValidator,
) *VoucherHandler {
return &VoucherHandler{
voucherService: voucherService,
voucherValidator: voucherValidator,
}
}
func (h *VoucherHandler) GetRandomVouchersForSpin(c *gin.Context) {
ctx := c.Request.Context()
req := &contract.ListVouchersForSpinRequest{
Limit: 10, // Default limit
}
// Parse query parameters
if limitStr := c.Query("limit"); limitStr != "" {
if limit, err := strconv.Atoi(limitStr); err == nil {
req.Limit = limit
}
}
validationError, validationErrorCode := h.voucherValidator.ValidateListVouchersForSpinRequest(req)
if validationError != nil {
logger.FromContext(ctx).WithError(validationError).Error("VoucherHandler::GetRandomVouchersForSpin -> request validation failed")
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VoucherHandler::GetRandomVouchersForSpin")
return
}
vouchersResponse, err := h.voucherService.GetRandomVouchersForSpin(c.Request.Context(), req)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("VoucherHandler::GetRandomVouchersForSpin -> Failed to get random vouchers from service")
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{errorResp}), "VoucherHandler::GetRandomVouchersForSpin")
return
}
logger.FromContext(ctx).Infof("VoucherHandler::GetRandomVouchersForSpin -> Successfully retrieved %d vouchers for spin", vouchersResponse.Count)
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(vouchersResponse), "VoucherHandler::GetRandomVouchersForSpin")
}
func (h *VoucherHandler) GetRandomVouchersByRows(c *gin.Context) {
ctx := c.Request.Context()
req := &contract.ListVouchersByRowsRequest{
Rows: 4, // Default 4 rows
}
// Parse query parameters
if rowsStr := c.Query("rows"); rowsStr != "" {
if rows, err := strconv.Atoi(rowsStr); err == nil {
req.Rows = rows
}
}
// Parse winner_number parameter (optional)
if winnerNumberStr := c.Query("winner_number"); winnerNumberStr != "" {
if wn, err := strconv.Atoi(winnerNumberStr); err == nil {
req.WinnerNumber = &wn
}
}
validationError, validationErrorCode := h.voucherValidator.ValidateListVouchersByRowsRequest(req)
if validationError != nil {
logger.FromContext(ctx).WithError(validationError).Error("VoucherHandler::GetRandomVouchersByRows -> request validation failed")
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VoucherHandler::GetRandomVouchersByRows")
return
}
vouchersResponse, err := h.voucherService.GetRandomVouchersByRows(c.Request.Context(), req)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("VoucherHandler::GetRandomVouchersByRows -> Failed to get random vouchers by rows from service")
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{errorResp}), "VoucherHandler::GetRandomVouchersByRows")
return
}
logger.FromContext(ctx).Infof("VoucherHandler::GetRandomVouchersByRows -> Successfully retrieved %d rows with %d total vouchers", vouchersResponse.TotalRows, vouchersResponse.TotalVouchers)
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(vouchersResponse), "VoucherHandler::GetRandomVouchersByRows")
}
func (h *VoucherHandler) GetVoucherByID(c *gin.Context) {
ctx := c.Request.Context()
voucherID, err := strconv.ParseInt(c.Param("id"), 10, 64)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("VoucherHandler::GetVoucherByID -> Invalid voucher ID")
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid voucher ID")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VoucherHandler::GetVoucherByID")
return
}
voucherResponse, err := h.voucherService.GetVoucherByID(c.Request.Context(), voucherID)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("VoucherHandler::GetVoucherByID -> Failed to get voucher from service")
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{errorResp}), "VoucherHandler::GetVoucherByID")
return
}
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(voucherResponse), "VoucherHandler::GetVoucherByID")
}
func (h *VoucherHandler) GetVoucherByCode(c *gin.Context) {
ctx := c.Request.Context()
voucherCode := c.Param("code")
if voucherCode == "" {
logger.FromContext(ctx).Error("VoucherHandler::GetVoucherByCode -> Missing voucher code")
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, "Voucher code is required")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VoucherHandler::GetVoucherByCode")
return
}
voucherResponse, err := h.voucherService.GetVoucherByCode(c.Request.Context(), voucherCode)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("VoucherHandler::GetVoucherByCode -> Failed to get voucher from service")
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{errorResp}), "VoucherHandler::GetVoucherByCode")
return
}
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(voucherResponse), "VoucherHandler::GetVoucherByCode")
}
func (h *VoucherHandler) ListVouchers(c *gin.Context) {
ctx := c.Request.Context()
page := 1
limit := 10
// Parse query parameters
if pageStr := c.Query("page"); pageStr != "" {
if p, err := strconv.Atoi(pageStr); err == nil && p > 0 {
page = p
}
}
if limitStr := c.Query("limit"); limitStr != "" {
if l, err := strconv.Atoi(limitStr); err == nil && l > 0 && l <= 100 {
limit = l
}
}
vouchersResponse, err := h.voucherService.ListVouchers(c.Request.Context(), page, limit)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("VoucherHandler::ListVouchers -> Failed to list vouchers from service")
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{errorResp}), "VoucherHandler::ListVouchers")
return
}
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(vouchersResponse), "VoucherHandler::ListVouchers")
}