From 4ae382aa8ff4706ae05a7bf63d8b16050a7a5d10 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 24 Jun 2015 17:51:43 -0800 Subject: [PATCH] 4) create services JSON errors --- entities.go | 2 +- handlers.go | 27 ++++++++++++--------------- species.go | 8 ++++---- strains.go | 4 ++-- users.go | 10 +++++----- 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/entities.go b/entities.go index e85381e..65141f3 100644 --- a/entities.go +++ b/entities.go @@ -20,6 +20,6 @@ type updater interface { } type creater interface { - create(*entity, Claims) error + create(*entity, Claims) *appError unmarshal([]byte) (entity, error) } diff --git a/handlers.go b/handlers.go index f1f8aaa..0ca835a 100644 --- a/handlers.go +++ b/handlers.go @@ -80,7 +80,7 @@ func Handler() http.Handler { // Auth routes m.Handle("/users", j.Secure(errorHandler(handleLister(userService)), verifyClaims)).Methods("GET") - m.Handle("/users", j.Secure(http.HandlerFunc(handleCreater(userService)), verifyClaims)).Methods("POST") + m.Handle("/users", j.Secure(errorHandler(handleCreater(userService)), verifyClaims)).Methods("POST") m.Handle("/users/{Id:.+}", j.Secure(errorHandler(handleGetter(userService)), verifyClaims)).Methods("GET") m.Handle("/users/{Id:.+}", j.Secure(http.HandlerFunc(handleUpdater(userService)), verifyClaims)).Methods("PUT") @@ -95,11 +95,11 @@ func Handler() http.Handler { routes := []r{ r{handleLister(speciesService), "GET", "/species"}, - // r{handleCreater(speciesService), "POST", "/species"}, + r{handleCreater(speciesService), "POST", "/species"}, r{handleGetter(speciesService), "GET", "/species/{Id:.+}"}, // r{handleUpdater(speciesService), "PUT", "/species/{Id:.+}"}, r{handleLister(strainService), "GET", "/strains"}, - // r{handleCreater(strainService), "POST", "/strains"}, + r{handleCreater(strainService), "POST", "/strains"}, r{handleGetter(strainService), "GET", "/strains/{Id:.+}"}, // r{handleUpdater(strainService), "PUT", "/strains/{Id:.+}"}, r{handleLister(characteristicService), "GET", "/characteristics"}, @@ -194,35 +194,32 @@ func handleUpdater(u updater) http.HandlerFunc { } } -func handleCreater(c creater) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { +func handleCreater(c creater) errorHandler { + return func(w http.ResponseWriter, r *http.Request) *appError { bodyBytes, err := ioutil.ReadAll(r.Body) if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return + return newJSONError(err, http.StatusInternalServerError) } e, err := c.unmarshal(bodyBytes) if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return + return newJSONError(err, http.StatusInternalServerError) } con := context.Get(r, "claims") var claims Claims = con.(Claims) - err = c.create(&e, claims) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return + appErr := c.create(&e, claims) + if appErr != nil { + return appErr } data, err := e.marshal() if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return + return newJSONError(err, http.StatusInternalServerError) } w.Write(data) + return nil } } diff --git a/species.go b/species.go index 80c2089..406bb01 100644 --- a/species.go +++ b/species.go @@ -146,7 +146,7 @@ func (s SpeciesService) update(id int64, e *entity, claims Claims) error { return nil } -func (s SpeciesService) create(e *entity, claims Claims) error { +func (s SpeciesService) create(e *entity, claims Claims) *appError { species := (*e).(*Species) ct := time.Now() species.CreatedBy = claims.Sub @@ -155,15 +155,15 @@ func (s SpeciesService) create(e *entity, claims Claims) error { species.UpdatedAt = ct var genus_id struct{ Id int64 } - q := `SELECT id FROM genera WHERE LOWER(genus_name) = $1;` + q := `SELECT id FROM genera WHERE LOWER(genus_name) = LOWER($1);` if err := DBH.SelectOne(&genus_id, q, species.GenusName); err != nil { - return err + return newJSONError(err, http.StatusInternalServerError) } species.SpeciesBase.GenusID = genus_id.Id err := DBH.Insert(species.SpeciesBase) if err != nil { - return err + return newJSONError(err, http.StatusInternalServerError) } return nil } diff --git a/strains.go b/strains.go index 94b133a..03f6bd3 100644 --- a/strains.go +++ b/strains.go @@ -149,7 +149,7 @@ func (s StrainService) update(id int64, e *entity, claims Claims) error { return nil } -func (s StrainService) create(e *entity, claims Claims) error { +func (s StrainService) create(e *entity, claims Claims) *appError { strain := (*e).(*Strain) ct := time.Now() strain.CreatedBy = claims.Sub @@ -158,7 +158,7 @@ func (s StrainService) create(e *entity, claims Claims) error { strain.UpdatedAt = ct if err := DBH.Insert(strain.StrainBase); err != nil { - return err + return newJSONError(err, http.StatusInternalServerError) } return nil } diff --git a/users.go b/users.go index d1d2114..72e9270 100644 --- a/users.go +++ b/users.go @@ -73,7 +73,7 @@ func (u UserService) unmarshal(b []byte) (entity, error) { return uj.User, err } -func (u *User) validate() error { +func (u *User) validate() *appError { var uv UserValidation validationError := false @@ -84,7 +84,7 @@ func (u *User) validate() error { if validationError { errs, _ := json.Marshal(uv) - return errors.New(string(errs)) + return newJSONError(errors.New(string(errs)), http.StatusBadRequest) } return nil } @@ -133,7 +133,7 @@ func (u UserService) update(id int64, e *entity, claims Claims) error { return nil } -func (u UserService) create(e *entity, claims Claims) error { +func (u UserService) create(e *entity, claims Claims) *appError { user := (*e).(*User) if err := user.validate(); err != nil { return err @@ -143,12 +143,12 @@ func (u UserService) create(e *entity, claims Claims) error { user.UpdatedAt = ct hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), 10) if err != nil { - return err + return newJSONError(err, http.StatusInternalServerError) } user.Password = string(hash) if err := DBH.Insert(user); err != nil { - return err + return newJSONError(err, http.StatusInternalServerError) } return nil }