From 9aa4ea640bcc7f794368733358a7d1635a3fc463 Mon Sep 17 00:00:00 2001 From: Malcolm Smith Date: Sat, 27 Jun 2026 11:18:56 -0700 Subject: [PATCH] fix: resolve sql request and logic --- pkg/models/task_collection.go | 54 +++++++++++------------------- pkg/models/task_collection_test.go | 16 --------- 2 files changed, 20 insertions(+), 50 deletions(-) diff --git a/pkg/models/task_collection.go b/pkg/models/task_collection.go index 1571ee108..2670e44c8 100644 --- a/pkg/models/task_collection.go +++ b/pkg/models/task_collection.go @@ -211,50 +211,40 @@ func getRelevantProjectsFromCollection(s *xorm.Session, a web.Auth, tf *TaskColl return []*Project{{ID: tf.ProjectID}}, nil } - projectIDs, err := getProjectAndDescendantIDs(s, tf.ProjectID) + allProjects, _, _, err := getRawProjectsForUser(s, &projectOptions{ + user: &user.User{ID: a.GetID()}, + page: -1, + }) if err != nil { return nil, err } - u, err := user.GetUserByID(s, a.GetID()) - if err != nil { - return nil, err + relevantProjects := make([]*Project, 0) + childrenMap := make(map[int64][]int64) + projectMap := make(map[int64]*Project) + for _, p := range allProjects { + projectMap[p.ID] = p + childrenMap[p.ParentProjectID] = append(childrenMap[p.ParentProjectID], p.ID) } - projectPermissions, err := checkPermissionsForProjects(s, u, projectIDs) - if err != nil { - return nil, err - } + queue := []int64{tf.ProjectID} + for len(queue) > 0 { + currentID := queue[0] + queue = queue[1:] - relevantProjects := make([]*Project, 0, len(projectIDs)) - for _, projectID := range projectIDs { - permission, has := projectPermissions[projectID] - if !has || permission.MaxPermission < PermissionRead { - continue + if p, exists := projectMap[currentID]; exists { + relevantProjects = append(relevantProjects, p) } - relevantProjects = append(relevantProjects, &Project{ID: projectID}) + if children, exists := childrenMap[currentID]; exists { + queue = append(queue, children...) + } } return relevantProjects, nil } -func getProjectAndDescendantIDs(s *xorm.Session, rootProjectID int64) (projectIDs []int64, err error) { - err = s.SQL(` -WITH RECURSIVE descendant_projects (id) AS ( - SELECT id - FROM projects - WHERE id = ? - UNION ALL - SELECT p.id - FROM projects p - INNER JOIN descendant_projects dp ON p.parent_project_id = dp.id -) -SELECT DISTINCT id -FROM descendant_projects`, rootProjectID). - Find(&projectIDs) - return -} + func getFilterValueForBucketFilter(filter string, view *ProjectView) (newFilter string, err error) { if view.BucketConfigurationMode != BucketConfigurationModeFilter { @@ -405,10 +395,6 @@ func (tf *TaskCollection) ReadAll(s *xorm.Session, a web.Auth, search string, pa tf.ProjectID > 0 && !tf.isSavedFilter - if view != nil && view.ViewKind == ProjectViewKindKanban { - effectiveIncludeSubprojects = false - } - if _, is := a.(*LinkSharing); is { effectiveIncludeSubprojects = false } diff --git a/pkg/models/task_collection_test.go b/pkg/models/task_collection_test.go index f09cd90cd..d6f460f3c 100644 --- a/pkg/models/task_collection_test.go +++ b/pkg/models/task_collection_test.go @@ -1911,23 +1911,7 @@ func TestTaskCollection_ReadAll(t *testing.T) { } } -func TestGetProjectAndDescendantIDs(t *testing.T) { - db.LoadAndAssertFixtures(t) - s := db.NewSession() - defer s.Close() - t.Run("single project", func(t *testing.T) { - projectIDs, err := getProjectAndDescendantIDs(s, 1) - require.NoError(t, err) - assert.ElementsMatch(t, []int64{1}, projectIDs) - }) - - t.Run("recursive descendants", func(t *testing.T) { - projectIDs, err := getProjectAndDescendantIDs(s, 12) - require.NoError(t, err) - assert.ElementsMatch(t, []int64{12, 25, 26}, projectIDs) - }) -} func TestTaskCollection_SubtaskRemainsAfterMove(t *testing.T) { db.LoadAndAssertFixtures(t)