Skip to content

Commit 684d744

Browse files
committed
Add logic if keyword is empty
1 parent ce2287f commit 684d744

File tree

3 files changed

+103
-96
lines changed

3 files changed

+103
-96
lines changed

models/issues/issue.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
user_model "code.gitea.io/gitea/models/user"
1818
"code.gitea.io/gitea/modules/container"
1919
"code.gitea.io/gitea/modules/log"
20+
"code.gitea.io/gitea/modules/optional"
2021
"code.gitea.io/gitea/modules/setting"
2122
api "code.gitea.io/gitea/modules/structs"
2223
"code.gitea.io/gitea/modules/timeutil"
@@ -501,8 +502,35 @@ func GetIssueByIndex(ctx context.Context, repoID, index int64) (*Issue, error) {
501502
return issue, nil
502503
}
503504

504-
func FindIssuesWithIndexPrefix(ctx context.Context, repoID, index int64, pageSize int) ([]*Issue, error) {
505+
func isPullToCond(isPull optional.Option[bool]) builder.Cond {
506+
if isPull.Has() {
507+
return builder.Eq{"is_pull": isPull.Value()}
508+
}
509+
return builder.NewCond()
510+
}
511+
512+
func FindLatestIssues(ctx context.Context, repoID int64, isPull optional.Option[bool], pageSize int) (IssueList, error) {
505513
issues := make([]*Issue, 0, pageSize)
514+
err := db.GetEngine(ctx).Where("repo_id = ?", repoID).
515+
And(isPullToCond(isPull)).
516+
OrderBy("created_unix DESC").
517+
Limit(pageSize).
518+
Find(&issues)
519+
return issues, err
520+
}
521+
522+
func FindIssuesTitleKeywords(ctx context.Context, repoID int64, keyword string, isPull optional.Option[bool], pageSize int) (IssueList, error) {
523+
issues := make([]*Issue, 0, pageSize)
524+
err := db.GetEngine(ctx).Where("repo_id = ?", repoID).
525+
And(isPullToCond(isPull)).
526+
And("name LIKE ?", "%"+keyword+"%").
527+
OrderBy("created_unix DESC").
528+
Limit(pageSize).
529+
Find(&issues)
530+
return issues, err
531+
}
532+
533+
func FindIssuesWithIndexPrefix(ctx context.Context, repoID, index int64, isPull optional.Option[bool], pageSize int) (IssueList, error) {
506534
var cond string
507535
switch {
508536
case setting.Database.Type.IsSQLite3():
@@ -515,9 +543,10 @@ func FindIssuesWithIndexPrefix(ctx context.Context, repoID, index int64, pageSiz
515543
cond = "CAST([index] AS VARCHAR) LIKE ?"
516544
}
517545

546+
issues := make([]*Issue, 0, pageSize)
518547
err := db.GetEngine(ctx).Where("repo_id = ?", repoID).
519-
And("`index` <> ?", index).
520-
And(cond, fmt.Sprintf("%d%%", index)).
548+
And(isPullToCond(isPull)).
549+
Where(cond, fmt.Sprintf("%d%%", index)).
521550
OrderBy("`index` ASC").
522551
Limit(pageSize).
523552
Find(&issues)

routers/web/repo/issue_suggestions.go

Lines changed: 4 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,11 @@ package repo
55

66
import (
77
"net/http"
8-
"sort"
9-
"strconv"
108

11-
"code.gitea.io/gitea/models/db"
12-
issues_model "code.gitea.io/gitea/models/issues"
139
"code.gitea.io/gitea/models/unit"
14-
issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
1510
"code.gitea.io/gitea/modules/optional"
16-
"code.gitea.io/gitea/modules/structs"
1711
"code.gitea.io/gitea/services/context"
12+
issue_service "code.gitea.io/gitea/services/issue"
1813
)
1914

2015
// IssueSuggestions returns a list of issue suggestions
@@ -31,95 +26,11 @@ func IssueSuggestions(ctx *context.Context) {
3126
isPull = optional.Some(false)
3227
}
3328

34-
indexKeyword, _ := strconv.ParseInt(keyword, 10, 64)
35-
pageSize := 5
36-
issues := make(issues_model.IssueList, 0, pageSize)
37-
if indexKeyword > 0 {
38-
issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, indexKeyword)
39-
if err != nil && !issues_model.IsErrIssueNotExist(err) {
40-
ctx.ServerError("GetIssueByIndex", err)
41-
return
42-
}
43-
if issue != nil {
44-
pageSize--
45-
}
46-
47-
issues, err = issues_model.FindIssuesWithIndexPrefix(ctx, ctx.Repo.Repository.ID, indexKeyword, pageSize)
48-
if err != nil {
49-
ctx.ServerError("FindIssuesWithIndexPrefix", err)
50-
return
51-
}
52-
pageSize -= len(issues)
53-
if issue != nil {
54-
issues = append([]*issues_model.Issue{issue}, issues...)
55-
}
56-
}
57-
58-
if pageSize > 0 {
59-
searchOpt := &issue_indexer.SearchOptions{
60-
Paginator: &db.ListOptions{
61-
Page: 0,
62-
PageSize: pageSize,
63-
},
64-
Keyword: keyword,
65-
RepoIDs: []int64{ctx.Repo.Repository.ID},
66-
IsPull: isPull,
67-
IsClosed: nil,
68-
SortBy: issue_indexer.SortByUpdatedDesc,
69-
}
70-
71-
ids, _, err := issue_indexer.SearchIssues(ctx, searchOpt)
72-
if err != nil {
73-
ctx.ServerError("SearchIssues", err)
74-
return
75-
}
76-
77-
for i := 0; i < len(ids); i++ {
78-
for _, issue := range issues {
79-
if ids[i] == issue.ID {
80-
ids = append(ids[:i], ids[i+1:]...)
81-
i--
82-
break
83-
}
84-
}
85-
}
86-
87-
if len(ids) > 0 {
88-
newIssues, err := issues_model.GetIssuesByIDs(ctx, ids, true)
89-
if err != nil {
90-
ctx.ServerError("FindIssuesByIDs", err)
91-
return
92-
}
93-
sort.Slice(newIssues, func(i, j int) bool {
94-
return newIssues[i].Index > newIssues[j].Index
95-
})
96-
issues = append(issues, newIssues...)
97-
}
98-
}
99-
100-
if err := issues.LoadPullRequests(ctx); err != nil {
101-
ctx.ServerError("LoadPullRequests", err)
29+
suggestions, err := issue_service.GetSuggestion(ctx, ctx.Repo.Repository, isPull, keyword)
30+
if err != nil {
31+
ctx.ServerError("GetSuggestion", err)
10232
return
10333
}
10434

105-
suggestions := make([]*structs.Issue, 0, len(issues))
106-
for _, issue := range issues {
107-
suggestion := &structs.Issue{
108-
ID: issue.ID,
109-
Index: issue.Index,
110-
Title: issue.Title,
111-
State: issue.State(),
112-
}
113-
114-
if issue.IsPull && issue.PullRequest != nil {
115-
suggestion.PullRequest = &structs.PullRequestMeta{
116-
HasMerged: issue.PullRequest.HasMerged,
117-
IsWorkInProgress: issue.PullRequest.IsWorkInProgress(ctx),
118-
}
119-
}
120-
121-
suggestions = append(suggestions, suggestion)
122-
}
123-
12435
ctx.JSON(http.StatusOK, suggestions)
12536
}

services/issue/suggestion.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package issue
5+
6+
import (
7+
"context"
8+
"strconv"
9+
10+
issues_model "code.gitea.io/gitea/models/issues"
11+
repo_model "code.gitea.io/gitea/models/repo"
12+
"code.gitea.io/gitea/modules/optional"
13+
"code.gitea.io/gitea/modules/structs"
14+
)
15+
16+
func GetSuggestion(ctx context.Context, repo *repo_model.Repository, isPull optional.Option[bool], keyword string) ([]*structs.Issue, error) {
17+
var issues issues_model.IssueList
18+
var err error
19+
pageSize := 5
20+
if keyword == "" {
21+
issues, err = issues_model.FindLatestIssues(ctx, repo.ID, isPull, pageSize)
22+
if err != nil {
23+
return nil, err
24+
}
25+
} else {
26+
indexKeyword, _ := strconv.ParseInt(keyword, 10, 64)
27+
if indexKeyword > 0 {
28+
issues, err = issues_model.FindIssuesWithIndexPrefix(ctx, repo.ID, indexKeyword, isPull, pageSize)
29+
if err != nil {
30+
return nil, err
31+
}
32+
pageSize -= len(issues)
33+
}
34+
35+
if pageSize > 0 {
36+
newIssues, err := issues_model.FindIssuesTitleKeywords(ctx, repo.ID, keyword, isPull, pageSize)
37+
if err != nil {
38+
return nil, err
39+
}
40+
issues = append(issues, newIssues...)
41+
}
42+
}
43+
44+
if err := issues.LoadPullRequests(ctx); err != nil {
45+
return nil, err
46+
}
47+
48+
suggestions := make([]*structs.Issue, 0, len(issues))
49+
for _, issue := range issues {
50+
suggestion := &structs.Issue{
51+
ID: issue.ID,
52+
Index: issue.Index,
53+
Title: issue.Title,
54+
State: issue.State(),
55+
}
56+
57+
if issue.IsPull && issue.PullRequest != nil {
58+
suggestion.PullRequest = &structs.PullRequestMeta{
59+
HasMerged: issue.PullRequest.HasMerged,
60+
IsWorkInProgress: issue.PullRequest.IsWorkInProgress(ctx),
61+
}
62+
}
63+
suggestions = append(suggestions, suggestion)
64+
}
65+
66+
return suggestions, nil
67+
}

0 commit comments

Comments
 (0)