Nested folders: Provide count of all descendant dashboards and folders (#67184)

* Add a method for getting descendant folders
* Include dashboard count for descendant folders
* Return subfolder count
* Replace references to children with descendants
* Update openapi specs
* Add test for descendant counts
* Add logging to GetDescendantCounts
This commit is contained in:
Arati R
2023-04-27 17:00:09 +02:00
committed by GitHub
parent 4d96afa979
commit a5206a1cda
9 changed files with 237 additions and 169 deletions
+39 -5
View File
@@ -20,6 +20,7 @@ import (
"github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
"github.com/grafana/grafana/pkg/services/store/entity"
"github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/util"
@@ -623,7 +624,8 @@ func (s *Service) nestedFolderDelete(ctx context.Context, cmd *folder.DeleteFold
return result, nil
}
func (s *Service) GetChildrenCounts(ctx context.Context, cmd *folder.GetChildrenCountsQuery) (folder.ChildrenCounts, error) {
func (s *Service) GetDescendantCounts(ctx context.Context, cmd *folder.GetDescendantCountsQuery) (folder.DescendantCounts, error) {
logger := s.log.FromContext(ctx)
if cmd.SignedInUser == nil {
return nil, folder.ErrBadRequest.Errorf("missing signed-in user")
}
@@ -634,15 +636,47 @@ func (s *Service) GetChildrenCounts(ctx context.Context, cmd *folder.GetChildren
return nil, folder.ErrBadRequest.Errorf("invalid orgID")
}
countsMap := make(folder.ChildrenCounts, len(s.registry))
result := []string{*cmd.UID}
countsMap := make(folder.DescendantCounts, len(s.registry)+1)
if s.features.IsEnabled(featuremgmt.FlagNestedFolders) {
subfolders, err := s.getNestedFolders(ctx, cmd.OrgID, *cmd.UID)
if err != nil {
logger.Error("failed to get subfolders", "error", err)
return nil, err
}
result = append(result, subfolders...)
countsMap[entity.StandardKindFolder] = int64(len(subfolders))
}
for _, v := range s.registry {
c, err := v.CountInFolder(ctx, cmd.OrgID, *cmd.UID, cmd.SignedInUser)
for _, folder := range result {
c, err := v.CountInFolder(ctx, cmd.OrgID, folder, cmd.SignedInUser)
if err != nil {
logger.Error("failed to count folder descendants", "error", err)
return nil, err
}
countsMap[v.Kind()] += c
}
}
return countsMap, nil
}
func (s *Service) getNestedFolders(ctx context.Context, orgID int64, uid string) ([]string, error) {
result := []string{}
folders, err := s.store.GetChildren(ctx, folder.GetChildrenQuery{UID: uid, OrgID: orgID})
if err != nil {
return nil, err
}
for _, f := range folders {
result = append(result, f.UID)
subfolders, err := s.getNestedFolders(ctx, f.OrgID, f.UID)
if err != nil {
return nil, err
}
countsMap[v.Kind()] += c
result = append(result, subfolders...)
}
return countsMap, nil
return result, nil
}
// MakeUserAdmin is copy of DashboardServiceImpl.MakeUserAdmin