Species editable permissions

This commit is contained in:
Matthew Dillon 2015-07-07 12:59:11 -08:00
parent 0b029f9098
commit 630fe07554
9 changed files with 70 additions and 11 deletions

View file

@ -95,7 +95,7 @@ func (c CharacteristicTypeService) list(val *url.Values, claims Claims) (entity,
return &characteristic_types, nil return &characteristic_types, nil
} }
func (c CharacteristicTypeService) get(id int64, dummy string) (entity, *appError) { func (c CharacteristicTypeService) get(id int64, dummy string, claims Claims) (entity, *appError) {
var characteristic_type CharacteristicType var characteristic_type CharacteristicType
q := `SELECT ct.*, array_agg(c.id) AS characteristics, 0 AS sort_order q := `SELECT ct.*, array_agg(c.id) AS characteristics, 0 AS sort_order
FROM characteristic_types ct FROM characteristic_types ct

View file

@ -97,7 +97,7 @@ func (c CharacteristicService) list(val *url.Values, claims Claims) (entity, *ap
return &characteristics, nil return &characteristics, nil
} }
func (c CharacteristicService) get(id int64, dummy string) (entity, *appError) { func (c CharacteristicService) get(id int64, dummy string, claims Claims) (entity, *appError) {
var characteristic Characteristic var characteristic Characteristic
q := `SELECT c.*, array_agg(m.id) AS measurements, array_agg(st.id) AS strains q := `SELECT c.*, array_agg(m.id) AS measurements, array_agg(st.id) AS strains
FROM characteristics c FROM characteristics c

View file

@ -7,7 +7,7 @@ type entity interface {
} }
type getter interface { type getter interface {
get(int64, string) (entity, *appError) get(int64, string, Claims) (entity, *appError)
} }
type lister interface { type lister interface {

View file

@ -127,7 +127,9 @@ func handleGetter(g getter) errorHandler {
return newJSONError(err, http.StatusInternalServerError) return newJSONError(err, http.StatusInternalServerError)
} }
e, appErr := g.get(id, mux.Vars(r)["genus"]) claims := getClaims(r)
e, appErr := g.get(id, mux.Vars(r)["genus"], claims)
if appErr != nil { if appErr != nil {
return appErr return appErr
} }

View file

@ -118,3 +118,18 @@ func getClaims(r *http.Request) Claims {
func canAdd(claims Claims) bool { func canAdd(claims Claims) bool {
return claims.Role == "A" || claims.Role == "W" return claims.Role == "A" || claims.Role == "W"
} }
func canEdit(claims Claims, id_list map[int64]int64) []int64 {
id := claims.Sub
role := claims.Role
out := make([]int64, 0)
for k, v := range id_list {
if (role == "W" && id == v) || role == "A" {
out = append(out, k)
}
}
return out
}

View file

@ -138,7 +138,7 @@ func (m MeasurementService) list(val *url.Values, claims Claims) (entity, *appEr
return &measurements, nil return &measurements, nil
} }
func (m MeasurementService) get(id int64, genus string) (entity, *appError) { func (m MeasurementService) get(id int64, genus string, claims Claims) (entity, *appError) {
var measurement Measurement var measurement Measurement
q := `SELECT m.*, t.text_measurement_name AS text_measurement_type_name, q := `SELECT m.*, t.text_measurement_name AS text_measurement_type_name,
u.symbol AS unit_type_name, te.name AS test_method_name u.symbol AS unit_type_name, te.name AS test_method_name

View file

@ -51,7 +51,14 @@ type Species struct {
type ManySpecies []*Species type ManySpecies []*Species
type SpeciesMeta struct { type SpeciesMeta struct {
CanAdd bool `json:"canAdd"` CanAdd bool `json:"canAdd"`
CanEdit []int64 `json:"canEdit"`
}
type SpeciesPayload struct {
Species *Species `json:"species"`
Strains *Strains `json:"strains"`
Meta *SpeciesMeta `json:"meta"`
} }
type ManySpeciesPayload struct { type ManySpeciesPayload struct {
@ -68,6 +75,10 @@ func (s *Species) marshal() ([]byte, error) {
return json.Marshal(&SpeciesJSON{Species: s}) return json.Marshal(&SpeciesJSON{Species: s})
} }
func (s *SpeciesPayload) marshal() ([]byte, error) {
return json.Marshal(s)
}
func (s *ManySpeciesPayload) marshal() ([]byte, error) { func (s *ManySpeciesPayload) marshal() ([]byte, error) {
return json.Marshal(s) return json.Marshal(s)
} }
@ -126,10 +137,19 @@ func (s SpeciesService) list(val *url.Values, claims Claims) (entity, *appError)
return nil, newJSONError(err, http.StatusInternalServerError) return nil, newJSONError(err, http.StatusInternalServerError)
} }
edit_list := make(map[int64]int64)
for _, v := range species {
edit_list[v.Id] = v.CreatedBy
}
payload := ManySpeciesPayload{ payload := ManySpeciesPayload{
Species: &species, Species: &species,
Strains: strains, Strains: strains,
Meta: &SpeciesMeta{CanAdd: canAdd(claims)}, Meta: &SpeciesMeta{
CanAdd: canAdd(claims),
CanEdit: canEdit(claims, edit_list),
},
} }
return &payload, nil return &payload, nil
@ -159,7 +179,7 @@ func strainOptsFromSpecies(opt ListOptions) (*ListOptions, error) {
return &ListOptions{Genus: opt.Genus, Ids: relatedStrainIds}, nil return &ListOptions{Genus: opt.Genus, Ids: relatedStrainIds}, nil
} }
func (s SpeciesService) get(id int64, genus string) (entity, *appError) { func (s SpeciesService) get(id int64, genus string, claims Claims) (entity, *appError) {
var species Species var species Species
q := `SELECT sp.*, g.genus_name, array_agg(st.id) AS strains, q := `SELECT sp.*, g.genus_name, array_agg(st.id) AS strains,
COUNT(st) AS total_strains, 0 AS sort_order COUNT(st) AS total_strains, 0 AS sort_order
@ -174,7 +194,29 @@ func (s SpeciesService) get(id int64, genus string) (entity, *appError) {
} }
return nil, newJSONError(err, http.StatusInternalServerError) return nil, newJSONError(err, http.StatusInternalServerError)
} }
return &species, nil
opt := ListOptions{Genus: genus, Ids: []int64{id}}
strains_opt, err := strainOptsFromSpecies(opt)
if err != nil {
return nil, newJSONError(err, http.StatusInternalServerError)
}
strains, err := listStrains(*strains_opt)
if err != nil {
return nil, newJSONError(err, http.StatusInternalServerError)
}
payload := SpeciesPayload{
Species: &species,
Strains: strains,
Meta: &SpeciesMeta{
CanAdd: canAdd(claims),
CanEdit: canEdit(claims, map[int64]int64{species.Id: species.CreatedBy}),
},
}
return &payload, nil
} }
func (s SpeciesService) update(id int64, e *entity, claims Claims) *appError { func (s SpeciesService) update(id int64, e *entity, claims Claims) *appError {

View file

@ -125,7 +125,7 @@ func listStrains(opt ListOptions) (*Strains, error) {
return &strains, nil return &strains, nil
} }
func (s StrainService) get(id int64, genus string) (entity, *appError) { func (s StrainService) get(id int64, genus string, claims Claims) (entity, *appError) {
var strain Strain var strain Strain
q := `SELECT st.*, array_agg(m.id) AS measurements, COUNT(m) AS total_measurements, q := `SELECT st.*, array_agg(m.id) AS measurements, COUNT(m) AS total_measurements,
0 AS sort_order 0 AS sort_order

View file

@ -145,7 +145,7 @@ func (u UserService) list(val *url.Values, claims Claims) (entity, *appError) {
return &users, nil return &users, nil
} }
func (u UserService) get(id int64, genus string) (entity, *appError) { func (u UserService) get(id int64, genus string, claims Claims) (entity, *appError) {
var user User var user User
q := `SELECT id, email, 'password' AS password, name, role, q := `SELECT id, email, 'password' AS password, name, role,
created_at, updated_at, deleted_at created_at, updated_at, deleted_at