1
0
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
Raw Normal View History

package weberror
import (
"context"
"fmt"
"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: verror.Field(),
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",
}, 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, ".")
}