chore: custom validation error messages

This commit is contained in:
2025-06-05 02:53:04 +01:00
parent b70bdba0dc
commit a67726919d
4 changed files with 45 additions and 12 deletions
+34 -3
View File
@@ -1,6 +1,7 @@
package api package api
import ( import (
"fmt"
"net/http" "net/http"
"regexp" "regexp"
@@ -12,10 +13,40 @@ type CustomValidator struct {
validator *validator.Validate validator *validator.Validate
} }
func (validator *CustomValidator) Validate(i any) error { func (v *CustomValidator) Validate(i any) error {
if err := validator.validator.Struct(i); err != nil { if err := v.validator.Struct(i); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error()) if validationErrors, ok := err.(validator.ValidationErrors); ok {
errors := make(map[string]string)
for _, ve := range validationErrors {
field := ve.Field()
tag := ve.Tag()
var msg string
switch tag {
case "required":
msg = fmt.Sprintf("%s is required!", field)
case "email":
msg = fmt.Sprintf("%s must be a valid email!", field)
case "alpha":
msg = fmt.Sprintf("%s must only contain alphabetic characters!", field)
case "e164":
msg = fmt.Sprintf("%s must be a valid phone number in e164 format!", field)
case "password":
msg = fmt.Sprintf("%s must have at lease one uppercase, one lowercase, one number and one special character!", field)
case "eqcsfield":
msg = fmt.Sprintf("%s must be the same as %s!", field, ve.Param())
default:
msg = fmt.Sprintf("%s is not valid!", field)
}
errors[field] = msg
}
return echo.NewHTTPError(http.StatusBadRequest, errors)
}
} }
return nil return nil
} }
+3 -1
View File
@@ -1,6 +1,8 @@
package models package models
import ( import (
"strings"
"github.com/hazemKrimi/crimson-vault/internal/types" "github.com/hazemKrimi/crimson-vault/internal/types"
) )
@@ -77,7 +79,7 @@ func (db *DB) UpdateUserSecurityDetails(id int, body types.UpdateUserSecurityDet
} }
result = db.instance.Model(user).Updates(types.User{ result = db.instance.Model(user).Updates(types.User{
Username: body.Username, Username: strings.ToLower(body.Username),
Password: body.Password, Password: body.Password,
}) })
+4 -4
View File
@@ -21,21 +21,21 @@ type Client struct {
} }
type CreateClientRequestBody struct { type CreateClientRequestBody struct {
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required,alpha"`
FiscalCode string `json:"fiscalCode"` FiscalCode string `json:"fiscalCode"`
Address string `json:"address" validate:"required"` Address string `json:"address" validate:"required"`
Zip string `json:"zip" validate:"required"` Zip string `json:"zip" validate:"required"`
Country string `json:"country" validate:"required"` Country string `json:"country" validate:"required,alpha"`
Phone string `json:"phone" validate:"required,e164"` Phone string `json:"phone" validate:"required,e164"`
Email string `json:"email" validate:"required,email"` Email string `json:"email" validate:"required,email"`
} }
type UpdateClientRequestBody struct { type UpdateClientRequestBody struct {
Name string `json:"name"` Name string `json:"name" validate:"omitempty,alpha"`
FiscalCode string `json:"fiscalCode"` FiscalCode string `json:"fiscalCode"`
Address string `json:"address"` Address string `json:"address"`
Zip string `json:"zip"` Zip string `json:"zip"`
Country string `json:"country"` Country string `json:"country" validate:"omitempty,alpha"`
Phone string `json:"phone" validate:"omitempty,e164"` Phone string `json:"phone" validate:"omitempty,e164"`
Email string `json:"email" validate:"omitempty,email"` Email string `json:"email" validate:"omitempty,email"`
} }
+4 -4
View File
@@ -24,21 +24,21 @@ type User struct {
} }
type CreateUserRequestBody struct { type CreateUserRequestBody struct {
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required,alpha"`
FiscalCode string `json:"fiscalCode" validate:"required"` FiscalCode string `json:"fiscalCode" validate:"required"`
Address string `json:"address" validate:"required"` Address string `json:"address" validate:"required"`
Zip string `json:"zip" validate:"required"` Zip string `json:"zip" validate:"required"`
Country string `json:"country" validate:"required"` Country string `json:"country" validate:"required,alpha"`
Phone string `json:"phone" validate:"required,e164"` Phone string `json:"phone" validate:"required,e164"`
Email string `json:"email" validate:"required,email"` Email string `json:"email" validate:"required,email"`
} }
type UpdateUserRequestBody struct { type UpdateUserRequestBody struct {
Name string `json:"name"` Name string `json:"name" validate:"omitempty,alpha"`
FiscalCode string `json:"fiscalCode"` FiscalCode string `json:"fiscalCode"`
Address string `json:"address"` Address string `json:"address"`
Zip string `json:"zip"` Zip string `json:"zip"`
Country string `json:"country"` Country string `json:"country" validate:"omitempty,alpha"`
Phone string `json:"phone" validate:"omitempty,e164"` Phone string `json:"phone" validate:"omitempty,e164"`
Email string `json:"email" validate:"omitempty,email"` Email string `json:"email" validate:"omitempty,email"`
} }