code.gitea.io/gitea@v1.22.3/modules/indexer/issues/dboptions.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package issues 5 6 import ( 7 "code.gitea.io/gitea/models/db" 8 issues_model "code.gitea.io/gitea/models/issues" 9 "code.gitea.io/gitea/modules/optional" 10 ) 11 12 func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOptions { 13 searchOpt := &SearchOptions{ 14 Keyword: keyword, 15 RepoIDs: opts.RepoIDs, 16 AllPublic: opts.AllPublic, 17 IsPull: opts.IsPull, 18 IsClosed: opts.IsClosed, 19 } 20 21 if len(opts.LabelIDs) == 1 && opts.LabelIDs[0] == 0 { 22 searchOpt.NoLabelOnly = true 23 } else { 24 for _, labelID := range opts.LabelIDs { 25 if labelID > 0 { 26 searchOpt.IncludedLabelIDs = append(searchOpt.IncludedLabelIDs, labelID) 27 } else { 28 searchOpt.ExcludedLabelIDs = append(searchOpt.ExcludedLabelIDs, -labelID) 29 } 30 } 31 // opts.IncludedLabelNames and opts.ExcludedLabelNames are not supported here. 32 // It's not a TO DO, it's just unnecessary. 33 } 34 35 if len(opts.MilestoneIDs) == 1 && opts.MilestoneIDs[0] == db.NoConditionID { 36 searchOpt.MilestoneIDs = []int64{0} 37 } else { 38 searchOpt.MilestoneIDs = opts.MilestoneIDs 39 } 40 41 if opts.ProjectID > 0 { 42 searchOpt.ProjectID = optional.Some(opts.ProjectID) 43 } else if opts.ProjectID == -1 { // FIXME: this is inconsistent from other places 44 searchOpt.ProjectID = optional.Some[int64](0) // Those issues with no project(projectid==0) 45 } 46 47 if opts.AssigneeID > 0 { 48 searchOpt.AssigneeID = optional.Some(opts.AssigneeID) 49 } else if opts.AssigneeID == -1 { // FIXME: this is inconsistent from other places 50 searchOpt.AssigneeID = optional.Some[int64](0) 51 } 52 53 // See the comment of issues_model.SearchOptions for the reason why we need to convert 54 convertID := func(id int64) optional.Option[int64] { 55 if id > 0 { 56 return optional.Some(id) 57 } 58 if id == db.NoConditionID { 59 return optional.None[int64]() 60 } 61 return nil 62 } 63 64 searchOpt.ProjectBoardID = convertID(opts.ProjectBoardID) 65 searchOpt.PosterID = convertID(opts.PosterID) 66 searchOpt.MentionID = convertID(opts.MentionedID) 67 searchOpt.ReviewedID = convertID(opts.ReviewedID) 68 searchOpt.ReviewRequestedID = convertID(opts.ReviewRequestedID) 69 searchOpt.SubscriberID = convertID(opts.SubscriberID) 70 71 if opts.UpdatedAfterUnix > 0 { 72 searchOpt.UpdatedAfterUnix = optional.Some(opts.UpdatedAfterUnix) 73 } 74 if opts.UpdatedBeforeUnix > 0 { 75 searchOpt.UpdatedBeforeUnix = optional.Some(opts.UpdatedBeforeUnix) 76 } 77 78 searchOpt.Paginator = opts.Paginator 79 80 switch opts.SortType { 81 case "", "latest": 82 searchOpt.SortBy = SortByCreatedDesc 83 case "oldest": 84 searchOpt.SortBy = SortByCreatedAsc 85 case "recentupdate": 86 searchOpt.SortBy = SortByUpdatedDesc 87 case "leastupdate": 88 searchOpt.SortBy = SortByUpdatedAsc 89 case "mostcomment": 90 searchOpt.SortBy = SortByCommentsDesc 91 case "leastcomment": 92 searchOpt.SortBy = SortByCommentsAsc 93 case "nearduedate": 94 searchOpt.SortBy = SortByDeadlineAsc 95 case "farduedate": 96 searchOpt.SortBy = SortByDeadlineDesc 97 case "priority", "priorityrepo", "project-column-sorting": 98 // Unsupported sort type for search 99 fallthrough 100 default: 101 searchOpt.SortBy = SortByUpdatedDesc 102 } 103 104 return searchOpt 105 }