// DeleteNoticesByIDs deletes notices by given IDs. func DeleteNoticesByIDs(ids []int64) error { if len(ids) == 0 { return nil } _, err := x.Where("id IN (" + strings.Join(base.Int64sToStrings(ids), ",") + ")").Delete(new(Notice)) return err }
// GetUserIssueStats returns issue statistic information for dashboard by given conditions. func GetUserIssueStats(repoID, uid int64, repoIDs []int64, filterMode int) *IssueStats { stats := &IssueStats{} issue := new(Issue) stats.AssignCount, _ = x.Where("assignee_id=?", uid).And("is_closed=?", false).Count(issue) stats.CreateCount, _ = x.Where("poster_id=?", uid).And("is_closed=?", false).Count(issue) queryStr := "SELECT COUNT(*) FROM `issue` " baseCond := " WHERE issue.is_closed=?" if repoID > 0 { baseCond += " AND issue.repo_id=" + com.ToStr(repoID) } else { baseCond += " AND issue.repo_id IN (" + strings.Join(base.Int64sToStrings(repoIDs), ",") + ")" } switch filterMode { case FM_ASSIGN: baseCond += " AND assignee_id=" + com.ToStr(uid) case FM_CREATE: baseCond += " AND poster_id=" + com.ToStr(uid) } results, _ := x.Query(queryStr+baseCond, false) stats.OpenCount = parseCountResult(results) results, _ = x.Query(queryStr+baseCond, true) stats.ClosedCount = parseCountResult(results) return stats }
// deletePublicKeys does the actual key deletion but does not update authorized_keys file. func deletePublicKeys(e *xorm.Session, keyIDs ...int64) error { if len(keyIDs) == 0 { return nil } _, err := e.In("id", strings.Join(base.Int64sToStrings(keyIDs), ",")).Delete(new(PublicKey)) return err }
// GetUserRepositories returns a range of repositories in organization // that the user with the given userID has access to, // and total number of records based on given condition. func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repository, int64, error) { teamIDs, err := org.GetUserTeamIDs(userID) if err != nil { return nil, 0, fmt.Errorf("GetUserTeamIDs: %v", err) } if len(teamIDs) == 0 { // user has no team but "IN ()" is invalid SQL teamIDs = []int64{-1} // there is no repo with id=-1 } if page <= 0 { page = 1 } repos := make([]*Repository, 0, pageSize) // FIXME: use XORM chain operations instead of raw SQL. if err = x.Sql(fmt.Sprintf(`SELECT repository.* FROM repository INNER JOIN team_repo ON team_repo.repo_id = repository.id WHERE (repository.owner_id = ? AND repository.is_private = ?) OR team_repo.team_id IN (%s) GROUP BY repository.id ORDER BY updated_unix DESC LIMIT %d OFFSET %d`, strings.Join(base.Int64sToStrings(teamIDs), ","), pageSize, (page-1)*pageSize), org.ID, false).Find(&repos); err != nil { return nil, 0, fmt.Errorf("get repositories: %v", err) } results, err := x.Query(fmt.Sprintf(`SELECT repository.id FROM repository INNER JOIN team_repo ON team_repo.repo_id = repository.id WHERE (repository.owner_id = ? AND repository.is_private = ?) OR team_repo.team_id IN (%s) GROUP BY repository.id ORDER BY updated_unix DESC`, strings.Join(base.Int64sToStrings(teamIDs), ",")), org.ID, false) if err != nil { log.Error(4, "count user repositories in organization: %v", err) } return repos, int64(len(results)), nil }
func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) { issueLabels, err := getIssueLabels(e, issueID) if err != nil { return nil, fmt.Errorf("getIssueLabels: %v", err) } else if len(issueLabels) == 0 { return []*Label{}, nil } labelIDs := make([]int64, len(issueLabels)) for i := range issueLabels { labelIDs[i] = issueLabels[i].LabelID } labels := make([]*Label, 0, len(labelIDs)) return labels, e.Where("id > 0").In("id", base.Int64sToStrings(labelIDs)).Find(&labels) }
// GetUserRepositories returns mirror repositories of the organization // that the user with the given userID has access to. func (org *User) GetUserMirrorRepositories(userID int64) ([]*Repository, error) { teamIDs, err := org.GetUserTeamIDs(userID) if err != nil { return nil, fmt.Errorf("GetUserTeamIDs: %v", err) } if len(teamIDs) == 0 { teamIDs = []int64{-1} } repos := make([]*Repository, 0, 10) if err = x.Sql(fmt.Sprintf(`SELECT repository.* FROM repository INNER JOIN team_repo ON team_repo.repo_id = repository.id AND repository.is_mirror = ? WHERE (repository.owner_id = ? AND repository.is_private = ?) OR team_repo.team_id IN (%s) GROUP BY repository.id ORDER BY updated_unix DESC`, strings.Join(base.Int64sToStrings(teamIDs), ",")), true, org.ID, false).Find(&repos); err != nil { return nil, fmt.Errorf("get repositories: %v", err) } return repos, nil }
// GetUserIssueStats returns issue statistic information for dashboard by given conditions. func GetUserIssueStats(repoID, uid int64, repoIDs []int64, filterMode int, isPull bool) *IssueStats { stats := &IssueStats{} queryStr := "SELECT COUNT(*) FROM `issue` " baseCond := " WHERE issue.is_closed=?" if repoID > 0 || len(repoIDs) == 0 { baseCond += " AND issue.repo_id=" + com.ToStr(repoID) } else { baseCond += " AND issue.repo_id IN (" + strings.Join(base.Int64sToStrings(repoIDs), ",") + ")" } if isPull { baseCond += " AND issue.is_pull=1" } else { baseCond += " AND issue.is_pull=0" } results, _ := x.Query(queryStr+baseCond+" AND assignee_id=?", false, uid) stats.AssignCount = parseCountResult(results) results, _ = x.Query(queryStr+baseCond+" AND poster_id=?", false, uid) stats.CreateCount = parseCountResult(results) switch filterMode { case FM_ASSIGN: baseCond += " AND assignee_id=" + com.ToStr(uid) case FM_CREATE: baseCond += " AND poster_id=" + com.ToStr(uid) } results, _ = x.Query(queryStr+baseCond, false) stats.OpenCount = parseCountResult(results) results, _ = x.Query(queryStr+baseCond, true) stats.ClosedCount = parseCountResult(results) return stats }
// Issues returns a list of issues by given conditions. func Issues(opts *IssuesOptions) ([]*Issue, error) { sess := x.Limit(setting.IssuePagingNum, (opts.Page-1)*setting.IssuePagingNum) if opts.RepoID > 0 { sess.Where("issue.repo_id=?", opts.RepoID).And("issue.is_closed=?", opts.IsClosed) } else if opts.RepoIDs != nil { // In case repository IDs are provided but actually no repository has issue. if len(opts.RepoIDs) == 0 { return make([]*Issue, 0), nil } sess.Where("issue.repo_id IN ("+strings.Join(base.Int64sToStrings(opts.RepoIDs), ",")+")").And("issue.is_closed=?", opts.IsClosed) } else { sess.Where("issue.is_closed=?", opts.IsClosed) } if opts.AssigneeID > 0 { sess.And("issue.assignee_id=?", opts.AssigneeID) } else if opts.PosterID > 0 { sess.And("issue.poster_id=?", opts.PosterID) } if opts.MilestoneID > 0 { sess.And("issue.milestone_id=?", opts.MilestoneID) } sess.And("issue.is_pull=?", opts.IsPull) switch opts.SortType { case "oldest": sess.Asc("created") case "recentupdate": sess.Desc("updated") case "leastupdate": sess.Asc("updated") case "mostcomment": sess.Desc("num_comments") case "leastcomment": sess.Asc("num_comments") case "priority": sess.Desc("priority") default: sess.Desc("created") } labelIDs := base.StringsToInt64s(strings.Split(opts.Labels, ",")) if len(labelIDs) > 0 { validJoin := false queryStr := "issue.id=issue_label.issue_id" for _, id := range labelIDs { if id == 0 { continue } validJoin = true queryStr += " AND issue_label.label_id=" + com.ToStr(id) } if validJoin { sess.Join("INNER", "issue_label", queryStr) } } if opts.IsMention { queryStr := "issue.id=issue_user.issue_id AND issue_user.is_mentioned=1" if opts.UserID > 0 { queryStr += " AND issue_user.uid=" + com.ToStr(opts.UserID) } sess.Join("INNER", "issue_user", queryStr) } issues := make([]*Issue, 0, setting.IssuePagingNum) return issues, sess.Find(&issues) }
// Issues returns a list of issues by given conditions. func Issues(opts *IssuesOptions) ([]*Issue, error) { if opts.Page <= 0 { opts.Page = 1 } sess := x.Limit(setting.UI.IssuePagingNum, (opts.Page-1)*setting.UI.IssuePagingNum) if opts.RepoID > 0 { sess.Where("issue.repo_id=?", opts.RepoID).And("issue.is_closed=?", opts.IsClosed) } else if opts.RepoIDs != nil { // In case repository IDs are provided but actually no repository has issue. if len(opts.RepoIDs) == 0 { return make([]*Issue, 0), nil } sess.In("issue.repo_id", base.Int64sToStrings(opts.RepoIDs)).And("issue.is_closed=?", opts.IsClosed) } else { sess.Where("issue.is_closed=?", opts.IsClosed) } if opts.AssigneeID > 0 { sess.And("issue.assignee_id=?", opts.AssigneeID) } else if opts.PosterID > 0 { sess.And("issue.poster_id=?", opts.PosterID) } if opts.MilestoneID > 0 { sess.And("issue.milestone_id=?", opts.MilestoneID) } sess.And("issue.is_pull=?", opts.IsPull) switch opts.SortType { case "oldest": sess.Asc("issue.created_unix") case "recentupdate": sess.Desc("issue.updated_unix") case "leastupdate": sess.Asc("issue.updated_unix") case "mostcomment": sess.Desc("issue.num_comments") case "leastcomment": sess.Asc("issue.num_comments") case "priority": sess.Desc("issue.priority") default: sess.Desc("issue.created_unix") } if len(opts.Labels) > 0 && opts.Labels != "0" { labelIDs := base.StringsToInt64s(strings.Split(opts.Labels, ",")) if len(labelIDs) > 0 { sess.Join("INNER", "issue_label", "issue.id = issue_label.issue_id").In("issue_label.label_id", labelIDs) } } if opts.IsMention { sess.Join("INNER", "issue_user", "issue.id = issue_user.issue_id").And("issue_user.is_mentioned = ?", true) if opts.UserID > 0 { sess.And("issue_user.uid = ?", opts.UserID) } } issues := make([]*Issue, 0, setting.UI.IssuePagingNum) return issues, sess.Find(&issues) }
// Issues returns a list of issues by given conditions. func Issues(uid, assigneeID, repoID, posterID, milestoneID int64, repoIDs []int64, page int, isClosed, isMention bool, labels, sortType string) ([]*Issue, error) { sess := x.Limit(setting.IssuePagingNum, (page-1)*setting.IssuePagingNum) if repoID > 0 { sess.Where("issue.repo_id=?", repoID).And("issue.is_closed=?", isClosed) } else if repoIDs != nil { sess.Where("issue.repo_id IN ("+strings.Join(base.Int64sToStrings(repoIDs), ",")+")").And("issue.is_closed=?", isClosed) } else { sess.Where("issue.is_closed=?", isClosed) } if assigneeID > 0 { sess.And("issue.assignee_id=?", assigneeID) } else if posterID > 0 { sess.And("issue.poster_id=?", posterID) } if milestoneID > 0 { sess.And("issue.milestone_id=?", milestoneID) } switch sortType { case "oldest": sess.Asc("created") case "recentupdate": sess.Desc("updated") case "leastupdate": sess.Asc("updated") case "mostcomment": sess.Desc("num_comments") case "leastcomment": sess.Asc("num_comments") case "priority": sess.Desc("priority") default: sess.Desc("created") } labelIDs := base.StringsToInt64s(strings.Split(labels, ",")) if len(labelIDs) > 0 { validJoin := false queryStr := "issue.id=issue_label.issue_id" for _, id := range labelIDs { if id == 0 { continue } validJoin = true queryStr += " AND issue_label.label_id=" + com.ToStr(id) } if validJoin { sess.Join("INNER", "issue_label", queryStr) } } if isMention { queryStr := "issue.id=issue_user.issue_id AND issue_user.is_mentioned=1" if uid > 0 { queryStr += " AND issue_user.uid=" + com.ToStr(uid) } sess.Join("INNER", "issue_user", queryStr) } issues := make([]*Issue, 0, setting.IssuePagingNum) return issues, sess.Find(&issues) }
// GetLabelsInRepoByIDs returns a list of labels by IDs in given repository, // it silently ignores label IDs that are not belong to the repository. func GetLabelsInRepoByIDs(repoID int64, labelIDs []int64) ([]*Label, error) { labels := make([]*Label, 0, len(labelIDs)) return labels, x.Where("repo_id = ?", repoID).In("id", base.Int64sToStrings(labelIDs)).Find(&labels) }