package locations import ( "encoding/json" "net/http" "github.com/dustinpianalto/errors" "github.com/dustinpianalto/quartermaster" "github.com/dustinpianalto/quartermaster/internal/utils" "github.com/dustinpianalto/quartermaster/pkg/services" ) func locations(w http.ResponseWriter, r *http.Request) error { const method = "locations" token, err := utils.IsAuthenticated(r) if err != nil { return errors.E(method, errors.Permission, err) } if !token.Valid { return errors.E(method, errors.Permission, "user not authenticated") } user, err := services.UserService.User(token.Claims.(*quartermaster.Claims).Username) if err != nil { return errors.E(method, errors.Permission, err) } if r.Method == "POST" { err = addLocation(w, r, user) if err != nil { return errors.E(method, "there was a problem adding the location", err) } } else if r.Method == "GET" { err = getTopLocations(w, r, user) if err != nil { return errors.E(method, "there was a problem getting locations", err) } } else { return errors.E(method, errors.Malformed, "http method not allowed") } return nil } func addLocation(w http.ResponseWriter, r *http.Request, u *quartermaster.User) error { const method errors.Method = "locations/addLocation" var l *quartermaster.Location err := json.NewDecoder(r.Body).Decode(&l) if err != nil { return errors.E(method, errors.Malformed, "failed to decode location request", err) } if l.Name == "" || l.Description == "" { return errors.E(method, errors.Malformed, "name and description are required") } if l.Parent != nil { _, err := services.LocationService.Location(l.Parent.ID, u) if err != nil { return errors.E(method, errors.Malformed, "parent does not exist", err) } } l, err = services.LocationService.AddLocation(l, u) if err != nil { return errors.E(method, errors.Internal, err) } lJson, err := json.Marshal(l) if err != nil { return errors.E(method, errors.Internal, "error marshalling location", err) } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) w.Write(lJson) return nil } func getTopLocations(w http.ResponseWriter, r *http.Request, u *quartermaster.User) error { const method = "locations/getTopLocations" locations, err := services.LocationService.GetTopLocations(u) if err != nil { return errors.E(method, errors.Internal, "error getting locations", err) } locationsJson, err := json.Marshal(locations) if err != nil { return errors.E(method, errors.Internal, "error marshalling locations", err) } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) w.Write(locationsJson) return nil }