mirror of
https://github.com/go-gitea/gitea
synced 2024-09-11 06:16:04 +00:00
Should resolve #30642. Before this commit, we were treating an empty `?sort=` query parameter as the correct sorting type (which is to sort issues in descending order by their created UNIX time). But when we perform `sort=latest`, we did not include this as a type so we would sort by the most recently updated when reaching the `default` switch statement block. This commit fixes this by considering the empty string, "latest", and just any other string that is not mentioned in the switch statement as sorting by newest.
96 lines
2.7 KiB
Go
96 lines
2.7 KiB
Go
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package issues
|
|
|
|
import (
|
|
"code.gitea.io/gitea/models/db"
|
|
issues_model "code.gitea.io/gitea/models/issues"
|
|
"code.gitea.io/gitea/modules/optional"
|
|
)
|
|
|
|
func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOptions {
|
|
searchOpt := &SearchOptions{
|
|
Keyword: keyword,
|
|
RepoIDs: opts.RepoIDs,
|
|
AllPublic: opts.AllPublic,
|
|
IsPull: opts.IsPull,
|
|
IsClosed: opts.IsClosed,
|
|
}
|
|
|
|
if len(opts.LabelIDs) == 1 && opts.LabelIDs[0] == 0 {
|
|
searchOpt.NoLabelOnly = true
|
|
} else {
|
|
for _, labelID := range opts.LabelIDs {
|
|
if labelID > 0 {
|
|
searchOpt.IncludedLabelIDs = append(searchOpt.IncludedLabelIDs, labelID)
|
|
} else {
|
|
searchOpt.ExcludedLabelIDs = append(searchOpt.ExcludedLabelIDs, -labelID)
|
|
}
|
|
}
|
|
// opts.IncludedLabelNames and opts.ExcludedLabelNames are not supported here.
|
|
// It's not a TO DO, it's just unnecessary.
|
|
}
|
|
|
|
if len(opts.MilestoneIDs) == 1 && opts.MilestoneIDs[0] == db.NoConditionID {
|
|
searchOpt.MilestoneIDs = []int64{0}
|
|
} else {
|
|
searchOpt.MilestoneIDs = opts.MilestoneIDs
|
|
}
|
|
|
|
// See the comment of issues_model.SearchOptions for the reason why we need to convert
|
|
convertID := func(id int64) optional.Option[int64] {
|
|
if id > 0 {
|
|
return optional.Some(id)
|
|
}
|
|
if id == db.NoConditionID {
|
|
return optional.None[int64]()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
searchOpt.ProjectID = convertID(opts.ProjectID)
|
|
searchOpt.ProjectBoardID = convertID(opts.ProjectBoardID)
|
|
searchOpt.PosterID = convertID(opts.PosterID)
|
|
searchOpt.AssigneeID = convertID(opts.AssigneeID)
|
|
searchOpt.MentionID = convertID(opts.MentionedID)
|
|
searchOpt.ReviewedID = convertID(opts.ReviewedID)
|
|
searchOpt.ReviewRequestedID = convertID(opts.ReviewRequestedID)
|
|
searchOpt.SubscriberID = convertID(opts.SubscriberID)
|
|
|
|
if opts.UpdatedAfterUnix > 0 {
|
|
searchOpt.UpdatedAfterUnix = optional.Some(opts.UpdatedAfterUnix)
|
|
}
|
|
if opts.UpdatedBeforeUnix > 0 {
|
|
searchOpt.UpdatedBeforeUnix = optional.Some(opts.UpdatedBeforeUnix)
|
|
}
|
|
|
|
searchOpt.Paginator = opts.Paginator
|
|
|
|
switch opts.SortType {
|
|
case "", "latest":
|
|
searchOpt.SortBy = SortByCreatedDesc
|
|
case "oldest":
|
|
searchOpt.SortBy = SortByCreatedAsc
|
|
case "recentupdate":
|
|
searchOpt.SortBy = SortByUpdatedDesc
|
|
case "leastupdate":
|
|
searchOpt.SortBy = SortByUpdatedAsc
|
|
case "mostcomment":
|
|
searchOpt.SortBy = SortByCommentsDesc
|
|
case "leastcomment":
|
|
searchOpt.SortBy = SortByCommentsAsc
|
|
case "nearduedate":
|
|
searchOpt.SortBy = SortByDeadlineAsc
|
|
case "farduedate":
|
|
searchOpt.SortBy = SortByDeadlineDesc
|
|
case "priority", "priorityrepo", "project-column-sorting":
|
|
// Unsupported sort type for search
|
|
fallthrough
|
|
default:
|
|
searchOpt.SortBy = SortByUpdatedDesc
|
|
}
|
|
|
|
return searchOpt
|
|
}
|