From 4e1e9892ac7d44b7acdb3cae095a5cf959d5fb1d Mon Sep 17 00:00:00 2001 From: AzenKain Date: Tue, 14 Apr 2026 17:33:58 +0700 Subject: [PATCH] UPDATE: fix bug --- internal/controllers/authController.go | 10 +-- internal/controllers/mediaController.go | 8 +-- internal/controllers/userController.go | 8 +-- .../controllers/verificationController.go | 6 +- internal/dtos/response/common.go | 2 + pkg/validator/validator.go | 66 +++++++++---------- 6 files changed, 51 insertions(+), 49 deletions(-) diff --git a/internal/controllers/authController.go b/internal/controllers/authController.go index 626f6b4..c67d3e6 100644 --- a/internal/controllers/authController.go +++ b/internal/controllers/authController.go @@ -48,7 +48,7 @@ func (h *AuthController) Signin(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } @@ -102,7 +102,7 @@ func (h *AuthController) Signup(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } @@ -221,7 +221,7 @@ func (h *AuthController) VerifyToken(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } @@ -258,7 +258,7 @@ func (h *AuthController) CreateToken(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } @@ -295,7 +295,7 @@ func (h *AuthController) ForgotPassword(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } diff --git a/internal/controllers/mediaController.go b/internal/controllers/mediaController.go index c2326f7..0d5d0b7 100644 --- a/internal/controllers/mediaController.go +++ b/internal/controllers/mediaController.go @@ -67,7 +67,7 @@ func (m *MediaController) SearchMedia(c fiber.Ctx) error { if err := validator.ValidateQueryDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } res, err := m.service.SearchMedia(ctx, dto) @@ -158,7 +158,7 @@ func (m *MediaController) BulkDeleteMedia(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } @@ -233,7 +233,7 @@ func (m *MediaController) GeneratePresignedURL(c fiber.Ctx) error { if err := validator.ValidateQueryDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } res, err := m.service.GeneratePresignedURL(ctx, c.Locals("uid").(string), dto) @@ -266,7 +266,7 @@ func (m *MediaController) PreSignedCompleted(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } res, err := m.service.PreSignedCompleted(ctx, c.Locals("uid").(string), dto) diff --git a/internal/controllers/userController.go b/internal/controllers/userController.go index b7a3ffe..8286c2f 100644 --- a/internal/controllers/userController.go +++ b/internal/controllers/userController.go @@ -188,7 +188,7 @@ func (h *UserController) UpdateProfile(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } @@ -225,7 +225,7 @@ func (h *UserController) ChangePassword(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } err := h.service.ChangePassword(ctx, c.Locals("uid").(string), dto) @@ -318,7 +318,7 @@ func (h *UserController) ChangeRoleUser(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } claimsVal := c.Locals("user_claims") @@ -398,7 +398,7 @@ func (h *UserController) SearchUser(c fiber.Ctx) error { if err := validator.ValidateQueryDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } res, err := h.service.SearchUser(ctx, dto) diff --git a/internal/controllers/verificationController.go b/internal/controllers/verificationController.go index c5434c7..74d8585 100644 --- a/internal/controllers/verificationController.go +++ b/internal/controllers/verificationController.go @@ -64,7 +64,7 @@ func (m *VerificationController) SearchVerification(c fiber.Ctx) error { if err := validator.ValidateQueryDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } res, err := m.service.SearchVerification(ctx, dto) @@ -138,7 +138,7 @@ func (m *VerificationController) CreateVerification(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } res, err := m.service.CreateVerification(ctx, c.Locals("uid").(string), dto) @@ -171,7 +171,7 @@ func (m *VerificationController) UpdateVerificationStatus(c fiber.Ctx) error { if err := validator.ValidateBodyDto(c, dto); err != nil { return c.Status(fiber.StatusBadRequest).JSON(response.CommonResponse{ Status: false, - Message: err.Error(), + Errors: err, }) } verificationId := c.Params("id") diff --git a/internal/dtos/response/common.go b/internal/dtos/response/common.go index d7636cf..90c0545 100644 --- a/internal/dtos/response/common.go +++ b/internal/dtos/response/common.go @@ -9,6 +9,7 @@ import ( type CommonResponse struct { Status bool `json:"status"` Data any `json:"data"` + Errors any `json:"errors"` Message string `json:"message"` } @@ -30,6 +31,7 @@ type PaginatedResponse struct { Status bool `json:"status"` Message string `json:"message"` Data any `json:"data"` + Errors any `json:"errors"` Pagination *PaginationMeta `json:"pagination"` } diff --git a/pkg/validator/validator.go b/pkg/validator/validator.go index d5f63b9..20bb804 100644 --- a/pkg/validator/validator.go +++ b/pkg/validator/validator.go @@ -32,7 +32,6 @@ func init() { } return isImageURL(val) }) - } func isImageURL(u string) bool { @@ -52,68 +51,69 @@ func isImageURL(u string) bool { } type ErrorResponse struct { - FailedField string `json:"failed_field"` - Tag string `json:"tag"` - Value string `json:"value"` + FailedField string `json:"failed_field,omitempty"` + Tag string `json:"tag,omitempty"` + Value string `json:"value,omitempty"` Message string `json:"message"` } -func formatValidationError(err error) []ErrorResponse { +func formatValidationError(err error) []*ErrorResponse { var validationErrors validator.ValidationErrors - var errorsList []ErrorResponse + var errorsList []*ErrorResponse if errors.As(err, &validationErrors) { for _, fieldError := range validationErrors { - var element ErrorResponse - element.FailedField = fieldError.Field() - element.Tag = fieldError.Tag() - element.Value = fieldError.Param() + message := "" switch fieldError.Tag() { case "required": - element.Message = fieldError.Field() + " is required" - case "min": - element.Message = fieldError.Field() + " must be at least " + fieldError.Param() + " characters" - case "max": - element.Message = fieldError.Field() + " must be at most " + fieldError.Param() + " characters" + message = fieldError.Field() + " is mandatory" case "email": - element.Message = "Invalid email format" + message = "The email address is invalid" + case "min": + message = fieldError.Field() + " is too short (min " + fieldError.Param() + ")" + case "max": + message = fieldError.Field() + " is too long (max " + fieldError.Param() + ")" + case "image_url": + message = fieldError.Field() + " must be a link to an image (jpg, png, etc.)" default: - element.Message = fieldError.Error() + message = "Field " + fieldError.Field() + " failed on validation: " + fieldError.Tag() } - errorsList = append(errorsList, element) + + errorsList = append(errorsList, &ErrorResponse{ + FailedField: fieldError.Field(), + Tag: fieldError.Tag(), + Value: fieldError.Param(), + Message: message, + }) } + } else { + errorsList = append(errorsList, &ErrorResponse{ + Message: "Invalid request payload: " + err.Error(), + }) } return errorsList } -func ValidateQueryDto(c fiber.Ctx, dto any) error { +func ValidateQueryDto(c fiber.Ctx, dto any) []*ErrorResponse { if err := c.Bind().Query(dto); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ - "error": "Failed to parse query parameters: " + err.Error(), - }) + return formatValidationError(err) } if err := validate.Struct(dto); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ - "errors": formatValidationError(err), - }) + return formatValidationError(err) } return nil } -func ValidateBodyDto(c fiber.Ctx, dto any) error { +func ValidateBodyDto(c fiber.Ctx, dto any) []*ErrorResponse { if err := c.Bind().Body(dto); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ - "error": "Invalid request body: " + err.Error(), - }) + return formatValidationError(err) } if err := validate.Struct(dto); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ - "errors": formatValidationError(err), - }) + return formatValidationError(err) } return nil -} +} \ No newline at end of file