157 lines
7.4 KiB
Go
157 lines
7.4 KiB
Go
|
|
package handler
|
||
|
|
|
||
|
|
import (
|
||
|
|
"apskel-pos-be/internal/appcontext"
|
||
|
|
"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"
|
||
|
|
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
"github.com/google/uuid"
|
||
|
|
)
|
||
|
|
|
||
|
|
type ProductVariantHandler struct {
|
||
|
|
productVariantService service.ProductVariantService
|
||
|
|
productVariantValidator validator.ProductVariantValidator
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewProductVariantHandler(
|
||
|
|
productVariantService service.ProductVariantService,
|
||
|
|
productVariantValidator validator.ProductVariantValidator,
|
||
|
|
) *ProductVariantHandler {
|
||
|
|
return &ProductVariantHandler{
|
||
|
|
productVariantService: productVariantService,
|
||
|
|
productVariantValidator: productVariantValidator,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *ProductVariantHandler) CreateProductVariant(c *gin.Context) {
|
||
|
|
ctx := c.Request.Context()
|
||
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
||
|
|
|
||
|
|
var req contract.CreateProductVariantRequest
|
||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
|
logger.FromContext(c.Request.Context()).WithError(err).Error("ProductVariantHandler::CreateProductVariant -> request binding failed")
|
||
|
|
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error())
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "ProductVariantHandler::CreateProductVariant")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
validationError, validationErrorCode := h.productVariantValidator.ValidateCreateProductVariantRequest(&req)
|
||
|
|
if validationError != nil {
|
||
|
|
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "ProductVariantHandler::CreateProductVariant")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
variantResponse := h.productVariantService.CreateProductVariant(ctx, contextInfo, &req)
|
||
|
|
if variantResponse.HasErrors() {
|
||
|
|
errorResp := variantResponse.GetErrors()[0]
|
||
|
|
logger.FromContext(ctx).WithError(errorResp).Error("ProductVariantHandler::CreateProductVariant -> Failed to create product variant from service")
|
||
|
|
}
|
||
|
|
|
||
|
|
util.HandleResponse(c.Writer, c.Request, variantResponse, "ProductVariantHandler::CreateProductVariant")
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *ProductVariantHandler) UpdateProductVariant(c *gin.Context) {
|
||
|
|
ctx := c.Request.Context()
|
||
|
|
|
||
|
|
variantIDStr := c.Param("id")
|
||
|
|
variantID, err := uuid.Parse(variantIDStr)
|
||
|
|
if err != nil {
|
||
|
|
logger.FromContext(ctx).WithError(err).Error("ProductVariantHandler::UpdateProductVariant -> Invalid variant ID")
|
||
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid variant ID")
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "ProductVariantHandler::UpdateProductVariant")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
var req contract.UpdateProductVariantRequest
|
||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
|
logger.FromContext(ctx).WithError(err).Error("ProductVariantHandler::UpdateProductVariant -> request binding failed")
|
||
|
|
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, "Invalid request body")
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "ProductVariantHandler::UpdateProductVariant")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
validationError, validationErrorCode := h.productVariantValidator.ValidateUpdateProductVariantRequest(&req)
|
||
|
|
if validationError != nil {
|
||
|
|
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "ProductVariantHandler::UpdateProductVariant")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
variantResponse := h.productVariantService.UpdateProductVariant(ctx, variantID, &req)
|
||
|
|
if variantResponse.HasErrors() {
|
||
|
|
errorResp := variantResponse.GetErrors()[0]
|
||
|
|
logger.FromContext(ctx).WithError(errorResp).Error("ProductVariantHandler::UpdateProductVariant -> Failed to update product variant from service")
|
||
|
|
}
|
||
|
|
|
||
|
|
util.HandleResponse(c.Writer, c.Request, variantResponse, "ProductVariantHandler::UpdateProductVariant")
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *ProductVariantHandler) DeleteProductVariant(c *gin.Context) {
|
||
|
|
ctx := c.Request.Context()
|
||
|
|
|
||
|
|
variantIDStr := c.Param("id")
|
||
|
|
variantID, err := uuid.Parse(variantIDStr)
|
||
|
|
if err != nil {
|
||
|
|
logger.FromContext(ctx).WithError(err).Error("ProductVariantHandler::DeleteProductVariant -> Invalid variant ID")
|
||
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid variant ID")
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "ProductVariantHandler::DeleteProductVariant")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
variantResponse := h.productVariantService.DeleteProductVariant(ctx, variantID)
|
||
|
|
if variantResponse.HasErrors() {
|
||
|
|
errorResp := variantResponse.GetErrors()[0]
|
||
|
|
logger.FromContext(ctx).WithError(errorResp).Error("ProductVariantHandler::DeleteProductVariant -> Failed to delete product variant from service")
|
||
|
|
}
|
||
|
|
|
||
|
|
util.HandleResponse(c.Writer, c.Request, variantResponse, "ProductVariantHandler::DeleteProductVariant")
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *ProductVariantHandler) GetProductVariant(c *gin.Context) {
|
||
|
|
ctx := c.Request.Context()
|
||
|
|
|
||
|
|
variantIDStr := c.Param("id")
|
||
|
|
variantID, err := uuid.Parse(variantIDStr)
|
||
|
|
if err != nil {
|
||
|
|
logger.FromContext(ctx).WithError(err).Error("ProductVariantHandler::GetProductVariant -> Invalid variant ID")
|
||
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid variant ID")
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "ProductVariantHandler::GetProductVariant")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
variantResponse := h.productVariantService.GetProductVariantByID(ctx, variantID)
|
||
|
|
if variantResponse.HasErrors() {
|
||
|
|
errorResp := variantResponse.GetErrors()[0]
|
||
|
|
logger.FromContext(ctx).WithError(errorResp).Error("ProductVariantHandler::GetProductVariant -> Failed to get product variant from service")
|
||
|
|
}
|
||
|
|
|
||
|
|
util.HandleResponse(c.Writer, c.Request, variantResponse, "ProductVariantHandler::GetProductVariant")
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *ProductVariantHandler) GetProductVariantsByProduct(c *gin.Context) {
|
||
|
|
ctx := c.Request.Context()
|
||
|
|
|
||
|
|
productIDStr := c.Param("product_id")
|
||
|
|
productID, err := uuid.Parse(productIDStr)
|
||
|
|
if err != nil {
|
||
|
|
logger.FromContext(ctx).WithError(err).Error("ProductVariantHandler::GetProductVariantsByProduct -> Invalid product ID")
|
||
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid product ID")
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "ProductVariantHandler::GetProductVariantsByProduct")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
variantsResponse := h.productVariantService.GetProductVariantsByProductID(ctx, productID)
|
||
|
|
if variantsResponse.HasErrors() {
|
||
|
|
errorResp := variantsResponse.GetErrors()[0]
|
||
|
|
logger.FromContext(ctx).WithError(errorResp).Error("ProductVariantHandler::GetProductVariantsByProduct -> Failed to get product variants from service")
|
||
|
|
}
|
||
|
|
|
||
|
|
util.HandleResponse(c.Writer, c.Request, variantsResponse, "ProductVariantHandler::GetProductVariantsByProduct")
|
||
|
|
}
|