From 1eae2aadae0583ab092d6ed857bb727829aa52b7 Mon Sep 17 00:00:00 2001
From: Nanguan Lin <70063547+lng2020@users.noreply.github.com>
Date: Wed, 25 Oct 2023 19:51:49 +0800
Subject: [PATCH] Fix issue not showing on default board and add test (#27720)

See https://github.com/go-gitea/gitea/pull/27718#issuecomment-1773743014
. Add a test to ensure its behavior.
Why this test uses `ProjectBoardID=0`? Because in `SearchOptions`,
`ProjectBoardID=0` means what it is. But in `IssueOptions`,
`ProjectBoardID=0` means there is no condition, and
`ProjectBoardID=db.NoConditionID` means the board ID = 0.
It's really confusing. Probably it's better to separate the db search
engine and the other issue search code. It's really two different
systems. As far as I can see, `IssueOptions` is not necessary for most
of the code, which has very simple issue search conditions.
---
 models/issues/issue_search.go          | 2 +-
 modules/indexer/issues/indexer_test.go | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/models/issues/issue_search.go b/models/issues/issue_search.go
index 9b6bf117b1..0bea1fed14 100644
--- a/models/issues/issue_search.go
+++ b/models/issues/issue_search.go
@@ -186,7 +186,7 @@ func applyProjectBoardCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.S
 	if opts.ProjectBoardID > 0 {
 		sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": opts.ProjectBoardID}))
 	} else if opts.ProjectBoardID == db.NoConditionID {
-		sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Neq{"project_board_id": 0}))
+		sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": 0}))
 	}
 	return sess
 }
diff --git a/modules/indexer/issues/indexer_test.go b/modules/indexer/issues/indexer_test.go
index 0ec23164c2..da4fc9b878 100644
--- a/modules/indexer/issues/indexer_test.go
+++ b/modules/indexer/issues/indexer_test.go
@@ -382,6 +382,12 @@ func searchIssueInProject(t *testing.T) {
 			},
 			[]int64{1},
 		},
+		{
+			SearchOptions{
+				ProjectBoardID: int64Pointer(0), // issue with in default board
+			},
+			[]int64{2},
+		},
 	}
 	for _, test := range tests {
 		issueIDs, _, err := SearchIssues(context.TODO(), &test.opts)