mirror of
https://github.com/raseels-repos/golang-saas-starter-kit.git
synced 2025-06-06 23:46:29 +02:00
104 lines
2.8 KiB
Go
104 lines
2.8 KiB
Go
package weberror
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext"
|
|
"github.com/iancoleman/strcase"
|
|
"github.com/pkg/errors"
|
|
"gopkg.in/go-playground/validator.v9"
|
|
)
|
|
|
|
// NewValidationError checks the error for validation errors and formats the correct response.
|
|
func NewValidationError(ctx context.Context, err error) (error, bool) {
|
|
|
|
// Use a type assertion to get the real error value.
|
|
verrors, ok := errors.Cause(err).(validator.ValidationErrors)
|
|
if !ok {
|
|
return err, false
|
|
}
|
|
|
|
// Load the translator from the context that will be set by query string or HTTP headers.
|
|
trans := webcontext.ContextTranslator(ctx)
|
|
|
|
//fields := make(map[string][]FieldError)
|
|
var fields []FieldError
|
|
for _, verror := range verrors {
|
|
|
|
jsonKey := verror.Field()
|
|
|
|
fieldName := jsonKey[2 : len(jsonKey)-2]
|
|
localName, _ := trans.T(jsonKey)
|
|
if localName == "" {
|
|
localName = fieldName
|
|
}
|
|
|
|
namespace := strings.Replace(verror.Namespace(), "{{", "", -1)
|
|
namespace = strings.Replace(namespace, "}}", "", -1)
|
|
|
|
fieldErr := strings.Replace(verror.Translate(trans), jsonKey, localName, -1)
|
|
fieldErr = strings.Replace(fieldErr, "{{", "", -1)
|
|
fieldErr = strings.Replace(fieldErr, "}}", "", -1)
|
|
|
|
field := FieldError{
|
|
Field: fieldName,
|
|
Value: verror.Value(),
|
|
Tag: verror.Tag(),
|
|
Error: fieldErr,
|
|
FormField: FormField(verror.StructNamespace()),
|
|
Display: fieldErr,
|
|
}
|
|
|
|
//switch verror.Tag() {
|
|
//case "required":
|
|
// field.Display = fmt.Sprintf("%s is required.", localName)
|
|
//case "unique":
|
|
// field.Display = fmt.Sprintf("%s must be unique.", localName)
|
|
//}
|
|
|
|
/*
|
|
fmt.Println("field", field.Error)
|
|
fmt.Println("formField", field.FormField)
|
|
fmt.Println("Namespace: " + verror.Namespace())
|
|
fmt.Println("Field: " + verror.Field())
|
|
fmt.Println("StructNamespace: " + verror.StructNamespace()) // can differ when a custom TagNameFunc is registered or
|
|
fmt.Println("StructField: " + verror.StructField()) // by passing alt name to ReportError like below
|
|
fmt.Println("Tag: " + verror.Tag())
|
|
fmt.Println("ActualTag: " + verror.ActualTag())
|
|
fmt.Println("Kind: ", verror.Kind())
|
|
fmt.Println("Type: ", verror.Type())
|
|
fmt.Println("Value: ", verror.Value())
|
|
fmt.Println("Param: " + verror.Param())
|
|
fmt.Println()
|
|
*/
|
|
|
|
fields = append(fields, field)
|
|
}
|
|
|
|
return &Error{
|
|
Err: err,
|
|
Status: http.StatusBadRequest,
|
|
Fields: fields,
|
|
Cause: err,
|
|
Message: "Field validation error",
|
|
isValidationError: true,
|
|
}, true
|
|
}
|
|
|
|
func FormField(namespace string) string {
|
|
if !strings.Contains(namespace, ".") {
|
|
return namespace
|
|
}
|
|
|
|
pts := strings.Split(namespace, ".")
|
|
|
|
var newPts []string
|
|
for i := 1; i < len(pts); i++ {
|
|
newPts = append(newPts, strcase.ToCamel(pts[i]))
|
|
}
|
|
|
|
return strings.Join(newPts, ".")
|
|
}
|