diff --git a/api/handler.go b/api/handler.go index 583b635..2db340b 100644 --- a/api/handler.go +++ b/api/handler.go @@ -72,6 +72,7 @@ func Handler() *mux.Router { m.Get(router.SubrouterListSpecies).Handler(authHandler(serveSubrouterSpeciesList)) m.Get(router.SubrouterListStrains).Handler(authHandler(serveSubrouterStrainsList)) + m.Get(router.SubrouterListMeasurements).Handler(authHandler(serveSubrouterMeasurementsList)) return m } diff --git a/api/measurements.go b/api/measurements.go index 719e520..0580cab 100644 --- a/api/measurements.go +++ b/api/measurements.go @@ -90,3 +90,22 @@ func serveDeleteMeasurement(w http.ResponseWriter, r *http.Request) error { return writeJSON(w, &models.Measurement{}) } + +func serveSubrouterMeasurementsList(w http.ResponseWriter, r *http.Request) error { + var opt models.MeasurementListOptions + if err := schemaDecoder.Decode(&opt, r.URL.Query()); err != nil { + return err + } + + opt.Genus = mux.Vars(r)["genus"] + + measurements, err := store.Measurements.List(&opt) + if err != nil { + return err + } + if measurements == nil { + measurements = []*models.Measurement{} + } + + return writeJSON(w, measurements) +} diff --git a/datastore/measurements.go b/datastore/measurements.go index 9273493..3ea492c 100644 --- a/datastore/measurements.go +++ b/datastore/measurements.go @@ -1,6 +1,8 @@ package datastore import ( + "fmt" + "strings" "time" "github.com/thermokarst/bactdb/models" @@ -39,8 +41,29 @@ func (s *measurementsStore) List(opt *models.MeasurementListOptions) ([]*models. if opt == nil { opt = &models.MeasurementListOptions{} } + + sql := `SELECT * FROM measurements` + + var conds []string + var vals []interface{} + + if opt.Genus != "" { + conds = append(conds, `strain_id IN (SELECT st.id FROM strains st + INNER JOIN species sp ON sp.id = st.species_id + INNER JOIN genera g ON g.id = sp.genus_id + WHERE lower(g.genus_name) = $1)`) + vals = append(vals, opt.Genus) + } + + if len(conds) > 0 { + sql += " WHERE (" + strings.Join(conds, ") AND (") + ")" + } + + sql += fmt.Sprintf(" LIMIT $%v OFFSET $%v;", len(conds)+1, len(conds)+2) + vals = append(vals, opt.PerPageOrDefault(), opt.Offset()) + var measurements []*models.Measurement - err := s.dbh.Select(&measurements, `SELECT * FROM measurements LIMIT $1 OFFSET $2;`, opt.PerPageOrDefault(), opt.Offset()) + err := s.dbh.Select(&measurements, sql, vals...) if err != nil { return nil, err } diff --git a/models/measurements.go b/models/measurements.go index 15325fc..b3432fe 100644 --- a/models/measurements.go +++ b/models/measurements.go @@ -108,6 +108,7 @@ func (s *measurementsService) Create(measurement *Measurement) (bool, error) { type MeasurementListOptions struct { ListOptions + Genus string } func (s *measurementsService) List(opt *MeasurementListOptions) ([]*Measurement, error) { diff --git a/router/api.go b/router/api.go index 79ba74c..127e23a 100644 --- a/router/api.go +++ b/router/api.go @@ -71,6 +71,7 @@ func API() *mux.Router { s := m.PathPrefix("/{genus}").Subrouter() s.Path("/species").Methods("GET").Name(SubrouterListSpecies) s.Path("/strains").Methods("GET").Name(SubrouterListStrains) + s.Path("/measurements").Methods("GET").Name(SubrouterListMeasurements) return m } diff --git a/router/routes.go b/router/routes.go index 3ae91b0..33f7eed 100644 --- a/router/routes.go +++ b/router/routes.go @@ -54,6 +54,7 @@ const ( UpdateMeasurement = "measurements:update" DeleteMeasurement = "measurements:delete" - SubrouterListSpecies = "subrouter_species:list" - SubrouterListStrains = "subrouter_strains:list" + SubrouterListSpecies = "subrouter_species:list" + SubrouterListStrains = "subrouter_strains:list" + SubrouterListMeasurements = "subrouter_measurements:list" )