mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-09-12 18:03:57 +02: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. (cherry picked from commit 9b7af4340c36d3e1888788499d16f83feeb1601b)
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
|
|
}
|