202 lines
7.8 KiB
Go
202 lines
7.8 KiB
Go
package handler
|
|
|
|
import (
|
|
"apskel-pos-be/internal/appcontext"
|
|
"apskel-pos-be/internal/util"
|
|
"strconv"
|
|
|
|
"apskel-pos-be/internal/constants"
|
|
"apskel-pos-be/internal/contract"
|
|
"apskel-pos-be/internal/logger"
|
|
"apskel-pos-be/internal/service"
|
|
"apskel-pos-be/internal/validator"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type VendorHandler struct {
|
|
vendorService service.VendorService
|
|
vendorValidator validator.VendorValidator
|
|
}
|
|
|
|
func NewVendorHandler(
|
|
vendorService service.VendorService,
|
|
vendorValidator validator.VendorValidator,
|
|
) *VendorHandler {
|
|
return &VendorHandler{
|
|
vendorService: vendorService,
|
|
vendorValidator: vendorValidator,
|
|
}
|
|
}
|
|
|
|
func (h *VendorHandler) CreateVendor(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
var req contract.CreateVendorRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
logger.FromContext(c.Request.Context()).WithError(err).Error("VendorHandler::CreateVendor -> request binding failed")
|
|
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error())
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VendorHandler::CreateVendor")
|
|
return
|
|
}
|
|
|
|
validationError, validationErrorCode := h.vendorValidator.ValidateCreateVendorRequest(&req)
|
|
if validationError != nil {
|
|
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VendorHandler::CreateVendor")
|
|
return
|
|
}
|
|
|
|
vendorResponse := h.vendorService.CreateVendor(ctx, contextInfo, &req)
|
|
if vendorResponse.HasErrors() {
|
|
errorResp := vendorResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("VendorHandler::CreateVendor -> Failed to create vendor from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, vendorResponse, "VendorHandler::CreateVendor")
|
|
}
|
|
|
|
func (h *VendorHandler) UpdateVendor(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
vendorIDStr := c.Param("id")
|
|
vendorID, err := uuid.Parse(vendorIDStr)
|
|
if err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("VendorHandler::UpdateVendor -> Invalid vendor ID")
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid vendor ID")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VendorHandler::UpdateVendor")
|
|
return
|
|
}
|
|
|
|
var req contract.UpdateVendorRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("VendorHandler::UpdateVendor -> request binding failed")
|
|
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, "Invalid request body")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VendorHandler::UpdateVendor")
|
|
return
|
|
}
|
|
|
|
validationError, validationErrorCode := h.vendorValidator.ValidateUpdateVendorRequest(&req)
|
|
if validationError != nil {
|
|
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VendorHandler::UpdateVendor")
|
|
return
|
|
}
|
|
|
|
vendorResponse := h.vendorService.UpdateVendor(ctx, contextInfo, vendorID, &req)
|
|
if vendorResponse.HasErrors() {
|
|
errorResp := vendorResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("VendorHandler::UpdateVendor -> Failed to update vendor from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, vendorResponse, "VendorHandler::UpdateVendor")
|
|
}
|
|
|
|
func (h *VendorHandler) DeleteVendor(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
vendorIDStr := c.Param("id")
|
|
vendorID, err := uuid.Parse(vendorIDStr)
|
|
if err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("VendorHandler::DeleteVendor -> Invalid vendor ID")
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid vendor ID")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VendorHandler::DeleteVendor")
|
|
return
|
|
}
|
|
|
|
vendorResponse := h.vendorService.DeleteVendor(ctx, contextInfo, vendorID)
|
|
if vendorResponse.HasErrors() {
|
|
errorResp := vendorResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("VendorHandler::DeleteVendor -> Failed to delete vendor from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, vendorResponse, "VendorHandler::DeleteVendor")
|
|
}
|
|
|
|
func (h *VendorHandler) GetVendor(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
vendorIDStr := c.Param("id")
|
|
vendorID, err := uuid.Parse(vendorIDStr)
|
|
if err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("VendorHandler::GetVendor -> Invalid vendor ID")
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid vendor ID")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VendorHandler::GetVendor")
|
|
return
|
|
}
|
|
|
|
vendorResponse := h.vendorService.GetVendorByID(ctx, contextInfo, vendorID)
|
|
if vendorResponse.HasErrors() {
|
|
errorResp := vendorResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("VendorHandler::GetVendor -> Failed to get vendor from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, vendorResponse, "VendorHandler::GetVendor")
|
|
}
|
|
|
|
func (h *VendorHandler) ListVendors(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
req := &contract.ListVendorsRequest{
|
|
Page: 1,
|
|
Limit: 10,
|
|
}
|
|
|
|
// Parse query parameters
|
|
if pageStr := c.Query("page"); pageStr != "" {
|
|
if page, err := strconv.Atoi(pageStr); err == nil {
|
|
req.Page = page
|
|
}
|
|
}
|
|
|
|
if limitStr := c.Query("limit"); limitStr != "" {
|
|
if limit, err := strconv.Atoi(limitStr); err == nil {
|
|
req.Limit = limit
|
|
}
|
|
}
|
|
|
|
if search := c.Query("search"); search != "" {
|
|
req.Search = search
|
|
}
|
|
|
|
if isActiveStr := c.Query("is_active"); isActiveStr != "" {
|
|
if isActive, err := strconv.ParseBool(isActiveStr); err == nil {
|
|
req.IsActive = &isActive
|
|
}
|
|
}
|
|
|
|
validationError, validationErrorCode := h.vendorValidator.ValidateListVendorsRequest(req)
|
|
if validationError != nil {
|
|
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "VendorHandler::ListVendors")
|
|
return
|
|
}
|
|
|
|
vendorResponse := h.vendorService.ListVendors(ctx, contextInfo, req)
|
|
if vendorResponse.HasErrors() {
|
|
errorResp := vendorResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("VendorHandler::ListVendors -> Failed to list vendors from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, vendorResponse, "VendorHandler::ListVendors")
|
|
}
|
|
|
|
func (h *VendorHandler) GetActiveVendors(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
vendorResponse := h.vendorService.GetActiveVendors(ctx, contextInfo)
|
|
if vendorResponse.HasErrors() {
|
|
errorResp := vendorResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("VendorHandler::GetActiveVendors -> Failed to get active vendors from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, vendorResponse, "VendorHandler::GetActiveVendors")
|
|
}
|