func getReport(w http.ResponseWriter, r *http.Request) { res := &Reports{} limit := 20 if r.FormValue("count") != "" { limit, _ = strconv.Atoi(r.FormValue("count")) } dh := db.GetHandler() defer dh.Close() order := dh.OrderBy("start", genmai.DESC).Limit(limit + 1) var cond [][]interface{} re := regexp.MustCompile(`^/api/v1/reports/(\d+)$`) reportId := "" if m := re.FindStringSubmatch(r.URL.Path); m != nil { reportId = m[1] } if reportId != "" { cond = append(cond, []interface{}{"id", "=", reportId}) } if projectId := r.FormValue("projectId"); projectId != "" { cond = append(cond, []interface{}{"project_id", "=", projectId}) } if until := r.FormValue("until"); until != "" { u, _ := strconv.ParseInt(until, 10, 64) cond = append(cond, []interface{}{"start", "<=", time.Unix(u, 0)}) } if since := r.FormValue("since"); since != "" { s, _ := strconv.ParseInt(since, 10, 64) cond = append(cond, []interface{}{"start", ">=", time.Unix(s, 0)}) } if status := r.FormValue("status"); status != "" { cond = append(cond, []interface{}{"status", "=", status}) } where := &genmai.Condition{} for i, c := range cond { if i < 1 { where = dh.Where(c[0], c[1], c[2]) } else { where = where.And(dh.Where(c[0], c[1], c[2])) } } var reports []db.Report dh.Select(&reports, where, order) if len(reports) > limit { res.NextStart = reports[limit].Start.Unix() reports = reports[:len(reports)-1] } for _, report := range reports { r := &Report{ Id: report.Id, Status: report.Status, Branch: report.Branch, CompareUrl: report.CompareUrl, Start: report.Start.Unix(), End: report.End.Unix(), } var projects []db.Project dh.Select(&projects, dh.Where("id", "=", report.ProjectId)) project := projects[0] r.Project = &Project{ Id: project.Id, Name: project.Name, Repo: project.Repo, } var commits []db.Commit dh.Select(&commits, dh.Where("report_id", "=", report.Id)) for _, commit := range commits { r.Commits = append(r.Commits, &Commit{ Revision: commit.Revision, Author: commit.Author, Message: commit.Message, Url: commit.Url, }) } var users []db.User dh.Select(&users, dh.Where("id", "=", report.TriggeredBy)) user := users[0] r.TriggeredBy.Name = user.Name r.TriggeredBy.Url = user.Url r.TriggeredBy.AvatarUrl = user.AvatarUrl var stages []db.Stage dh.Select(&stages, dh.Where("report_id", "=", report.Id).And(dh.Where("parent_stage_id", "=", 0))) for _, stage := range stages { s := &Stage{ Id: stage.Id, Name: stage.Name, Status: stage.Status, Log: stage.Log, Start: stage.Start.Unix(), End: stage.End.Unix(), } var childStages []db.Stage dh.Select(&childStages, dh.Where("report_id", "=", report.Id).And(dh.Where("parent_stage_id", "=", stage.Id))) for _, childStage := range childStages { s.Stages = append(s.Stages, &Stage{ Id: childStage.Id, Name: childStage.Name, Status: childStage.Status, Log: childStage.Log, Start: childStage.Start.Unix(), End: childStage.End.Unix(), }) } r.Stages = append(r.Stages, s) } res.Reports = append(res.Reports, r) } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) var b []byte if reportId != "" { b, _ = json.Marshal(&struct{ Report *Report }{Report: res.Reports[0]}) } else { b, _ = json.Marshal(res) } fmt.Fprint(w, string(b)) }