From d46e7210635be52e513da9643603a98813d0de7b Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Tue, 13 Oct 2015 13:42:19 -0700 Subject: [PATCH] Refactor delete handlers Fixes #18. --- api/characteristics.go | 10 +++++++--- api/measurements.go | 8 +++++--- api/species.go | 10 +++++++--- api/strains.go | 10 +++++++--- errors/characteristics.go | 2 ++ errors/measurements.go | 4 +++- errors/species.go | 2 ++ errors/strains.go | 2 ++ errors/users.go | 4 +++- models/characteristics.go | 4 ++++ models/interfaces.go | 13 +++++++++++++ models/measurements.go | 4 ++++ models/species.go | 4 ++++ models/strains.go | 4 ++++ models/users.go | 4 ++++ 15 files changed, 71 insertions(+), 14 deletions(-) diff --git a/api/characteristics.go b/api/characteristics.go index 872d97f..2fa1965 100644 --- a/api/characteristics.go +++ b/api/characteristics.go @@ -193,10 +193,14 @@ func (c CharacteristicService) Create(e *types.Entity, genus string, claims *typ // Delete deletes a single characteristic func (c CharacteristicService) Delete(id int64, genus string, claims *types.Claims) *types.AppError { - q := `DELETE FROM characteristics WHERE id=$1;` - // TODO: fix this - if _, err := models.DBH.Exec(q, id); err != nil { + characteristic, err := models.GetCharacteristic(id, genus, claims) + if err != nil { return newJSONError(err, http.StatusInternalServerError) } + + if err := models.Delete(characteristic); err != nil { + return newJSONError(err, http.StatusInternalServerError) + } + return nil } diff --git a/api/measurements.go b/api/measurements.go index 3408923..205eaa9 100644 --- a/api/measurements.go +++ b/api/measurements.go @@ -114,12 +114,14 @@ func (m MeasurementService) Update(id int64, e *types.Entity, genus string, clai // Delete deletes a single measurement. func (m MeasurementService) Delete(id int64, genus string, claims *types.Claims) *types.AppError { - q := `DELETE FROM measurements WHERE id=$1;` - // TODO: fix this - _, err := models.DBH.Exec(q, id) + measurement, err := models.GetMeasurement(id, genus, claims) if err != nil { return newJSONError(err, http.StatusInternalServerError) } + if err := models.Delete(measurement); err != nil { + return newJSONError(err, http.StatusInternalServerError) + } + return nil } diff --git a/api/species.go b/api/species.go index 268ef1d..9ecd680 100644 --- a/api/species.go +++ b/api/species.go @@ -153,10 +153,14 @@ func (s SpeciesService) Create(e *types.Entity, genus string, claims *types.Clai // Delete deletes a single species func (s SpeciesService) Delete(id int64, genus string, claims *types.Claims) *types.AppError { - q := `DELETE FROM species WHERE id=$1;` - // TODO: fix this - if _, err := models.DBH.Exec(q, id); err != nil { + species, err := models.GetSpecies(id, genus, claims) + if err != nil { return newJSONError(err, http.StatusInternalServerError) } + + if err := models.Delete(species.SpeciesBase); err != nil { + return newJSONError(err, http.StatusInternalServerError) + } + return nil } diff --git a/api/strains.go b/api/strains.go index 1f11b8d..4cdbad8 100644 --- a/api/strains.go +++ b/api/strains.go @@ -216,10 +216,14 @@ func (s StrainService) Create(e *types.Entity, genus string, claims *types.Claim // Delete deletes a single strain func (s StrainService) Delete(id int64, genus string, claims *types.Claims) *types.AppError { - q := `DELETE FROM strains WHERE id=$1;` - // TODO: fix this - if _, err := models.DBH.Exec(q, id); err != nil { + strain, err := models.GetStrain(id, genus, claims) + if err != nil { return newJSONError(err, http.StatusInternalServerError) } + + if err := models.Delete(strain); err != nil { + return newJSONError(err, http.StatusInternalServerError) + } + return nil } diff --git a/errors/characteristics.go b/errors/characteristics.go index f625887..8aa83c3 100644 --- a/errors/characteristics.go +++ b/errors/characteristics.go @@ -7,4 +7,6 @@ var ( ErrCharacteristicNotFound = errors.New("Characteristic not found") // ErrCharacteristicNotUpdated when not updated. ErrCharacteristicNotUpdated = errors.New("Characteristic not updated") + // ErrCharacteristicNotDeleted when not deleted. + ErrCharacteristicNotDeleted = errors.New("Characteristic not deleted") ) diff --git a/errors/measurements.go b/errors/measurements.go index 63b7d22..a1eab3e 100644 --- a/errors/measurements.go +++ b/errors/measurements.go @@ -5,6 +5,8 @@ import "errors" var ( // ErrMeasurementNotFound when not found. ErrMeasurementNotFound = errors.New("Measurement not found") - // ErrMeasurementNotUpdate when not updated. + // ErrMeasurementNotUpdated when not updated. ErrMeasurementNotUpdated = errors.New("Measurement not updated") + // ErrMeasurementNotDeleted when not deleted. + ErrMeasurementNotDeleted = errors.New("Measurement not deleted") ) diff --git a/errors/species.go b/errors/species.go index 0500fd7..68fce98 100644 --- a/errors/species.go +++ b/errors/species.go @@ -7,4 +7,6 @@ var ( ErrSpeciesNotFound = errors.New("Species not found") // ErrSpeciesNotUpdated when not updated. ErrSpeciesNotUpdated = errors.New("Species not updated") + // ErrSpeciesNotDeleted when not deleted. + ErrSpeciesNotDeleted = errors.New("Species not deleted") ) diff --git a/errors/strains.go b/errors/strains.go index fd0ec6f..c0632ac 100644 --- a/errors/strains.go +++ b/errors/strains.go @@ -7,4 +7,6 @@ var ( ErrStrainNotFound = errors.New("Strain not found") // ErrStrainNotUpdated when not updated. ErrStrainNotUpdated = errors.New("Strain not updated") + // ErrStrainNotDeleted when not deleted. + ErrStrainNotDeleted = errors.New("Strain not deleted") ) diff --git a/errors/users.go b/errors/users.go index 13e6953..03b004a 100644 --- a/errors/users.go +++ b/errors/users.go @@ -6,7 +6,9 @@ var ( // ErrUserNotFound when not found. ErrUserNotFound = errors.New("No user found") // ErrUserNotUpdated when not updated. - ErrUserNotUpdated = errors.New("Count 0") + ErrUserNotUpdated = errors.New("User not updated") + // ErrUserNotDeleted when not deleted. + ErrUserNotDeleted = errors.New("User not deleted") // ErrUserMissingEmail when missing email. ErrUserMissingEmail = errors.New("Missing email") // ErrInvalidEmailOrPassword when invalid login credentials. diff --git a/models/characteristics.go b/models/characteristics.go index fec69e5..503a49f 100644 --- a/models/characteristics.go +++ b/models/characteristics.go @@ -32,6 +32,10 @@ func (c *CharacteristicBase) UpdateError() error { return errors.ErrCharacteristicNotUpdated } +func (c *CharacteristicBase) DeleteError() error { + return errors.ErrCharacteristicNotDeleted +} + // CharacteristicBase is what the DB expects for write operations type CharacteristicBase struct { ID int64 `json:"id,omitempty"` diff --git a/models/interfaces.go b/models/interfaces.go index 22a772e..c0e010b 100644 --- a/models/interfaces.go +++ b/models/interfaces.go @@ -6,6 +6,7 @@ type base interface { PreInsert(modl.SqlExecutor) error PreUpdate(modl.SqlExecutor) error UpdateError() error + DeleteError() error } // Create will create a new DB record of a model. @@ -27,3 +28,15 @@ func Update(b base) error { } return nil } + +// Delete runs a DB delete on a model. +func Delete(b base) error { + count, err := DBH.Delete(b) + if err != nil { + return err + } + if count != 1 { + return b.DeleteError() + } + return nil +} diff --git a/models/measurements.go b/models/measurements.go index b10eba1..827ce31 100644 --- a/models/measurements.go +++ b/models/measurements.go @@ -33,6 +33,10 @@ func (m *MeasurementBase) UpdateError() error { return errors.ErrMeasurementNotUpdated } +func (m *MeasurementBase) DeleteError() error { + return errors.ErrMeasurementNotDeleted +} + // MeasurementBase is what the DB expects for write operations // There are three types of supported measurements: fixed-text, free-text, // & numerical. The table has a constraint that will allow at most one diff --git a/models/species.go b/models/species.go index 3152995..e7eb1c6 100644 --- a/models/species.go +++ b/models/species.go @@ -33,6 +33,10 @@ func (s *SpeciesBase) UpdateError() error { return errors.ErrSpeciesNotUpdated } +func (s *SpeciesBase) DeleteError() error { + return errors.ErrSpeciesNotDeleted +} + // SpeciesBase is what the DB expects for write operations. type SpeciesBase struct { ID int64 `db:"id" json:"id"` diff --git a/models/strains.go b/models/strains.go index 9f98383..58e240e 100644 --- a/models/strains.go +++ b/models/strains.go @@ -33,6 +33,10 @@ func (s *StrainBase) UpdateError() error { return errors.ErrStrainNotUpdated } +func (s *StrainBase) DeleteError() error { + return errors.ErrStrainNotDeleted +} + // StrainBase is what the DB expects for write operations. type StrainBase struct { ID int64 `db:"id" json:"id"` diff --git a/models/users.go b/models/users.go index 9306bb2..a4c36ff 100644 --- a/models/users.go +++ b/models/users.go @@ -34,6 +34,10 @@ func (u *UserBase) UpdateError() error { return errors.ErrUserNotUpdated } +func (u *UserBase) DeleteError() error { + return errors.ErrUserNotDeleted +} + // UserBase is what the DB expects to see for write operations. type UserBase struct { ID int64 `json:"id,omitempty"`