From 708eed58177b50d6aa328ae2f91a50659805e9e0 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 14 Oct 2015 10:28:09 -0700 Subject: [PATCH] json-api error format Part of #11. --- models/characteristics.go | 8 ++++++-- models/measurements.go | 18 +++++++++++++++--- models/species.go | 8 ++++++-- models/strains.go | 8 ++++++-- models/users.go | 16 ++++++++++++---- types/validation-error.go | 18 +++++++++++++++++- 6 files changed, 62 insertions(+), 14 deletions(-) diff --git a/models/characteristics.go b/models/characteristics.go index 99cc7eb..1d986cb 100644 --- a/models/characteristics.go +++ b/models/characteristics.go @@ -42,11 +42,15 @@ func (c *CharacteristicBase) validate() types.ValidationError { cv := make(types.ValidationError, 0) if c.CharacteristicName == "" { - cv["Name"] = []string{helpers.MustProvideAValue} + cv = append(cv, types.NewValidationError( + "characteristicName", + helpers.MustProvideAValue)) } if c.CharacteristicTypeID == 0 { - cv["Characteristic Type"] = []string{helpers.MustProvideAValue} + cv = append(cv, types.NewValidationError( + "characteristicType", + helpers.MustProvideAValue)) } if len(cv) > 0 { diff --git a/models/measurements.go b/models/measurements.go index e234b2c..cff5188 100644 --- a/models/measurements.go +++ b/models/measurements.go @@ -43,11 +43,21 @@ func (m *MeasurementBase) validate() types.ValidationError { mv := make(types.ValidationError, 0) if m.StrainID == 0 { - mv["Strain"] = []string{helpers.MustProvideAValue} + mv = append(mv, types.NewValidationError( + "strain", + helpers.MustProvideAValue)) } if m.CharacteristicID == 0 { - mv["Characteristic"] = []string{helpers.MustProvideAValue} + mv = append(mv, types.NewValidationError( + "characteristic", + helpers.MustProvideAValue)) + } + + if m.TextMeasurementTypeID.Valid == false && m.TxtValue.Valid == false && m.NumValue.Valid == false { + mv = append(mv, types.NewValidationError( + "value", + helpers.MustProvideAValue)) } if len(mv) > 0 { @@ -119,7 +129,9 @@ func (m *Measurement) UnmarshalJSON(b []byte) error { id, err := GetTextMeasurementTypeID(v) if err != nil { if err == sql.ErrNoRows { - measurement.TxtValue = types.NullString{sql.NullString{String: v, Valid: true}} + if v != "" { + measurement.TxtValue = types.NullString{sql.NullString{String: v, Valid: true}} + } } else { return err } diff --git a/models/species.go b/models/species.go index 9ed1b5b..d5ca466 100644 --- a/models/species.go +++ b/models/species.go @@ -43,11 +43,15 @@ func (s *SpeciesBase) validate() types.ValidationError { sv := make(types.ValidationError, 0) if s.GenusID == 0 { - sv["Genus"] = []string{helpers.MustProvideAValue} + sv = append(sv, types.NewValidationError( + "genus", + helpers.MustProvideAValue)) } if s.SpeciesName == "" { - sv["Species"] = []string{helpers.MustProvideAValue} + sv = append(sv, types.NewValidationError( + "speciesName", + helpers.MustProvideAValue)) } if len(sv) > 0 { diff --git a/models/strains.go b/models/strains.go index a7653ab..90d4d7d 100644 --- a/models/strains.go +++ b/models/strains.go @@ -43,11 +43,15 @@ func (s *StrainBase) validate() types.ValidationError { sv := make(types.ValidationError, 0) if s.SpeciesID == 0 { - sv["Species"] = []string{helpers.MustProvideAValue} + sv = append(sv, types.NewValidationError( + "species", + helpers.MustProvideAValue)) } if s.StrainName == "" { - sv["Name"] = []string{helpers.MustProvideAValue} + sv = append(sv, types.NewValidationError( + "strainName", + helpers.MustProvideAValue)) } if len(sv) > 0 { diff --git a/models/users.go b/models/users.go index 17b0ddb..789a53c 100644 --- a/models/users.go +++ b/models/users.go @@ -43,20 +43,28 @@ func (u *UserBase) validate() types.ValidationError { uv := make(types.ValidationError, 0) if u.Name == "" { - uv["Name"] = []string{helpers.MustProvideAValue} + uv = append(uv, types.NewValidationError( + "name", + helpers.MustProvideAValue)) } if u.Email == "" { - uv["Email"] = []string{helpers.MustProvideAValue} + uv = append(uv, types.NewValidationError( + "email", + helpers.MustProvideAValue)) } regex, _ := regexp.Compile(`(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})`) if u.Email != "" && !regex.MatchString(u.Email) { - uv["Email"] = []string{"Must provide a valid email address"} + uv = append(uv, types.NewValidationError( + "email", + "Must provide a valid email address")) } if len(u.Password) < 8 { - uv["Password"] = []string{"Password must be at least 8 characters"} + uv = append(uv, types.NewValidationError( + "password", + "Password must be at least 8 characters")) } if len(uv) > 0 { diff --git a/types/validation-error.go b/types/validation-error.go index 8ffe2d7..3d5c4d6 100644 --- a/types/validation-error.go +++ b/types/validation-error.go @@ -2,7 +2,23 @@ package types import "encoding/json" -type ValidationError map[string][]string +type Source struct { + Pointer string `json:"pointer"` +} + +type ErrorDetail struct { + Source `json:"source"` + Detail string `json:"detail"` +} + +func NewValidationError(attr, message string) ErrorDetail { + return ErrorDetail{ + Source: Source{Pointer: "data/attributes/" + attr}, + Detail: message, + } +} + +type ValidationError []ErrorDetail func (v ValidationError) Error() string { errs, err := json.Marshal(struct {