func (server *Server) serveGroup(writer http.ResponseWriter, request *http.Request) { var ( groupID string groupType int ) if strings.HasPrefix(request.URL.Path, urlLibraryPath+"sourcegroups") { groupID = strings.TrimPrefix(request.URL.Path, urlLibraryPath+"sourcegroups/") groupType = library.LibraryItemSourceGroup } else if strings.HasPrefix(request.URL.Path, urlLibraryPath+"metricgroups") { groupID = strings.TrimPrefix(request.URL.Path, urlLibraryPath+"metricgroups/") groupType = library.LibraryItemMetricGroup } switch request.Method { case "DELETE": if groupID == "" { server.serveResponse(writer, serverResponse{mesgMethodNotAllowed}, http.StatusMethodNotAllowed) return } err := server.Library.DeleteItem(groupID, groupType) if os.IsNotExist(err) { server.serveResponse(writer, serverResponse{mesgResourceNotFound}, http.StatusNotFound) return } else if err != nil { logger.Log(logger.LevelError, "server", "%s", err) server.serveResponse(writer, serverResponse{mesgUnhandledError}, http.StatusInternalServerError) return } server.serveResponse(writer, nil, http.StatusOK) case "GET", "HEAD": if groupID == "" { server.serveGroupList(writer, request) return } item, err := server.Library.GetItem(groupID, groupType) if os.IsNotExist(err) { server.serveResponse(writer, serverResponse{mesgResourceNotFound}, http.StatusNotFound) return } else if err != nil { logger.Log(logger.LevelError, "server", "%s", err) server.serveResponse(writer, serverResponse{mesgUnhandledError}, http.StatusInternalServerError) return } server.serveResponse(writer, item, http.StatusOK) case "POST", "PUT": var group *library.Group if response, status := server.parseStoreRequest(writer, request, groupID); status != http.StatusOK { server.serveResponse(writer, response, status) return } if request.Method == "POST" && request.FormValue("inherit") != "" { // Get group from library item, err := server.Library.GetItem(request.FormValue("inherit"), groupType) if os.IsNotExist(err) { server.serveResponse(writer, serverResponse{mesgResourceNotFound}, http.StatusNotFound) return } else if err != nil { logger.Log(logger.LevelError, "server", "%s", err) server.serveResponse(writer, serverResponse{mesgUnhandledError}, http.StatusInternalServerError) return } group = &library.Group{} utils.Clone(item.(*library.Group), group) group.ID = "" } else { // Create a new group instance group = &library.Group{Item: library.Item{ID: groupID}, Type: groupType} } group.Modified = time.Now() // Parse input JSON for group data body, _ := ioutil.ReadAll(request.Body) if err := json.Unmarshal(body, group); err != nil { logger.Log(logger.LevelError, "server", "%s", err) server.serveResponse(writer, serverResponse{mesgResourceInvalid}, http.StatusBadRequest) return } // Store group data err := server.Library.StoreItem(group, groupType) if response, status := server.parseError(writer, request, err); status != http.StatusOK { logger.Log(logger.LevelError, "server", "%s", err) server.serveResponse(writer, response, status) return } if request.Method == "POST" { writer.Header().Add("Location", strings.TrimRight(request.URL.Path, "/")+"/"+group.ID) server.serveResponse(writer, nil, http.StatusCreated) } else { server.serveResponse(writer, nil, http.StatusOK) } default: server.serveResponse(writer, serverResponse{mesgMethodNotAllowed}, http.StatusMethodNotAllowed) } }