Species editable permissions
This commit is contained in:
		
							parent
							
								
									0b029f9098
								
							
						
					
					
						commit
						630fe07554
					
				
					 9 changed files with 70 additions and 11 deletions
				
			
		| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										15
									
								
								helpers.go
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								helpers.go
									
										
									
									
									
								
							| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										50
									
								
								species.go
									
										
									
									
									
								
							
							
						
						
									
										50
									
								
								species.go
									
										
									
									
									
								
							| 
						 | 
					@ -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 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								users.go
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								users.go
									
										
									
									
									
								
							| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in a new issue