fix: Improve friendly validation error messages (#3390)

* fix: Add validations to `(*codersdk.Error).Friendly`

* fix: Add named validators for template and workspace name
This commit is contained in:
Mathias Fredriksson
2022-08-09 14:25:23 +03:00
committed by GitHub
parent f62e1ede77
commit c0cc8b9935
3 changed files with 16 additions and 10 deletions

View File

@@ -14,9 +14,7 @@ import (
"github.com/coder/coder/codersdk"
)
var (
validate *validator.Validate
)
var validate *validator.Validate
// This init is used to create a validator and register validation-specific
// functionality for the HTTP API.
@@ -31,16 +29,19 @@ func init() {
}
return name
})
err := validate.RegisterValidation("username", func(fl validator.FieldLevel) bool {
nameValidator := func(fl validator.FieldLevel) bool {
f := fl.Field().Interface()
str, ok := f.(string)
if !ok {
return false
}
return UsernameValid(str)
})
if err != nil {
panic(err)
}
for _, tag := range []string{"username", "template_name", "workspace_name"} {
err := validate.RegisterValidation(tag, nameValidator)
if err != nil {
panic(err)
}
}
}

View File

@@ -186,7 +186,12 @@ func (e *Error) StatusCode() int {
}
func (e *Error) Friendly() string {
return fmt.Sprintf("%s. %s", strings.TrimSuffix(e.Message, "."), e.Helper)
var sb strings.Builder
_, _ = fmt.Fprintf(&sb, "%s. %s", strings.TrimSuffix(e.Message, "."), e.Helper)
for _, err := range e.Validations {
_, _ = fmt.Fprintf(&sb, "\n- %s: %s", err.Field, err.Detail)
}
return sb.String()
}
func (e *Error) Error() string {

View File

@@ -48,7 +48,7 @@ type CreateTemplateVersionRequest struct {
// CreateTemplateRequest provides options when creating a template.
type CreateTemplateRequest struct {
// Name is the name of the template.
Name string `json:"name" validate:"username,required"`
Name string `json:"name" validate:"template_name,required"`
// Description is a description of what the template contains. It must be
// less than 128 bytes.
Description string `json:"description,omitempty" validate:"lt=128"`
@@ -75,7 +75,7 @@ type CreateTemplateRequest struct {
// CreateWorkspaceRequest provides options for creating a new workspace.
type CreateWorkspaceRequest struct {
TemplateID uuid.UUID `json:"template_id" validate:"required"`
Name string `json:"name" validate:"username,required"`
Name string `json:"name" validate:"workspace_name,required"`
AutostartSchedule *string `json:"autostart_schedule"`
TTLMillis *int64 `json:"ttl_ms,omitempty"`
// ParameterValues allows for additional parameters to be provided