// title: service list // path: /services // method: GET // produce: application/json // responses: // 200: List services // 204: No content // 401: Unauthorized func serviceList(w http.ResponseWriter, r *http.Request, t auth.Token) error { rec.Log(t.GetUserName(), "list-services") teams := []string{} serviceNames := []string{} contexts := permission.ContextsForPermission(t, permission.PermServiceRead) for _, c := range contexts { if c.CtxType == permission.CtxGlobal { teams = nil serviceNames = nil break } switch c.CtxType { case permission.CtxService: serviceNames = append(serviceNames, c.Value) case permission.CtxTeam: teams = append(teams, c.Value) } } services, err := service.GetServicesByOwnerTeamsAndServices(teams, serviceNames) if err != nil { return err } sInstances, err := service.GetServiceInstancesByServices(services) if err != nil { return err } results := make([]service.ServiceModel, len(services)) for i, s := range services { results[i].Service = s.Name for _, si := range sInstances { if si.ServiceName == s.Name { results[i].Instances = append(results[i].Instances, si.Name) } } } if len(results) == 0 { w.WriteHeader(http.StatusNoContent) return nil } b, err := json.Marshal(results) if err != nil { return &errors.HTTP{Code: http.StatusInternalServerError, Message: err.Error()} } n, err := w.Write(b) if n != len(b) { return &errors.HTTP{Code: http.StatusInternalServerError, Message: "Failed to write response body"} } w.Header().Set("Content-Type", "application/json") return err }
func provisionReadableServices(t auth.Token, contexts []permission.PermissionContext) ([]service.Service, error) { teams, serviceNames := filtersForServiceList(t, contexts) return service.GetServicesByOwnerTeamsAndServices(teams, serviceNames) }