diff --git a/internal/api/user.go b/internal/api/user.go index 7bf5fc2..4da7dc0 100644 --- a/internal/api/user.go +++ b/internal/api/user.go @@ -27,6 +27,12 @@ func (h *Handler) createUser(c *fiber.Ctx) error { return defaultUserError } + validationErr := ValidateModel(user) + + if validationErr != nil { + return validationErr + } + _, insertErr := h.db.Exec("INSERT INTO user (id, first_name, email) VALUES (?, ?, ?)", user.ID, user.FirstName, user.Email) if insertErr != nil { diff --git a/internal/api/validator.go b/internal/api/validator.go new file mode 100644 index 0000000..afefe7d --- /dev/null +++ b/internal/api/validator.go @@ -0,0 +1,36 @@ +package api + +import ( + "fmt" + "freed/internal/model" + "strings" + + "github.com/go-playground/validator/v10" + "github.com/gofiber/fiber/v2" +) + +type ModelConstraint interface { + *model.User // | add other models here +} + +type ValidationError struct { + FailedField string + Tag string + Value string +} + +func ValidateModel[T ModelConstraint](s T) *fiber.Error { + var errorMessages []string + validate := validator.New() + err := validate.Struct(s) + + if err != nil { + for _, err := range err.(validator.ValidationErrors) { + err := fmt.Sprintf("Field %s is invalid, reason: %s", err.StructNamespace(), err.Tag()) + + errorMessages = append(errorMessages, err) + } + } + + return fiber.NewError(fiber.StatusBadRequest, strings.Join(errorMessages, ". ")) +} diff --git a/internal/model/user.go b/internal/model/user.go index db736f6..ba2b550 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -1,7 +1,7 @@ package model type User struct { - ID string `json: id` - FirstName string `json: "firstName"` - Email string `json: "email"` + ID string `json:"id" validate:"required"` + FirstName string `json:"firstName" validate:"required"` + Email string `json:"email" validate:"required,email"` }