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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user