func (uis *UIServer) modifyVersion(w http.ResponseWriter, r *http.Request) { projCtx := MustHaveProjectContext(r) user := MustHaveUser(r) if projCtx.Project == nil || projCtx.Version == nil { http.Error(w, "not found", http.StatusNotFound) return } jsonMap := struct { Action string `json:"action"` Active bool `json:"active"` Abort bool `json:"abort"` Priority int64 `json:"priority"` TaskIds []string `json:"task_ids"` }{} err := util.ReadJSONInto(r.Body, &jsonMap) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } // determine what action needs to be taken switch jsonMap.Action { case "restart": if err = model.RestartVersion(projCtx.Version.Id, jsonMap.TaskIds, jsonMap.Abort, user.Id); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } case "set_active": if jsonMap.Abort { if err = model.AbortVersion(projCtx.Version.Id); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } if err = model.SetVersionActivation(projCtx.Version.Id, jsonMap.Active, user.Id); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } case "set_priority": if jsonMap.Priority > evergreen.MaxTaskPriority { if !uis.isSuperUser(user) { http.Error(w, fmt.Sprintf("Insufficient access to set priority %v, can only set priority less than or equal to %v", jsonMap.Priority, evergreen.MaxTaskPriority), http.StatusBadRequest) return } } if err = model.SetVersionPriority(projCtx.Version.Id, jsonMap.Priority); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } default: uis.WriteJSON(w, http.StatusBadRequest, fmt.Sprintf("Unrecognized action: %v", jsonMap.Action)) return } // After the version has been modified, re-load it from DB and send back the up-to-date view // to the client. projCtx.Version, err = version.FindOne(version.ById(projCtx.Version.Id)) if err != nil { uis.LoggedError(w, r, http.StatusInternalServerError, err) return } versionAsUI := uiVersion{ Version: *projCtx.Version, RepoOwner: projCtx.ProjectRef.Owner, Repo: projCtx.ProjectRef.Repo, } dbBuilds, err := build.Find(build.ByIds(projCtx.Version.BuildIds)) if err != nil { uis.LoggedError(w, r, http.StatusInternalServerError, err) return } uiBuilds := make([]uiBuild, 0, len(projCtx.Version.BuildIds)) for _, build := range dbBuilds { buildAsUI := uiBuild{Build: build} uiTasks := make([]uiTask, 0, len(build.Tasks)) for _, t := range build.Tasks { uiTasks = append(uiTasks, uiTask{ Task: task.Task{Id: t.Id, Activated: t.Activated, StartTime: t.StartTime, TimeTaken: t.TimeTaken, Status: t.Status, Details: t.StatusDetails, DisplayName: t.DisplayName}, }) if t.Activated { versionAsUI.ActiveTasks++ } } buildAsUI.Tasks = uiTasks uiBuilds = append(uiBuilds, buildAsUI) } versionAsUI.Builds = uiBuilds uis.WriteJSON(w, http.StatusOK, versionAsUI) }
func (uis *UIServer) modifyVersion(w http.ResponseWriter, r *http.Request) { projCtx := MustHaveProjectContext(r) user := MustHaveUser(r) if projCtx.Project == nil || projCtx.Version == nil { http.Error(w, "not found", http.StatusNotFound) return } jsonMap := struct { Action string `json:"action"` Active bool `json:"active"` Abort bool `json:"abort"` Priority int `json:"priority"` }{} err := util.ReadJSONInto(r.Body, &jsonMap) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } // determine what action needs to be taken switch jsonMap.Action { case "set_active": if jsonMap.Abort { if err = model.AbortVersion(projCtx.Version.Id); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } else { msg := NewSuccessFlash("All tasks in this version are now aborting.") PushFlash(uis.CookieStore, r, w, msg) } } if err = model.SetVersionActivation(projCtx.Version.Id, jsonMap.Active, user.Id); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } else { if !jsonMap.Abort { // don't add a msg if we already added one for abort var msg flashMessage if jsonMap.Active { msg = NewSuccessFlash("All tasks in this version are now scheduled.") } else { msg = NewSuccessFlash("All tasks in this version are now unscheduled.") } PushFlash(uis.CookieStore, r, w, msg) } } uis.WriteJSON(w, http.StatusOK, projCtx.Version) return case "set_priority": if err = model.SetVersionPriority(projCtx.Version.Id, jsonMap.Priority); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } msg := NewSuccessFlash(fmt.Sprintf("Priority for all tasks in this version set to %v.", jsonMap.Priority)) PushFlash(uis.CookieStore, r, w, msg) uis.WriteJSON(w, http.StatusOK, projCtx.Version) return default: uis.WriteJSON(w, http.StatusBadRequest, fmt.Sprintf("Unrecognized action: %v", jsonMap.Action)) return } return }