From 8d7f1e430a0de9642c86c2818fd36c09804ed002 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 25 Apr 2022 15:28:47 +0200 Subject: [PATCH] User specific repoID or xorm builder conditions for issue search (#19475) (#19476) --- models/issue.go | 21 +++++++++------------ models/issue_label.go | 7 ++----- models/issue_test.go | 5 +++-- modules/indexer/issues/indexer.go | 2 +- routers/api/v1/repo/issue.go | 5 +++-- routers/web/repo/issue.go | 2 +- routers/web/user/home.go | 10 ++-------- services/migrations/gitea_uploader_test.go | 2 +- 8 files changed, 22 insertions(+), 32 deletions(-) diff --git a/models/issue.go b/models/issue.go index a30e77a91b..fe2b04ce21 100644 --- a/models/issue.go +++ b/models/issue.go @@ -1165,7 +1165,8 @@ func GetIssuesByIDs(issueIDs []int64) ([]*Issue, error) { // IssuesOptions represents options of an issue. type IssuesOptions struct { db.ListOptions - RepoIDs []int64 // include all repos if empty + RepoID int64 // overwrites RepoCond if not 0 + RepoCond builder.Cond AssigneeID int64 PosterID int64 MentionedID int64 @@ -1256,15 +1257,15 @@ func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) { sess.In("issue.id", opts.IssueIDs) } - if len(opts.RepoIDs) > 0 { - applyReposCondition(sess, opts.RepoIDs) + if opts.RepoID != 0 { + opts.RepoCond = builder.Eq{"issue.repo_id": opts.RepoID} + } + if opts.RepoCond != nil { + sess.And(opts.RepoCond) } - switch opts.IsClosed { - case util.OptionalBoolTrue: - sess.And("issue.is_closed=?", true) - case util.OptionalBoolFalse: - sess.And("issue.is_closed=?", false) + if !opts.IsClosed.IsNone() { + sess.And("issue.is_closed=?", opts.IsClosed.IsTrue()) } if opts.AssigneeID > 0 { @@ -1383,10 +1384,6 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *Organizati return cond } -func applyReposCondition(sess *xorm.Session, repoIDs []int64) *xorm.Session { - return sess.In("issue.repo_id", repoIDs) -} - func applyAssigneeCondition(sess *xorm.Session, assigneeID int64) *xorm.Session { return sess.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id"). And("issue_assignees.assignee_id = ?", assigneeID) diff --git a/models/issue_label.go b/models/issue_label.go index 53d28c0596..4124f3d74a 100644 --- a/models/issue_label.go +++ b/models/issue_label.go @@ -101,12 +101,9 @@ func (label *Label) CalOpenIssues() { // CalOpenOrgIssues calculates the open issues of a label for a specific repo func (label *Label) CalOpenOrgIssues(repoID, labelID int64) { - repoIDs := []int64{repoID} - labelIDs := []int64{labelID} - counts, _ := CountIssuesByRepo(&IssuesOptions{ - RepoIDs: repoIDs, - LabelIDs: labelIDs, + RepoID: repoID, + LabelIDs: []int64{labelID}, }) for _, count := range counts { diff --git a/models/issue_test.go b/models/issue_test.go index aee9a50184..2581398acf 100644 --- a/models/issue_test.go +++ b/models/issue_test.go @@ -17,6 +17,7 @@ import ( user_model "code.gitea.io/gitea/models/user" "github.com/stretchr/testify/assert" + "xorm.io/builder" ) func TestIssue_ReplaceLabels(t *testing.T) { @@ -153,7 +154,7 @@ func TestIssues(t *testing.T) { }, { IssuesOptions{ - RepoIDs: []int64{1, 3}, + RepoCond: builder.In("repo_id", 1, 3), SortType: "oldest", ListOptions: db.ListOptions{ Page: 1, @@ -340,7 +341,7 @@ func TestGetRepoIDsForIssuesOptions(t *testing.T) { }, { IssuesOptions{ - RepoIDs: []int64{1, 2}, + RepoCond: builder.In("repo_id", 1, 2), }, []int64{1, 2}, }, diff --git a/modules/indexer/issues/indexer.go b/modules/indexer/issues/indexer.go index 4db5091762..6aa4d8185b 100644 --- a/modules/indexer/issues/indexer.go +++ b/modules/indexer/issues/indexer.go @@ -272,7 +272,7 @@ func populateIssueIndexer(ctx context.Context) { // UpdateRepoIndexer add/update all issues of the repositories func UpdateRepoIndexer(repo *repo_model.Repository) { is, err := models.Issues(&models.IssuesOptions{ - RepoIDs: []int64{repo.ID}, + RepoID: repo.ID, IsClosed: util.OptionalBoolNone, IsPull: util.OptionalBoolNone, }) diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index c6e08b00f3..b5b1659c93 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -173,6 +173,7 @@ func SearchIssues(ctx *context.APIContext) { opts.TeamID = team.ID } + repoCond := models.SearchRepositoryCondition(opts) repoIDs, _, err := models.SearchRepositoryIDs(opts) if err != nil { ctx.Error(http.StatusInternalServerError, "SearchRepositoryByName", err) @@ -233,7 +234,7 @@ func SearchIssues(ctx *context.APIContext) { Page: ctx.FormInt("page"), PageSize: limit, }, - RepoIDs: repoIDs, + RepoCond: repoCond, IsClosed: isClosed, IssueIDs: issueIDs, IncludedLabelNames: includedLabelNames, @@ -460,7 +461,7 @@ func ListIssues(ctx *context.APIContext) { if len(keyword) == 0 || len(issueIDs) > 0 || len(labelIDs) > 0 { issuesOpt := &models.IssuesOptions{ ListOptions: listOptions, - RepoIDs: []int64{ctx.Repo.Repository.ID}, + RepoID: ctx.Repo.Repository.ID, IsClosed: isClosed, IssueIDs: issueIDs, LabelIDs: labelIDs, diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index bb24d0462c..248743471b 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -226,7 +226,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti Page: pager.Paginater.Current(), PageSize: setting.UI.IssuePagingNum, }, - RepoIDs: []int64{repo.ID}, + RepoID: repo.ID, AssigneeID: assigneeID, PosterID: posterID, MentionedID: mentionedID, diff --git a/routers/web/user/home.go b/routers/web/user/home.go index 6f1234d096..b2d9a9ca50 100644 --- a/routers/web/user/home.go +++ b/routers/web/user/home.go @@ -462,13 +462,7 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { // to check if it's in the team(which possible isn't the case). opts.User = nil } - userRepoIDs, _, err := models.SearchRepositoryIDs(repoOpts) - if err != nil { - ctx.ServerError("models.SearchRepositoryIDs: %v", err) - return - } - - opts.RepoIDs = userRepoIDs + opts.RepoCond = models.SearchRepositoryCondition(repoOpts) } // keyword holds the search term entered into the search field. @@ -532,7 +526,7 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { // Gets set when clicking filters on the issues overview page. repoIDs := getRepoIDs(ctx.FormString("repos")) if len(repoIDs) > 0 { - opts.RepoIDs = repoIDs + opts.RepoCond = builder.In("issue.repo_id", repoIDs) } // ------------------------------ diff --git a/services/migrations/gitea_uploader_test.go b/services/migrations/gitea_uploader_test.go index 7d4f77eac8..ed3e32952c 100644 --- a/services/migrations/gitea_uploader_test.go +++ b/services/migrations/gitea_uploader_test.go @@ -97,7 +97,7 @@ func TestGiteaUploadRepo(t *testing.T) { assert.Len(t, releases, 1) issues, err := models.Issues(&models.IssuesOptions{ - RepoIDs: []int64{repo.ID}, + RepoID: repo.ID, IsPull: util.OptionalBoolFalse, SortType: "oldest", })