fix(unified-storage): return folder title in legacy search (#99762)

This commit is contained in:
Jean-Philippe Quéméner
2025-01-29 16:38:25 +01:00
committed by GitHub
parent 9b37337f7b
commit 90c18099a5
2 changed files with 54 additions and 28 deletions
@@ -23,6 +23,7 @@ import (
claims "github.com/grafana/authlib/types"
"github.com/grafana/grafana-plugin-sdk-go/backend/gtime"
"github.com/grafana/grafana/pkg/apimachinery/identity"
"github.com/grafana/grafana/pkg/apimachinery/utils"
"github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1"
@@ -1248,16 +1249,31 @@ func (dr *DashboardServiceImpl) FindDashboards(ctx context.Context, query *dashb
}
finalResults := make([]dashboards.DashboardSearchProjection, len(response.Hits))
// Create a small runtime cache for folders to avoid extra calls to the folder service
foldersMap := make(map[string]*folder.Folder)
for i, hit := range response.Hits {
f, ok := foldersMap[hit.Folder]
if !ok {
f, err = dr.folderService.Get(ctx, &folder.GetFolderQuery{
UID: &hit.Folder,
OrgID: query.OrgId,
SignedInUser: query.SignedInUser,
})
if err != nil {
return nil, err
}
foldersMap[hit.Folder] = f
}
finalResults[i] = dashboards.DashboardSearchProjection{
ID: hit.Field.GetNestedInt64(search.DASHBOARD_LEGACY_ID),
UID: hit.Name,
OrgID: query.OrgId,
Title: hit.Title,
Slug: slugify.Slugify(hit.Title),
IsFolder: false,
FolderUID: hit.Folder,
Tags: hit.Tags,
ID: hit.Field.GetNestedInt64(search.DASHBOARD_LEGACY_ID),
UID: hit.Name,
OrgID: query.OrgId,
Title: hit.Title,
Slug: slugify.Slugify(hit.Title),
IsFolder: false,
FolderUID: hit.Folder,
FolderTitle: f.Title,
Tags: hit.Tags,
}
}
@@ -10,6 +10,9 @@ import (
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"github.com/grafana/grafana/pkg/apimachinery/identity"
"github.com/grafana/grafana/pkg/apimachinery/utils"
"github.com/grafana/grafana/pkg/components/simplejson"
@@ -28,8 +31,6 @@ import (
"github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/storage/unified/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)
func TestDashboardService(t *testing.T) {
@@ -71,10 +72,10 @@ func TestDashboardService(t *testing.T) {
t.Run("Should return validation error if message is too long", func(t *testing.T) {
dto.Dashboard = dashboards.NewDashboard("Dash")
dto.Message = `Here we go, 500+ characters for testing. I'm sorry that you're
having to read this. I spent too long trying to come up with something clever
having to read this. I spent too long trying to come up with something clever
to say or a funny joke. Unforuntately, nothing came to mind. So instead, I'm
will share this with you, as a form of payment for having to read this:
https://youtu.be/dQw4w9WgXcQ?si=KeoTIpn9tUtQnOBk! Enjoy :) Now lets see if
https://youtu.be/dQw4w9WgXcQ?si=KeoTIpn9tUtQnOBk! Enjoy :) Now lets see if
this test passes or if the result is more exciting than these 500 characters
I wrote. Best of luck to the both of us!`
_, err := service.SaveDashboard(context.Background(), dto, false)
@@ -1327,10 +1328,15 @@ func TestDeleteAllDashboards(t *testing.T) {
func TestSearchDashboards(t *testing.T) {
fakeStore := dashboards.FakeDashboardStore{}
fakeFolders := foldertest.NewFakeService()
fakeFolders.ExpectedFolder = &folder.Folder{
Title: "testing-folder-1",
}
defer fakeStore.AssertExpectations(t)
service := &DashboardServiceImpl{
cfg: setting.NewCfg(),
dashboardStore: &fakeStore,
folderService: fakeFolders,
}
expectedResult := model.HitList{
@@ -1345,15 +1351,17 @@ func TestSearchDashboards(t *testing.T) {
"tag1",
"tag2",
},
FolderTitle: "testing-folder-1",
},
{
UID: "uid2",
OrgID: 1,
Title: "Dashboard 2",
Type: "dash-db",
URI: "db/dashboard-2",
URL: "/d/uid2/dashboard-2",
Tags: []string{},
UID: "uid2",
OrgID: 1,
Title: "Dashboard 2",
Type: "dash-db",
URI: "db/dashboard-2",
URL: "/d/uid2/dashboard-2",
Tags: []string{},
FolderTitle: "testing-folder-1",
},
}
query := dashboards.FindPersistedDashboardsQuery{
@@ -1363,17 +1371,19 @@ func TestSearchDashboards(t *testing.T) {
service.features = featuremgmt.WithFeatures()
fakeStore.On("FindDashboards", mock.Anything, mock.Anything).Return([]dashboards.DashboardSearchProjection{
{
UID: "uid1",
Slug: "dashboard-1",
OrgID: 1,
Title: "Dashboard 1",
Tags: []string{"tag1", "tag2"},
UID: "uid1",
Slug: "dashboard-1",
OrgID: 1,
Title: "Dashboard 1",
Tags: []string{"tag1", "tag2"},
FolderTitle: "testing-folder-1",
},
{
UID: "uid2",
Slug: "dashboard-2",
OrgID: 1,
Title: "Dashboard 2",
UID: "uid2",
Slug: "dashboard-2",
OrgID: 1,
Title: "Dashboard 2",
FolderTitle: "testing-folder-1",
},
}, nil).Once()
result, err := service.SearchDashboards(context.Background(), &query)