From 0e991461b0656061d3a4aa9b1ef7977bd44c9f6d Mon Sep 17 00:00:00 2001 From: Kristin Laemmert Date: Thu, 2 Jun 2022 10:00:47 -0400 Subject: [PATCH] backend/sqlstore: move GetDashboardTags to dashboard service (#50091) + removing some functions that were already copied to the dashboard service in a previous pr. --- pkg/api/dashboard.go | 2 +- pkg/services/dashboards/dashboard.go | 2 + .../dashboards/dashboard_service_mock.go | 14 +++ pkg/services/dashboards/database/database.go | 18 ++++ .../database/database_folder_test.go | 16 ++-- .../dashboards/database/database_test.go | 2 +- .../dashboards/service/dashboard_service.go | 4 + pkg/services/dashboards/store_mock.go | 14 +++ pkg/services/sqlstore/dashboard.go | 96 ------------------- pkg/services/sqlstore/datasource.go | 6 +- pkg/services/sqlstore/store.go | 1 - 11 files changed, 67 insertions(+), 108 deletions(-) delete mode 100644 pkg/services/sqlstore/dashboard.go diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 20bf49ee009..080c16e1e9b 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -791,7 +791,7 @@ func (hs *HTTPServer) RestoreDashboardVersion(c *models.ReqContext) response.Res func (hs *HTTPServer) GetDashboardTags(c *models.ReqContext) { query := models.GetDashboardTagsQuery{OrgId: c.OrgId} - err := hs.SQLStore.GetDashboardTags(c.Req.Context(), &query) + err := hs.dashboardService.GetDashboardTags(c.Req.Context(), &query) if err != nil { c.JsonApiErr(500, "Failed to get tags from database", err) return diff --git a/pkg/services/dashboards/dashboard.go b/pkg/services/dashboards/dashboard.go index 4af65426ec3..031e7c39d52 100644 --- a/pkg/services/dashboards/dashboard.go +++ b/pkg/services/dashboards/dashboard.go @@ -15,6 +15,7 @@ type DashboardService interface { GetDashboard(ctx context.Context, query *models.GetDashboardQuery) error GetDashboardAclInfoList(ctx context.Context, query *models.GetDashboardAclInfoListQuery) error GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error + GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error GetDashboardUIDById(ctx context.Context, query *models.GetDashboardRefByIdQuery) error GetPublicDashboardConfig(ctx context.Context, orgId int64, dashboardUid string) (*models.PublicDashboardConfig, error) HasAdminPermissionInFolders(ctx context.Context, query *models.HasAdminPermissionInFoldersQuery) error @@ -57,6 +58,7 @@ type Store interface { GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error // GetDashboardsByPluginID retrieves dashboards identified by plugin. GetDashboardsByPluginID(ctx context.Context, query *models.GetDashboardsByPluginIdQuery) error + GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error GetProvisionedDashboardData(name string) ([]*models.DashboardProvisioning, error) GetProvisionedDataByDashboardID(dashboardID int64) (*models.DashboardProvisioning, error) GetProvisionedDataByDashboardUID(orgID int64, dashboardUID string) (*models.DashboardProvisioning, error) diff --git a/pkg/services/dashboards/dashboard_service_mock.go b/pkg/services/dashboards/dashboard_service_mock.go index dee1a1756da..4e22249eb12 100644 --- a/pkg/services/dashboards/dashboard_service_mock.go +++ b/pkg/services/dashboards/dashboard_service_mock.go @@ -104,6 +104,20 @@ func (_m *FakeDashboardService) GetDashboardAclInfoList(ctx context.Context, que return r0 } +// GetDashboardTags provides a mock function with given fields: ctx, query +func (_m *FakeDashboardService) GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error { + ret := _m.Called(ctx, query) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *models.GetDashboardTagsQuery) error); ok { + r0 = rf(ctx, query) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // GetDashboardUIDById provides a mock function with given fields: ctx, query func (_m *FakeDashboardService) GetDashboardUIDById(ctx context.Context, query *models.GetDashboardRefByIdQuery) error { ret := _m.Called(ctx, query) diff --git a/pkg/services/dashboards/database/database.go b/pkg/services/dashboards/database/database.go index 533afb7d2a7..80a4d450f22 100644 --- a/pkg/services/dashboards/database/database.go +++ b/pkg/services/dashboards/database/database.go @@ -1009,3 +1009,21 @@ func (d *DashboardStore) FindDashboards(ctx context.Context, query *models.FindP return res, nil } + +func (d *DashboardStore) GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error { + return d.sqlStore.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error { + sql := `SELECT + COUNT(*) as count, + term + FROM dashboard + INNER JOIN dashboard_tag on dashboard_tag.dashboard_id = dashboard.id + WHERE dashboard.org_id=? + GROUP BY term + ORDER BY term` + + query.Result = make([]*models.DashboardTagCloudItem, 0) + sess := dbSession.SQL(sql, query.OrgId) + err := sess.Find(&query.Result) + return err + }) +} diff --git a/pkg/services/dashboards/database/database_folder_test.go b/pkg/services/dashboards/database/database_folder_test.go index 9fc099c1251..dbca6013052 100644 --- a/pkg/services/dashboards/database/database_folder_test.go +++ b/pkg/services/dashboards/database/database_folder_test.go @@ -311,7 +311,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { query := &models.HasEditPermissionInFoldersQuery{ SignedInUser: &models.SignedInUser{UserId: adminUser.Id, OrgId: 1, OrgRole: models.ROLE_ADMIN}, } - err := sqlStore.HasEditPermissionInFolders(context.Background(), query) + err := dashboardStore.HasEditPermissionInFolders(context.Background(), query) require.NoError(t, err) require.True(t, query.Result) }) @@ -320,7 +320,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { query := &models.HasAdminPermissionInFoldersQuery{ SignedInUser: &models.SignedInUser{UserId: adminUser.Id, OrgId: 1, OrgRole: models.ROLE_ADMIN}, } - err := sqlStore.HasAdminPermissionInFolders(context.Background(), query) + err := dashboardStore.HasAdminPermissionInFolders(context.Background(), query) require.NoError(t, err) require.True(t, query.Result) }) @@ -359,7 +359,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { query := &models.HasEditPermissionInFoldersQuery{ SignedInUser: &models.SignedInUser{UserId: editorUser.Id, OrgId: 1, OrgRole: models.ROLE_EDITOR}, } - err := sqlStore.HasEditPermissionInFolders(context.Background(), query) + err := dashboardStore.HasEditPermissionInFolders(context.Background(), query) go require.NoError(t, err) require.True(t, query.Result) }) @@ -368,7 +368,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { query := &models.HasAdminPermissionInFoldersQuery{ SignedInUser: &models.SignedInUser{UserId: adminUser.Id, OrgId: 1, OrgRole: models.ROLE_EDITOR}, } - err := sqlStore.HasAdminPermissionInFolders(context.Background(), query) + err := dashboardStore.HasAdminPermissionInFolders(context.Background(), query) require.NoError(t, err) require.False(t, query.Result) }) @@ -407,7 +407,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { query := &models.HasEditPermissionInFoldersQuery{ SignedInUser: &models.SignedInUser{UserId: viewerUser.Id, OrgId: 1, OrgRole: models.ROLE_VIEWER}, } - err := sqlStore.HasEditPermissionInFolders(context.Background(), query) + err := dashboardStore.HasEditPermissionInFolders(context.Background(), query) go require.NoError(t, err) require.False(t, query.Result) }) @@ -416,7 +416,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { query := &models.HasAdminPermissionInFoldersQuery{ SignedInUser: &models.SignedInUser{UserId: adminUser.Id, OrgId: 1, OrgRole: models.ROLE_VIEWER}, } - err := sqlStore.HasAdminPermissionInFolders(context.Background(), query) + err := dashboardStore.HasAdminPermissionInFolders(context.Background(), query) require.NoError(t, err) require.False(t, query.Result) }) @@ -431,7 +431,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { query := &models.HasEditPermissionInFoldersQuery{ SignedInUser: &models.SignedInUser{UserId: viewerUser.Id, OrgId: 1, OrgRole: models.ROLE_VIEWER}, } - err := sqlStore.HasEditPermissionInFolders(context.Background(), query) + err := dashboardStore.HasEditPermissionInFolders(context.Background(), query) go require.NoError(t, err) require.True(t, query.Result) }) @@ -447,7 +447,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { query := &models.HasEditPermissionInFoldersQuery{ SignedInUser: &models.SignedInUser{UserId: viewerUser.Id, OrgId: 1, OrgRole: models.ROLE_VIEWER}, } - err := sqlStore.HasEditPermissionInFolders(context.Background(), query) + err := dashboardStore.HasEditPermissionInFolders(context.Background(), query) go require.NoError(t, err) require.True(t, query.Result) }) diff --git a/pkg/services/dashboards/database/database_test.go b/pkg/services/dashboards/database/database_test.go index 5a73c2b3710..0ed077ebe0a 100644 --- a/pkg/services/dashboards/database/database_test.go +++ b/pkg/services/dashboards/database/database_test.go @@ -292,7 +292,7 @@ func TestIntegrationDashboardDataAccess(t *testing.T) { setup() query := models.GetDashboardTagsQuery{OrgId: 1} - err := sqlStore.GetDashboardTags(context.Background(), &query) + err := dashboardStore.GetDashboardTags(context.Background(), &query) require.NoError(t, err) require.Equal(t, len(query.Result), 2) diff --git a/pkg/services/dashboards/service/dashboard_service.go b/pkg/services/dashboards/service/dashboard_service.go index b5c2900d6ac..5f117c65ad2 100644 --- a/pkg/services/dashboards/service/dashboard_service.go +++ b/pkg/services/dashboards/service/dashboard_service.go @@ -598,3 +598,7 @@ func (dr *DashboardServiceImpl) HasAdminPermissionInFolders(ctx context.Context, func (dr *DashboardServiceImpl) HasEditPermissionInFolders(ctx context.Context, query *models.HasEditPermissionInFoldersQuery) error { return dr.dashboardStore.HasEditPermissionInFolders(ctx, query) } + +func (dr *DashboardServiceImpl) GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error { + return dr.dashboardStore.GetDashboardTags(ctx, query) +} diff --git a/pkg/services/dashboards/store_mock.go b/pkg/services/dashboards/store_mock.go index 7853271dd74..20b34459917 100644 --- a/pkg/services/dashboards/store_mock.go +++ b/pkg/services/dashboards/store_mock.go @@ -95,6 +95,20 @@ func (_m *FakeDashboardStore) GetDashboardAclInfoList(ctx context.Context, query return r0 } +// GetDashboardTags provides a mock function with given fields: ctx, query +func (_m *FakeDashboardStore) GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error { + ret := _m.Called(ctx, query) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *models.GetDashboardTagsQuery) error); ok { + r0 = rf(ctx, query) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // GetDashboardUIDById provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) GetDashboardUIDById(ctx context.Context, query *models.GetDashboardRefByIdQuery) error { ret := _m.Called(ctx, query) diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go deleted file mode 100644 index 54f99c5a0c8..00000000000 --- a/pkg/services/sqlstore/dashboard.go +++ /dev/null @@ -1,96 +0,0 @@ -package sqlstore - -import ( - "context" - - "github.com/prometheus/client_golang/prometheus" - - "github.com/grafana/grafana/pkg/models" - "github.com/grafana/grafana/pkg/util" -) - -var shadowSearchCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: "db_dashboard", - Name: "search_shadow", - }, - []string{"equal", "error"}, -) - -func init() { - prometheus.MustRegister(shadowSearchCounter) -} - -var generateNewUid func() string = util.GenerateShortUID - -func (ss *SQLStore) GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error { - return ss.WithDbSession(ctx, func(dbSession *DBSession) error { - sql := `SELECT - COUNT(*) as count, - term - FROM dashboard - INNER JOIN dashboard_tag on dashboard_tag.dashboard_id = dashboard.id - WHERE dashboard.org_id=? - GROUP BY term - ORDER BY term` - - query.Result = make([]*models.DashboardTagCloudItem, 0) - sess := dbSession.SQL(sql, query.OrgId) - err := sess.Find(&query.Result) - return err - }) -} - -// HasEditPermissionInFolders validates that an user have access to a certain folder -func (ss *SQLStore) HasEditPermissionInFolders(ctx context.Context, query *models.HasEditPermissionInFoldersQuery) error { - return ss.WithDbSession(ctx, func(dbSession *DBSession) error { - if query.SignedInUser.HasRole(models.ROLE_EDITOR) { - query.Result = true - return nil - } - - builder := &SQLBuilder{} - builder.Write("SELECT COUNT(dashboard.id) AS count FROM dashboard WHERE dashboard.org_id = ? AND dashboard.is_folder = ?", - query.SignedInUser.OrgId, dialect.BooleanStr(true)) - builder.WriteDashboardPermissionFilter(query.SignedInUser, models.PERMISSION_EDIT) - - type folderCount struct { - Count int64 - } - - resp := make([]*folderCount, 0) - if err := dbSession.SQL(builder.GetSQLString(), builder.params...).Find(&resp); err != nil { - return err - } - - query.Result = len(resp) > 0 && resp[0].Count > 0 - - return nil - }) -} - -func (ss *SQLStore) HasAdminPermissionInFolders(ctx context.Context, query *models.HasAdminPermissionInFoldersQuery) error { - return ss.WithDbSession(ctx, func(dbSession *DBSession) error { - if query.SignedInUser.HasRole(models.ROLE_ADMIN) { - query.Result = true - return nil - } - - builder := &SQLBuilder{} - builder.Write("SELECT COUNT(dashboard.id) AS count FROM dashboard WHERE dashboard.org_id = ? AND dashboard.is_folder = ?", query.SignedInUser.OrgId, dialect.BooleanStr(true)) - builder.WriteDashboardPermissionFilter(query.SignedInUser, models.PERMISSION_ADMIN) - - type folderCount struct { - Count int64 - } - - resp := make([]*folderCount, 0) - if err := dbSession.SQL(builder.GetSQLString(), builder.params...).Find(&resp); err != nil { - return err - } - - query.Result = len(resp) > 0 && resp[0].Count > 0 - - return nil - }) -} diff --git a/pkg/services/sqlstore/datasource.go b/pkg/services/sqlstore/datasource.go index 6ec9c94a193..28f93f366b3 100644 --- a/pkg/services/sqlstore/datasource.go +++ b/pkg/services/sqlstore/datasource.go @@ -7,13 +7,15 @@ import ( "strings" "time" + "xorm.io/xorm" + "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/events" "github.com/grafana/grafana/pkg/infra/metrics" "github.com/grafana/grafana/pkg/models" ac "github.com/grafana/grafana/pkg/services/accesscontrol" + "github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util/errutil" - "xorm.io/xorm" ) // GetDataSource adds a datasource to the query model by querying by org_id as well as @@ -287,3 +289,5 @@ func generateNewDatasourceUid(sess *DBSession, orgId int64) (string, error) { return "", models.ErrDataSourceFailedGenerateUniqueUid } + +var generateNewUid func() string = util.GenerateShortUID diff --git a/pkg/services/sqlstore/store.go b/pkg/services/sqlstore/store.go index b6cd2bc5a5d..044450976d5 100644 --- a/pkg/services/sqlstore/store.go +++ b/pkg/services/sqlstore/store.go @@ -91,7 +91,6 @@ type Store interface { GetOrgUsers(ctx context.Context, query *models.GetOrgUsersQuery) error SearchOrgUsers(ctx context.Context, query *models.SearchOrgUsersQuery) error RemoveOrgUser(ctx context.Context, cmd *models.RemoveOrgUserCommand) error - GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error GetDataSource(ctx context.Context, query *models.GetDataSourceQuery) error GetDataSources(ctx context.Context, query *models.GetDataSourcesQuery) error GetDataSourcesByType(ctx context.Context, query *models.GetDataSourcesByTypeQuery) error