diff --git a/api/handler.go b/api/handler.go index eb7e213..9a8df48 100644 --- a/api/handler.go +++ b/api/handler.go @@ -45,6 +45,7 @@ func Handler() *mux.Router { m.Get(router.CreateObservationType).Handler(handler(serveCreateObservationType)) m.Get(router.ObservationTypes).Handler(handler(serveObservationTypeList)) m.Get(router.UpdateObservationType).Handler(handler(serveUpdateObservationType)) + m.Get(router.DeleteObservationType).Handler(handler(serveDeleteObservationType)) return m } diff --git a/api/observation_types.go b/api/observation_types.go index cbf28c9..abdbc9f 100644 --- a/api/observation_types.go +++ b/api/observation_types.go @@ -76,3 +76,17 @@ func serveUpdateObservationType(w http.ResponseWriter, r *http.Request) error { return writeJSON(w, observation_type) } + +func serveDeleteObservationType(w http.ResponseWriter, r *http.Request) error { + id, _ := strconv.ParseInt(mux.Vars(r)["Id"], 10, 0) + + deleted, err := store.ObservationTypes.Delete(id) + if err != nil { + return err + } + if deleted { + w.WriteHeader(http.StatusOK) + } + + return writeJSON(w, &models.ObservationType{}) +} diff --git a/api/observation_types_test.go b/api/observation_types_test.go index 4469695..62bc19b 100644 --- a/api/observation_types_test.go +++ b/api/observation_types_test.go @@ -124,3 +124,30 @@ func TestObservationType_Update(t *testing.T) { t.Error("!success") } } + +func TestObservationType_Delete(t *testing.T) { + setup() + + want := newObservationType() + + calledDelete := false + store.ObservationTypes.(*models.MockObservationTypesService).Delete_ = func(id int64) (bool, error) { + if id != want.Id { + t.Errorf("wanted request for observation_type %d but got %d", want.Id, id) + } + calledDelete = true + return true, nil + } + + success, err := apiClient.ObservationTypes.Delete(want.Id) + if err != nil { + t.Fatal(err) + } + + if !calledDelete { + t.Error("!calledDelete") + } + if !success { + t.Error("!success") + } +} diff --git a/datastore/observation_types.go b/datastore/observation_types.go index 1bebeec..d4b08f9 100644 --- a/datastore/observation_types.go +++ b/datastore/observation_types.go @@ -69,3 +69,19 @@ func (s *observationTypesStore) Update(id int64, observation_type *models.Observ return true, nil } + +func (s *observationTypesStore) Delete(id int64) (bool, error) { + observation_type, err := s.Get(id) + if err != nil { + return false, err + } + + deleted, err := s.dbh.Delete(observation_type) + if err != nil { + return false, err + } + if deleted == 0 { + return false, ErrNoRowsDeleted + } + return true, nil +} diff --git a/datastore/observation_types_test.go b/datastore/observation_types_test.go index 86b66c0..69dbf78 100644 --- a/datastore/observation_types_test.go +++ b/datastore/observation_types_test.go @@ -105,3 +105,22 @@ func TestObservationTypesStore_Update_db(t *testing.T) { t.Error("!updated") } } + +func TestObservationTypesStore_Delete_db(t *testing.T) { + tx, _ := DB.Begin() + defer tx.Rollback() + + observation_type := insertObservationType(t, tx) + + d := NewDatastore(tx) + + // Delete it + deleted, err := d.ObservationTypes.Delete(observation_type.Id) + if err != nil { + t.Fatal(err) + } + + if !deleted { + t.Error("!delete") + } +} diff --git a/models/observation_types.go b/models/observation_types.go index a785a3a..ccbe10a 100644 --- a/models/observation_types.go +++ b/models/observation_types.go @@ -37,6 +37,9 @@ type ObservationTypesService interface { // Update an existing observation type Update(id int64, observation_type *ObservationType) (updated bool, err error) + + // Delete an existing observation type + Delete(id int64) (deleted bool, err error) } var ( @@ -133,11 +136,34 @@ func (s *observationTypesService) Update(id int64, observation_type *Observation return resp.StatusCode == http.StatusOK, nil } +func (s *observationTypesService) Delete(id int64) (bool, error) { + strId := strconv.FormatInt(id, 10) + + url, err := s.client.url(router.DeleteObservationType, map[string]string{"Id": strId}, nil) + if err != nil { + return false, err + } + + req, err := s.client.NewRequest("DELETE", url.String(), nil) + if err != nil { + return false, err + } + + var observation_type *ObservationType + resp, err := s.client.Do(req, &observation_type) + if err != nil { + return false, err + } + + return resp.StatusCode == http.StatusOK, nil +} + type MockObservationTypesService struct { Get_ func(id int64) (*ObservationType, error) List_ func(opt *ObservationTypeListOptions) ([]*ObservationType, error) Create_ func(observation_type *ObservationType) (bool, error) Update_ func(id int64, observation_type *ObservationType) (bool, error) + Delete_ func(id int64) (bool, error) } var _ ObservationTypesService = &MockObservationTypesService{} @@ -169,3 +195,10 @@ func (s *MockObservationTypesService) Update(id int64, observation_type *Observa } return s.Update_(id, observation_type) } + +func (s *MockObservationTypesService) Delete(id int64) (bool, error) { + if s.Delete_ == nil { + return false, nil + } + return s.Delete_(id) +} diff --git a/models/observation_types_test.go b/models/observation_types_test.go index cf53cfb..2b16741 100644 --- a/models/observation_types_test.go +++ b/models/observation_types_test.go @@ -143,3 +143,32 @@ func TestObservationTypeService_Update(t *testing.T) { t.Fatal("!called") } } + +func TestObservationTypeService_Delete(t *testing.T) { + setup() + defer teardown() + + want := newObservationType() + + var called bool + mux.HandleFunc(urlPath(t, router.DeleteObservationType, map[string]string{"Id": "1"}), func(w http.ResponseWriter, r *http.Request) { + called = true + testMethod(t, r, "DELETE") + + w.WriteHeader(http.StatusOK) + writeJSON(w, want) + }) + + deleted, err := client.ObservationTypes.Delete(want.Id) + if err != nil { + t.Errorf("ObservationTypes.Delete returned error: %v", err) + } + + if !deleted { + t.Error("!deleted") + } + + if !called { + t.Fatal("!called") + } +} diff --git a/router/api.go b/router/api.go index a1bbf34..e3d5cb7 100644 --- a/router/api.go +++ b/router/api.go @@ -36,6 +36,7 @@ func API() *mux.Router { m.Path("/observation_types").Methods("POST").Name(CreateObservationType) m.Path("/observation_types/{Id:.+}").Methods("GET").Name(ObservationType) m.Path("/observation_types/{Id:.+}").Methods("PUT").Name(UpdateObservationType) + m.Path("/observation_types/{Id:.+}").Methods("DELETE").Name(DeleteObservationType) return m } diff --git a/router/routes.go b/router/routes.go index ca63317..7557d9a 100644 --- a/router/routes.go +++ b/router/routes.go @@ -27,4 +27,5 @@ const ( CreateObservationType = "observation_type:create" ObservationTypes = "observation_type:list" UpdateObservationType = "observation_type:update" + DeleteObservationType = "observation_type:delete" )