189 lines
5.6 KiB
Go
189 lines
5.6 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"github.com/thermokarst/bactdb/helpers"
|
|
"github.com/thermokarst/bactdb/models"
|
|
"github.com/thermokarst/bactdb/payloads"
|
|
"github.com/thermokarst/bactdb/types"
|
|
)
|
|
|
|
type CharacteristicService struct{}
|
|
|
|
func (c CharacteristicService) Unmarshal(b []byte) (types.Entity, error) {
|
|
var cj payloads.CharacteristicPayload
|
|
err := json.Unmarshal(b, &cj)
|
|
return &cj, err
|
|
}
|
|
|
|
func (c CharacteristicService) List(val *url.Values, claims *types.Claims) (types.Entity, *types.AppError) {
|
|
if val == nil {
|
|
return nil, helpers.ErrMustProvideOptionsJSON
|
|
}
|
|
var opt helpers.ListOptions
|
|
if err := helpers.SchemaDecoder.Decode(&opt, *val); err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
characteristics, err := models.ListCharacteristics(opt, claims)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
strains_opt, err := models.StrainOptsFromCharacteristics(opt)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
strains, err := models.ListStrains(*strains_opt, claims)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
species_opt, err := models.SpeciesOptsFromStrains(*strains_opt)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
species, err := models.ListSpecies(*species_opt, claims)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
measurements_opt, err := models.MeasurementOptsFromCharacteristics(opt)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
measurements, err := models.ListMeasurements(*measurements_opt, claims)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
payload := payloads.CharacteristicsPayload{
|
|
Characteristics: characteristics,
|
|
Measurements: measurements,
|
|
Strains: strains,
|
|
Species: species,
|
|
Meta: &models.CharacteristicMeta{
|
|
CanAdd: helpers.CanAdd(claims),
|
|
},
|
|
}
|
|
|
|
return &payload, nil
|
|
}
|
|
|
|
func (c CharacteristicService) Get(id int64, genus string, claims *types.Claims) (types.Entity, *types.AppError) {
|
|
characteristic, err := models.GetCharacteristic(id, genus, claims)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
strains, strain_opts, err := models.StrainsFromCharacteristicId(id, genus, claims)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
species_opt, err := models.SpeciesOptsFromStrains(*strain_opts)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
species, err := models.ListSpecies(*species_opt, claims)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
measurements, _, err := models.MeasurementsFromCharacteristicId(id, genus, claims)
|
|
if err != nil {
|
|
return nil, types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
payload := payloads.CharacteristicPayload{
|
|
Characteristic: characteristic,
|
|
Measurements: measurements,
|
|
Strains: strains,
|
|
Species: species,
|
|
}
|
|
|
|
return &payload, nil
|
|
}
|
|
|
|
func (c CharacteristicService) Update(id int64, e *types.Entity, genus string, claims *types.Claims) *types.AppError {
|
|
payload := (*e).(*payloads.CharacteristicPayload)
|
|
payload.Characteristic.UpdatedBy = claims.Sub
|
|
payload.Characteristic.Id = id
|
|
|
|
// First, handle Characteristic Type
|
|
id, err := models.InsertOrGetCharacteristicType(payload.Characteristic.CharacteristicType, claims)
|
|
if err != nil {
|
|
return types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
payload.Characteristic.CanEdit = helpers.CanEdit(claims, payload.Characteristic.CreatedBy)
|
|
|
|
payload.Characteristic.CharacteristicTypeId = id
|
|
// TODO: fix this
|
|
count, err := models.DBH.Update(payload.Characteristic.CharacteristicBase)
|
|
if err != nil {
|
|
return types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
if count != 1 {
|
|
// TODO: fix this
|
|
return types.NewJSONError(models.ErrCharacteristicNotUpdated, http.StatusBadRequest)
|
|
}
|
|
|
|
strains, strain_opts, err := models.StrainsFromCharacteristicId(id, genus, claims)
|
|
if err != nil {
|
|
return types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
species_opt, err := models.SpeciesOptsFromStrains(*strain_opts)
|
|
if err != nil {
|
|
return types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
species, err := models.ListSpecies(*species_opt, claims)
|
|
if err != nil {
|
|
return types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
payload.Strains = strains
|
|
// TODO: tack on measurements
|
|
payload.Measurements = nil
|
|
payload.Species = species
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c CharacteristicService) Create(e *types.Entity, genus string, claims *types.Claims) *types.AppError {
|
|
payload := (*e).(*payloads.CharacteristicPayload)
|
|
payload.Characteristic.CreatedBy = claims.Sub
|
|
payload.Characteristic.UpdatedBy = claims.Sub
|
|
|
|
id, err := models.InsertOrGetCharacteristicType(payload.Characteristic.CharacteristicType, claims)
|
|
if err != nil {
|
|
return types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
payload.Characteristic.CharacteristicTypeId = id
|
|
|
|
// TODO: fix this
|
|
err = models.DBH.Insert(payload.Characteristic.CharacteristicBase)
|
|
if err != nil {
|
|
return types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
characteristic, err := models.GetCharacteristic(payload.Characteristic.Id, genus, claims)
|
|
if err != nil {
|
|
return types.NewJSONError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
payload.Characteristic = characteristic
|
|
payload.Meta = &models.CharacteristicMeta{
|
|
CanAdd: helpers.CanAdd(claims),
|
|
}
|
|
return nil
|
|
}
|