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  }