Commit 2737992a54

2737992a54d62b670655cdb6be437e2f6015749a

parent: 6dae104c0c

Verified · cmc

cmc <hello@cleberg.net> · 2026-09-28 06:41 UTC

dashboard: an assigned issue no longer repeats under open issues

Ref #265

Layout: unified · split

internal/store/dashboard.go +2
@@ -76,6 +76,8 @@ const dashboardIssuesQuery = `
7676 LEFT JOIN orgs o ON r.owner_kind = 'org' AND o.id = r.owner_id
7777 JOIN users au ON au.id = x.author_id
7878 WHERE x.state = 'open' AND ` + involvedCond + `
79 AND NOT EXISTS (SELECT 1 FROM issue_assignees ia
80 WHERE ia.issue_id = x.id AND ia.user_id = ?1)
7981 ORDER BY x.updated_at DESC LIMIT 50`
8082
8183func (s *Store) DashboardIssues(userID int64) ([]DashboardItem, error) {
internal/store/dashboard_test.go added +55
@@ -0,0 +1,55 @@
1package store
2
3import "testing"
4
5// An issue assigned to the user is not repeated under DashboardIssues:
6// AssignedIssues already covers it, and a repository the user can
7// otherwise reach (here, one they own) is the common case where the two
8// queries used to overlap (#265).
9func TestDashboardIssuesExcludesAssignedIssues(t *testing.T) {
10 s := open(t)
11 if err := s.MigrateUp(); err != nil {
12 t.Fatal(err)
13 }
14 uid, err := s.CreateUser("cmc", false)
15 if err != nil {
16 t.Fatal(err)
17 }
18 repoID, err := s.CreateRepo("user", uid, "gitbay", "public")
19 if err != nil {
20 t.Fatal(err)
21 }
22 repo, err := s.RepoByID(repoID)
23 if err != nil {
24 t.Fatal(err)
25 }
26 assignedNum, err := s.CreateIssue(repo.ID, uid, "assigned to me", "", "markdown")
27 if err != nil {
28 t.Fatal(err)
29 }
30 if _, err := s.CreateIssue(repo.ID, uid, "not assigned", "", "markdown"); err != nil {
31 t.Fatal(err)
32 }
33 assigned, err := s.IssueByNumber(repo.ID, assignedNum)
34 if err != nil {
35 t.Fatal(err)
36 }
37 if err := s.SetIssueAssignee(assigned.ID, uid, true); err != nil {
38 t.Fatal(err)
39 }
40
41 issues, err := s.DashboardIssues(uid)
42 if err != nil {
43 t.Fatal(err)
44 }
45 if len(issues) != 1 || issues[0].Title != "not assigned" {
46 t.Fatalf("DashboardIssues = %+v, want only the unassigned issue", issues)
47 }
48 assignedList, err := s.AssignedIssues(uid)
49 if err != nil {
50 t.Fatal(err)
51 }
52 if len(assignedList) != 1 || assignedList[0].Title != "assigned to me" {
53 t.Fatalf("AssignedIssues = %+v, want the assigned issue", assignedList)
54 }
55}