diff --git a/pkg/api/dashboard_permission_test.go b/pkg/api/dashboard_permission_test.go index 32784bb4130..db4cb6b8d8b 100644 --- a/pkg/api/dashboard_permission_test.go +++ b/pkg/api/dashboard_permission_test.go @@ -42,15 +42,17 @@ func TestDashboardPermissionAPIEndpoint(t *testing.T) { dashboardPermissions := accesscontrolmock.NewMockedPermissionsService() folderSvc := folderimpl.ProvideService(ac, bus.ProvideBus(tracing.InitializeTracerForTest()), settings, dashboardStore, foldertest.NewFakeFolderStore(t), mockSQLStore, featuremgmt.WithFeatures()) + dashboardService, err := dashboardservice.ProvideDashboardServiceImpl( + settings, dashboardStore, foldertest.NewFakeFolderStore(t), nil, features, folderPermissions, dashboardPermissions, ac, + folderSvc, + ) + require.NoError(t, err) hs := &HTTPServer{ - Cfg: settings, - SQLStore: mockSQLStore, - Features: features, - DashboardService: dashboardservice.ProvideDashboardServiceImpl( - settings, dashboardStore, foldertest.NewFakeFolderStore(t), nil, features, folderPermissions, dashboardPermissions, ac, - folderSvc, - ), - AccessControl: accesscontrolmock.New().WithDisabled(), + Cfg: settings, + SQLStore: mockSQLStore, + Features: features, + DashboardService: dashboardService, + AccessControl: accesscontrolmock.New().WithDisabled(), } t.Run("Given user has no admin permissions", func(t *testing.T) { diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index bd84bb0c8d7..ca4cbba1b87 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -1096,26 +1096,30 @@ func getDashboardShouldReturn200WithConfig(t *testing.T, sc *scenarioContext, pr cfg, dashboardStore, folderStore, db.InitTestDB(t), featuremgmt.WithFeatures()) if dashboardService == nil { - dashboardService = service.ProvideDashboardServiceImpl( + dashboardService, err = service.ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, nil, features, folderPermissions, dashboardPermissions, ac, folderSvc, ) + require.NoError(t, err) } + dashboardProvisioningService, err := service.ProvideDashboardServiceImpl( + cfg, dashboardStore, folderStore, nil, features, folderPermissions, dashboardPermissions, + ac, folderSvc, + ) + require.NoError(t, err) + hs := &HTTPServer{ - Cfg: cfg, - LibraryPanelService: &libraryPanelsService, - LibraryElementService: &libraryElementsService, - SQLStore: sc.sqlStore, - ProvisioningService: provisioningService, - AccessControl: accesscontrolmock.New(), - dashboardProvisioningService: service.ProvideDashboardServiceImpl( - cfg, dashboardStore, folderStore, nil, features, folderPermissions, dashboardPermissions, - ac, folderSvc, - ), - DashboardService: dashboardService, - Features: featuremgmt.WithFeatures(), - Kinds: corekind.NewBase(nil), + Cfg: cfg, + LibraryPanelService: &libraryPanelsService, + LibraryElementService: &libraryElementsService, + SQLStore: sc.sqlStore, + ProvisioningService: provisioningService, + AccessControl: accesscontrolmock.New(), + dashboardProvisioningService: dashboardProvisioningService, + DashboardService: dashboardService, + Features: featuremgmt.WithFeatures(), + Kinds: corekind.NewBase(nil), } hs.callGetDashboard(sc) diff --git a/pkg/api/folder_permission_test.go b/pkg/api/folder_permission_test.go index aa9f64988c5..220fb259368 100644 --- a/pkg/api/folder_permission_test.go +++ b/pkg/api/folder_permission_test.go @@ -37,6 +37,11 @@ func TestFolderPermissionAPIEndpoint(t *testing.T) { ac := accesscontrolmock.New() folderPermissions := accesscontrolmock.NewMockedPermissionsService() dashboardPermissions := accesscontrolmock.NewMockedPermissionsService() + dashboardService, err := service.ProvideDashboardServiceImpl( + settings, dashboardStore, foldertest.NewFakeFolderStore(t), nil, features, folderPermissions, dashboardPermissions, ac, + folderService, + ) + require.NoError(t, err) hs := &HTTPServer{ Cfg: settings, @@ -44,11 +49,8 @@ func TestFolderPermissionAPIEndpoint(t *testing.T) { folderService: folderService, folderPermissionsService: folderPermissions, dashboardPermissionsService: dashboardPermissions, - DashboardService: service.ProvideDashboardServiceImpl( - settings, dashboardStore, foldertest.NewFakeFolderStore(t), nil, features, folderPermissions, dashboardPermissions, ac, - folderService, - ), - AccessControl: accesscontrolmock.New().WithDisabled(), + DashboardService: dashboardService, + AccessControl: accesscontrolmock.New().WithDisabled(), } t.Run("Given folder not exists", func(t *testing.T) { diff --git a/pkg/services/dashboards/dashboard.go b/pkg/services/dashboards/dashboard.go index e90f7a04759..5cab7bb3170 100644 --- a/pkg/services/dashboards/dashboard.go +++ b/pkg/services/dashboards/dashboard.go @@ -84,4 +84,5 @@ type Store interface { // CountDashboardsInFolder returns the number of dashboards associated with // the given parent folder ID. CountDashboardsInFolder(ctx context.Context, request *CountDashboardsInFolderRequest) (int64, error) + DeleteDashboardsInFolder(ctx context.Context, request *DeleteDashboardsInFolderRequest) error } diff --git a/pkg/services/dashboards/database/database.go b/pkg/services/dashboards/database/database.go index 979de85fe25..4b3b9cb10f0 100644 --- a/pkg/services/dashboards/database/database.go +++ b/pkg/services/dashboards/database/database.go @@ -713,75 +713,19 @@ func (d *dashboardStore) deleteDashboard(cmd *dashboards.DeleteDashboardCommand, if dashboard.IsFolder { deletes = append(deletes, "DELETE FROM dashboard WHERE folder_id = ?") - var dashIds []struct { - Id int64 - Uid string - } - err := sess.SQL("SELECT id, uid FROM dashboard WHERE folder_id = ?", dashboard.ID).Find(&dashIds) - if err != nil { + if err := d.deleteChildrenDashboardAssociations(sess, dashboard); err != nil { return err } - for _, id := range dashIds { - if err := d.deleteAlertDefinition(id.Id, sess); err != nil { - return err - } - } - // remove all access control permission with folder scope _, err = sess.Exec("DELETE FROM permission WHERE scope = ?", dashboards.ScopeFoldersProvider.GetResourceScopeUID(dashboard.UID)) if err != nil { return err } - for _, dash := range dashIds { - // remove all access control permission with child dashboard scopes - _, err = sess.Exec("DELETE FROM permission WHERE scope = ?", ac.GetResourceScopeUID("dashboards", dash.Uid)) - if err != nil { - return err - } - } - - if len(dashIds) > 0 { - childrenDeletes := []string{ - "DELETE FROM dashboard_tag WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", - "DELETE FROM star WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", - "DELETE FROM dashboard_version WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", - "DELETE FROM annotation WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", - "DELETE FROM dashboard_provisioning WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", - "DELETE FROM dashboard_acl WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", - } - for _, sql := range childrenDeletes { - _, err := sess.Exec(sql, dashboard.OrgID, dashboard.ID) - if err != nil { - return err - } - } - } - - var existingRuleID int64 - exists, err := sess.Table("alert_rule").Where("namespace_uid = (SELECT uid FROM dashboard WHERE id = ?)", dashboard.ID).Cols("id").Get(&existingRuleID) - if err != nil { + if err := deleteFolderAlertRules(sess, dashboard, cmd.ForceDeleteFolderRules); err != nil { return err } - if exists { - if !cmd.ForceDeleteFolderRules { - return fmt.Errorf("folder cannot be deleted: %w", dashboards.ErrFolderContainsAlertRules) - } - - // Delete all rules under this folder. - deleteNGAlertsByFolder := []string{ - "DELETE FROM alert_rule WHERE namespace_uid = (SELECT uid FROM dashboard WHERE id = ?)", - "DELETE FROM alert_rule_version WHERE rule_namespace_uid = (SELECT uid FROM dashboard WHERE id = ?)", - } - - for _, sql := range deleteNGAlertsByFolder { - _, err := sess.Exec(sql, dashboard.ID) - if err != nil { - return err - } - } - } } else { _, err = sess.Exec("DELETE FROM permission WHERE scope = ?", ac.GetResourceScopeUID("dashboards", dashboard.UID)) if err != nil { @@ -809,6 +753,74 @@ func (d *dashboardStore) deleteDashboard(cmd *dashboards.DeleteDashboardCommand, return nil } +func (d *dashboardStore) deleteChildrenDashboardAssociations(sess *db.Session, dashboard dashboards.Dashboard) error { + var dashIds []struct { + Id int64 + Uid string + } + err := sess.SQL("SELECT id, uid FROM dashboard WHERE folder_id = ?", dashboard.ID).Find(&dashIds) + if err != nil { + return err + } + + if len(dashIds) > 0 { + for _, dash := range dashIds { + if err := d.deleteAlertDefinition(dash.Id, sess); err != nil { + return err + } + + // remove all access control permission with child dashboard scopes + _, err = sess.Exec("DELETE FROM permission WHERE scope = ?", ac.GetResourceScopeUID("dashboards", dash.Uid)) + if err != nil { + return err + } + } + + childrenDeletes := []string{ + "DELETE FROM dashboard_tag WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", + "DELETE FROM star WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", + "DELETE FROM dashboard_version WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", + "DELETE FROM annotation WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", + "DELETE FROM dashboard_provisioning WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", + "DELETE FROM dashboard_acl WHERE dashboard_id IN (SELECT id FROM dashboard WHERE org_id = ? AND folder_id = ?)", + } + for _, sql := range childrenDeletes { + _, err := sess.Exec(sql, dashboard.OrgID, dashboard.ID) + if err != nil { + return err + } + } + } + return nil +} + +func deleteFolderAlertRules(sess *db.Session, dashboard dashboards.Dashboard, forceDeleteFolderAlertRules bool) error { + var existingRuleID int64 + exists, err := sess.Table("alert_rule").Where("namespace_uid = (SELECT uid FROM dashboard WHERE id = ?)", dashboard.ID).Cols("id").Get(&existingRuleID) + if err != nil { + return err + } + if exists { + if !forceDeleteFolderAlertRules { + return fmt.Errorf("folder cannot be deleted: %w", dashboards.ErrFolderContainsAlertRules) + } + + // Delete all rules under this folder. + deleteNGAlertsByFolder := []string{ + "DELETE FROM alert_rule WHERE namespace_uid = (SELECT uid FROM dashboard WHERE id = ?)", + "DELETE FROM alert_rule_version WHERE rule_namespace_uid = (SELECT uid FROM dashboard WHERE id = ?)", + } + + for _, sql := range deleteNGAlertsByFolder { + _, err := sess.Exec(sql, dashboard.ID) + if err != nil { + return err + } + } + } + return nil +} + func createEntityEvent(dashboard *dashboards.Dashboard, eventType store.EntityEventType) *store.EntityEvent { var entityEvent *store.EntityEvent if dashboard.IsFolder { @@ -1045,6 +1057,27 @@ func (d *dashboardStore) CountDashboardsInFolder( return count, err } +func (d *dashboardStore) DeleteDashboardsInFolder( + ctx context.Context, req *dashboards.DeleteDashboardsInFolderRequest) error { + return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + dashboard := dashboards.Dashboard{OrgID: req.OrgID} + has, err := sess.Where("uid = ? AND org_id = ?", req.FolderUID, req.OrgID).Get(&dashboard) + if err != nil { + return err + } + if !has { + return dashboards.ErrFolderNotFound + } + + if err := d.deleteChildrenDashboardAssociations(sess, dashboard); err != nil { + return err + } + + _, err = sess.Where("folder_id = ? AND org_id = ? AND is_folder = ?", dashboard.ID, dashboard.OrgID, false).Delete(&dashboards.Dashboard{}) + return err + }) +} + func readQuotaConfig(cfg *setting.Cfg) (*quota.Map, error) { limits := "a.Map{} diff --git a/pkg/services/dashboards/database/database_test.go b/pkg/services/dashboards/database/database_test.go index 3bdf7c38869..5ada585b6ee 100644 --- a/pkg/services/dashboards/database/database_test.go +++ b/pkg/services/dashboards/database/database_test.go @@ -491,6 +491,25 @@ func TestIntegrationDashboardDataAccess(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(2), count) }) + + t.Run("Can delete dashboards in folder", func(t *testing.T) { + setup() + folder := insertTestDashboard(t, dashboardStore, "dash folder", 1, 0, true, "prod", "webapp") + _ = insertTestDashboard(t, dashboardStore, "delete me 1", 1, folder.ID, false, "delete this 1") + _ = insertTestDashboard(t, dashboardStore, "delete me 2", 1, folder.ID, false, "delete this 2") + + err := dashboardStore.DeleteDashboardsInFolder( + context.Background(), + &dashboards.DeleteDashboardsInFolderRequest{ + FolderUID: folder.UID, + OrgID: 1, + }) + require.NoError(t, err) + + count, err := dashboardStore.CountDashboardsInFolder(context.Background(), &dashboards.CountDashboardsInFolderRequest{FolderID: 2, OrgID: 1}) + require.NoError(t, err) + require.Equal(t, count, int64(0)) + }) } func TestIntegrationDashboardDataAccessGivenPluginWithImportedDashboards(t *testing.T) { diff --git a/pkg/services/dashboards/models.go b/pkg/services/dashboards/models.go index 98384bd0ddf..8e4b65ef672 100644 --- a/pkg/services/dashboards/models.go +++ b/pkg/services/dashboards/models.go @@ -340,6 +340,11 @@ func FromDashboard(dash *Dashboard) *folder.Folder { } } +type DeleteDashboardsInFolderRequest struct { + FolderUID string + OrgID int64 +} + // // DASHBOARD ACL // diff --git a/pkg/services/dashboards/service/dashboard_service.go b/pkg/services/dashboards/service/dashboard_service.go index d6dd003dde1..4c2650452e6 100644 --- a/pkg/services/dashboards/service/dashboard_service.go +++ b/pkg/services/dashboards/service/dashboard_service.go @@ -18,6 +18,7 @@ import ( "github.com/grafana/grafana/pkg/services/guardian" "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/search/model" + "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" @@ -55,7 +56,7 @@ func ProvideDashboardServiceImpl( features featuremgmt.FeatureToggles, folderPermissionsService accesscontrol.FolderPermissionsService, dashboardPermissionsService accesscontrol.DashboardPermissionsService, ac accesscontrol.AccessControl, folderSvc folder.Service, -) *DashboardServiceImpl { +) (*DashboardServiceImpl, error) { dashSvc := &DashboardServiceImpl{ cfg: cfg, log: log.New("dashboard-service"), @@ -72,7 +73,11 @@ func ProvideDashboardServiceImpl( ac.RegisterScopeAttributeResolver(dashboards.NewDashboardIDScopeResolver(folderStore, dashSvc, folderSvc)) ac.RegisterScopeAttributeResolver(dashboards.NewDashboardUIDScopeResolver(folderStore, dashSvc, folderSvc)) - return dashSvc + if err := folderSvc.RegisterService(dashSvc); err != nil { + return nil, err + } + + return dashSvc, nil } func (dr *DashboardServiceImpl) GetProvisionedDashboardData(ctx context.Context, name string) ([]*dashboards.DashboardProvisioning, error) { @@ -641,3 +646,9 @@ func (dr DashboardServiceImpl) CountDashboardsInFolder(ctx context.Context, quer return dr.dashboardStore.CountDashboardsInFolder(ctx, &dashboards.CountDashboardsInFolderRequest{FolderID: folder.ID, OrgID: u.OrgID}) } + +func (dr *DashboardServiceImpl) DeleteInFolder(ctx context.Context, orgID int64, UID string) error { + return dr.dashboardStore.DeleteDashboardsInFolder(ctx, &dashboards.DeleteDashboardsInFolderRequest{FolderUID: UID, OrgID: orgID}) +} + +func (dr *DashboardServiceImpl) Kind() string { return entity.StandardKindDashboard } diff --git a/pkg/services/dashboards/service/dashboard_service_integration_test.go b/pkg/services/dashboards/service/dashboard_service_integration_test.go index 682278dbeb6..19230e3be24 100644 --- a/pkg/services/dashboards/service/dashboard_service_integration_test.go +++ b/pkg/services/dashboards/service/dashboard_service_integration_test.go @@ -828,7 +828,7 @@ func permissionScenario(t *testing.T, desc string, canSave bool, fn permissionSc dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore, cfg), quotaService) require.NoError(t, err) folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - service := ProvideDashboardServiceImpl( + service, err := ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, &dummyDashAlertExtractor{}, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), @@ -836,6 +836,7 @@ func permissionScenario(t *testing.T, desc string, canSave bool, fn permissionSc accesscontrolmock.New(), foldertest.NewFakeService(), ) + require.NoError(t, err) guardian.InitLegacyGuardian(cfg, sqlStore, service, &teamtest.FakeService{}) savedFolder := saveTestFolder(t, "Saved folder", testOrgID, sqlStore) @@ -889,7 +890,7 @@ func callSaveWithResult(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSt dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore, cfg), quotaService) require.NoError(t, err) folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - service := ProvideDashboardServiceImpl( + service, err := ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, &dummyDashAlertExtractor{}, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), @@ -897,6 +898,7 @@ func callSaveWithResult(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSt accesscontrolmock.New(), foldertest.NewFakeService(), ) + require.NoError(t, err) res, err := service.SaveDashboard(context.Background(), &dto, false) require.NoError(t, err) @@ -912,7 +914,7 @@ func callSaveWithError(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSto dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore, cfg), quotaService) require.NoError(t, err) folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - service := ProvideDashboardServiceImpl( + service, err := ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, &dummyDashAlertExtractor{}, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), @@ -920,6 +922,7 @@ func callSaveWithError(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSto accesscontrolmock.New(), foldertest.NewFakeService(), ) + require.NoError(t, err) _, err = service.SaveDashboard(context.Background(), &dto, false) return err } @@ -953,7 +956,7 @@ func saveTestDashboard(t *testing.T, title string, orgID, folderID int64, sqlSto dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore, cfg), quotaService) require.NoError(t, err) folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - service := ProvideDashboardServiceImpl( + service, err := ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, &dummyDashAlertExtractor{}, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), @@ -961,6 +964,7 @@ func saveTestDashboard(t *testing.T, title string, orgID, folderID int64, sqlSto accesscontrolmock.New(), foldertest.NewFakeService(), ) + require.NoError(t, err) res, err := service.SaveDashboard(context.Background(), &dto, false) require.NoError(t, err) @@ -995,7 +999,7 @@ func saveTestFolder(t *testing.T, title string, orgID int64, sqlStore db.DB) *da dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore, cfg), quotaService) require.NoError(t, err) folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - service := ProvideDashboardServiceImpl( + service, err := ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, &dummyDashAlertExtractor{}, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), @@ -1003,6 +1007,7 @@ func saveTestFolder(t *testing.T, title string, orgID int64, sqlStore db.DB) *da accesscontrolmock.New(), foldertest.NewFakeService(), ) + require.NoError(t, err) res, err := service.SaveDashboard(context.Background(), &dto, false) require.NoError(t, err) diff --git a/pkg/services/dashboards/service/dashboard_service_test.go b/pkg/services/dashboards/service/dashboard_service_test.go index a55a16083cd..50774fd5727 100644 --- a/pkg/services/dashboards/service/dashboard_service_test.go +++ b/pkg/services/dashboards/service/dashboard_service_test.go @@ -240,6 +240,13 @@ func TestDashboardService(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(3), count) }) + + t.Run("Delete dashboards in folder", func(t *testing.T) { + args := &dashboards.DeleteDashboardsInFolderRequest{OrgID: 1, FolderUID: "uid"} + fakeStore.On("DeleteDashboardsInFolder", mock.Anything, args).Return(nil).Once() + err := service.DeleteInFolder(context.Background(), 1, "uid") + require.NoError(t, err) + }) }) t.Run("Delete user by acl", func(t *testing.T) { diff --git a/pkg/services/dashboards/store_mock.go b/pkg/services/dashboards/store_mock.go index f32268a86ce..9ddc9858829 100644 --- a/pkg/services/dashboards/store_mock.go +++ b/pkg/services/dashboards/store_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.16.0. DO NOT EDIT. +// Code generated by mockery v2.23.2. DO NOT EDIT. package dashboards @@ -18,11 +18,23 @@ type FakeDashboardStore struct { mock.Mock } +type FakeDashboardStore_Expecter struct { + mock *mock.Mock +} + +func (_m *FakeDashboardStore) EXPECT() *FakeDashboardStore_Expecter { + return &FakeDashboardStore_Expecter{mock: &_m.Mock} +} + // Count provides a mock function with given fields: _a0, _a1 func (_m *FakeDashboardStore) Count(_a0 context.Context, _a1 *quota.ScopeParameters) (*quota.Map, error) { ret := _m.Called(_a0, _a1) var r0 *quota.Map + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *quota.ScopeParameters) (*quota.Map, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *quota.ScopeParameters) *quota.Map); ok { r0 = rf(_a0, _a1) } else { @@ -31,7 +43,6 @@ func (_m *FakeDashboardStore) Count(_a0 context.Context, _a1 *quota.ScopeParamet } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *quota.ScopeParameters) error); ok { r1 = rf(_a0, _a1) } else { @@ -41,18 +52,50 @@ func (_m *FakeDashboardStore) Count(_a0 context.Context, _a1 *quota.ScopeParamet return r0, r1 } +// FakeDashboardStore_Count_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Count' +type FakeDashboardStore_Count_Call struct { + *mock.Call +} + +// Count is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *quota.ScopeParameters +func (_e *FakeDashboardStore_Expecter) Count(_a0 interface{}, _a1 interface{}) *FakeDashboardStore_Count_Call { + return &FakeDashboardStore_Count_Call{Call: _e.mock.On("Count", _a0, _a1)} +} + +func (_c *FakeDashboardStore_Count_Call) Run(run func(_a0 context.Context, _a1 *quota.ScopeParameters)) *FakeDashboardStore_Count_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*quota.ScopeParameters)) + }) + return _c +} + +func (_c *FakeDashboardStore_Count_Call) Return(_a0 *quota.Map, _a1 error) *FakeDashboardStore_Count_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_Count_Call) RunAndReturn(run func(context.Context, *quota.ScopeParameters) (*quota.Map, error)) *FakeDashboardStore_Count_Call { + _c.Call.Return(run) + return _c +} + // CountDashboardsInFolder provides a mock function with given fields: ctx, request func (_m *FakeDashboardStore) CountDashboardsInFolder(ctx context.Context, request *CountDashboardsInFolderRequest) (int64, error) { ret := _m.Called(ctx, request) var r0 int64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *CountDashboardsInFolderRequest) (int64, error)); ok { + return rf(ctx, request) + } if rf, ok := ret.Get(0).(func(context.Context, *CountDashboardsInFolderRequest) int64); ok { r0 = rf(ctx, request) } else { r0 = ret.Get(0).(int64) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *CountDashboardsInFolderRequest) error); ok { r1 = rf(ctx, request) } else { @@ -62,6 +105,35 @@ func (_m *FakeDashboardStore) CountDashboardsInFolder(ctx context.Context, reque return r0, r1 } +// FakeDashboardStore_CountDashboardsInFolder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CountDashboardsInFolder' +type FakeDashboardStore_CountDashboardsInFolder_Call struct { + *mock.Call +} + +// CountDashboardsInFolder is a helper method to define mock.On call +// - ctx context.Context +// - request *CountDashboardsInFolderRequest +func (_e *FakeDashboardStore_Expecter) CountDashboardsInFolder(ctx interface{}, request interface{}) *FakeDashboardStore_CountDashboardsInFolder_Call { + return &FakeDashboardStore_CountDashboardsInFolder_Call{Call: _e.mock.On("CountDashboardsInFolder", ctx, request)} +} + +func (_c *FakeDashboardStore_CountDashboardsInFolder_Call) Run(run func(ctx context.Context, request *CountDashboardsInFolderRequest)) *FakeDashboardStore_CountDashboardsInFolder_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*CountDashboardsInFolderRequest)) + }) + return _c +} + +func (_c *FakeDashboardStore_CountDashboardsInFolder_Call) Return(_a0 int64, _a1 error) *FakeDashboardStore_CountDashboardsInFolder_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_CountDashboardsInFolder_Call) RunAndReturn(run func(context.Context, *CountDashboardsInFolderRequest) (int64, error)) *FakeDashboardStore_CountDashboardsInFolder_Call { + _c.Call.Return(run) + return _c +} + // DeleteACLByUser provides a mock function with given fields: _a0, _a1 func (_m *FakeDashboardStore) DeleteACLByUser(_a0 context.Context, _a1 int64) error { ret := _m.Called(_a0, _a1) @@ -76,6 +148,35 @@ func (_m *FakeDashboardStore) DeleteACLByUser(_a0 context.Context, _a1 int64) er return r0 } +// FakeDashboardStore_DeleteACLByUser_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteACLByUser' +type FakeDashboardStore_DeleteACLByUser_Call struct { + *mock.Call +} + +// DeleteACLByUser is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 int64 +func (_e *FakeDashboardStore_Expecter) DeleteACLByUser(_a0 interface{}, _a1 interface{}) *FakeDashboardStore_DeleteACLByUser_Call { + return &FakeDashboardStore_DeleteACLByUser_Call{Call: _e.mock.On("DeleteACLByUser", _a0, _a1)} +} + +func (_c *FakeDashboardStore_DeleteACLByUser_Call) Run(run func(_a0 context.Context, _a1 int64)) *FakeDashboardStore_DeleteACLByUser_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64)) + }) + return _c +} + +func (_c *FakeDashboardStore_DeleteACLByUser_Call) Return(_a0 error) *FakeDashboardStore_DeleteACLByUser_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *FakeDashboardStore_DeleteACLByUser_Call) RunAndReturn(run func(context.Context, int64) error) *FakeDashboardStore_DeleteACLByUser_Call { + _c.Call.Return(run) + return _c +} + // DeleteDashboard provides a mock function with given fields: ctx, cmd func (_m *FakeDashboardStore) DeleteDashboard(ctx context.Context, cmd *DeleteDashboardCommand) error { ret := _m.Called(ctx, cmd) @@ -90,6 +191,78 @@ func (_m *FakeDashboardStore) DeleteDashboard(ctx context.Context, cmd *DeleteDa return r0 } +// FakeDashboardStore_DeleteDashboard_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteDashboard' +type FakeDashboardStore_DeleteDashboard_Call struct { + *mock.Call +} + +// DeleteDashboard is a helper method to define mock.On call +// - ctx context.Context +// - cmd *DeleteDashboardCommand +func (_e *FakeDashboardStore_Expecter) DeleteDashboard(ctx interface{}, cmd interface{}) *FakeDashboardStore_DeleteDashboard_Call { + return &FakeDashboardStore_DeleteDashboard_Call{Call: _e.mock.On("DeleteDashboard", ctx, cmd)} +} + +func (_c *FakeDashboardStore_DeleteDashboard_Call) Run(run func(ctx context.Context, cmd *DeleteDashboardCommand)) *FakeDashboardStore_DeleteDashboard_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*DeleteDashboardCommand)) + }) + return _c +} + +func (_c *FakeDashboardStore_DeleteDashboard_Call) Return(_a0 error) *FakeDashboardStore_DeleteDashboard_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *FakeDashboardStore_DeleteDashboard_Call) RunAndReturn(run func(context.Context, *DeleteDashboardCommand) error) *FakeDashboardStore_DeleteDashboard_Call { + _c.Call.Return(run) + return _c +} + +// DeleteDashboardsInFolder provides a mock function with given fields: ctx, request +func (_m *FakeDashboardStore) DeleteDashboardsInFolder(ctx context.Context, request *DeleteDashboardsInFolderRequest) error { + ret := _m.Called(ctx, request) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *DeleteDashboardsInFolderRequest) error); ok { + r0 = rf(ctx, request) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// FakeDashboardStore_DeleteDashboardsInFolder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteDashboardsInFolder' +type FakeDashboardStore_DeleteDashboardsInFolder_Call struct { + *mock.Call +} + +// DeleteDashboardsInFolder is a helper method to define mock.On call +// - ctx context.Context +// - request *DeleteDashboardsInFolderRequest +func (_e *FakeDashboardStore_Expecter) DeleteDashboardsInFolder(ctx interface{}, request interface{}) *FakeDashboardStore_DeleteDashboardsInFolder_Call { + return &FakeDashboardStore_DeleteDashboardsInFolder_Call{Call: _e.mock.On("DeleteDashboardsInFolder", ctx, request)} +} + +func (_c *FakeDashboardStore_DeleteDashboardsInFolder_Call) Run(run func(ctx context.Context, request *DeleteDashboardsInFolderRequest)) *FakeDashboardStore_DeleteDashboardsInFolder_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*DeleteDashboardsInFolderRequest)) + }) + return _c +} + +func (_c *FakeDashboardStore_DeleteDashboardsInFolder_Call) Return(_a0 error) *FakeDashboardStore_DeleteDashboardsInFolder_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *FakeDashboardStore_DeleteDashboardsInFolder_Call) RunAndReturn(run func(context.Context, *DeleteDashboardsInFolderRequest) error) *FakeDashboardStore_DeleteDashboardsInFolder_Call { + _c.Call.Return(run) + return _c +} + // DeleteOrphanedProvisionedDashboards provides a mock function with given fields: ctx, cmd func (_m *FakeDashboardStore) DeleteOrphanedProvisionedDashboards(ctx context.Context, cmd *DeleteOrphanedProvisionedDashboardsCommand) error { ret := _m.Called(ctx, cmd) @@ -104,11 +277,44 @@ func (_m *FakeDashboardStore) DeleteOrphanedProvisionedDashboards(ctx context.Co return r0 } +// FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteOrphanedProvisionedDashboards' +type FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call struct { + *mock.Call +} + +// DeleteOrphanedProvisionedDashboards is a helper method to define mock.On call +// - ctx context.Context +// - cmd *DeleteOrphanedProvisionedDashboardsCommand +func (_e *FakeDashboardStore_Expecter) DeleteOrphanedProvisionedDashboards(ctx interface{}, cmd interface{}) *FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call { + return &FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call{Call: _e.mock.On("DeleteOrphanedProvisionedDashboards", ctx, cmd)} +} + +func (_c *FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call) Run(run func(ctx context.Context, cmd *DeleteOrphanedProvisionedDashboardsCommand)) *FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*DeleteOrphanedProvisionedDashboardsCommand)) + }) + return _c +} + +func (_c *FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call) Return(_a0 error) *FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call) RunAndReturn(run func(context.Context, *DeleteOrphanedProvisionedDashboardsCommand) error) *FakeDashboardStore_DeleteOrphanedProvisionedDashboards_Call { + _c.Call.Return(run) + return _c +} + // FindDashboards provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) FindDashboards(ctx context.Context, query *FindPersistedDashboardsQuery) ([]DashboardSearchProjection, error) { ret := _m.Called(ctx, query) var r0 []DashboardSearchProjection + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *FindPersistedDashboardsQuery) ([]DashboardSearchProjection, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *FindPersistedDashboardsQuery) []DashboardSearchProjection); ok { r0 = rf(ctx, query) } else { @@ -117,7 +323,6 @@ func (_m *FakeDashboardStore) FindDashboards(ctx context.Context, query *FindPer } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *FindPersistedDashboardsQuery) error); ok { r1 = rf(ctx, query) } else { @@ -127,11 +332,44 @@ func (_m *FakeDashboardStore) FindDashboards(ctx context.Context, query *FindPer return r0, r1 } +// FakeDashboardStore_FindDashboards_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FindDashboards' +type FakeDashboardStore_FindDashboards_Call struct { + *mock.Call +} + +// FindDashboards is a helper method to define mock.On call +// - ctx context.Context +// - query *FindPersistedDashboardsQuery +func (_e *FakeDashboardStore_Expecter) FindDashboards(ctx interface{}, query interface{}) *FakeDashboardStore_FindDashboards_Call { + return &FakeDashboardStore_FindDashboards_Call{Call: _e.mock.On("FindDashboards", ctx, query)} +} + +func (_c *FakeDashboardStore_FindDashboards_Call) Run(run func(ctx context.Context, query *FindPersistedDashboardsQuery)) *FakeDashboardStore_FindDashboards_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*FindPersistedDashboardsQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_FindDashboards_Call) Return(_a0 []DashboardSearchProjection, _a1 error) *FakeDashboardStore_FindDashboards_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_FindDashboards_Call) RunAndReturn(run func(context.Context, *FindPersistedDashboardsQuery) ([]DashboardSearchProjection, error)) *FakeDashboardStore_FindDashboards_Call { + _c.Call.Return(run) + return _c +} + // GetDashboard provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) GetDashboard(ctx context.Context, query *GetDashboardQuery) (*Dashboard, error) { ret := _m.Called(ctx, query) var r0 *Dashboard + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardQuery) (*Dashboard, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardQuery) *Dashboard); ok { r0 = rf(ctx, query) } else { @@ -140,7 +378,6 @@ func (_m *FakeDashboardStore) GetDashboard(ctx context.Context, query *GetDashbo } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *GetDashboardQuery) error); ok { r1 = rf(ctx, query) } else { @@ -150,11 +387,44 @@ func (_m *FakeDashboardStore) GetDashboard(ctx context.Context, query *GetDashbo return r0, r1 } +// FakeDashboardStore_GetDashboard_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDashboard' +type FakeDashboardStore_GetDashboard_Call struct { + *mock.Call +} + +// GetDashboard is a helper method to define mock.On call +// - ctx context.Context +// - query *GetDashboardQuery +func (_e *FakeDashboardStore_Expecter) GetDashboard(ctx interface{}, query interface{}) *FakeDashboardStore_GetDashboard_Call { + return &FakeDashboardStore_GetDashboard_Call{Call: _e.mock.On("GetDashboard", ctx, query)} +} + +func (_c *FakeDashboardStore_GetDashboard_Call) Run(run func(ctx context.Context, query *GetDashboardQuery)) *FakeDashboardStore_GetDashboard_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*GetDashboardQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetDashboard_Call) Return(_a0 *Dashboard, _a1 error) *FakeDashboardStore_GetDashboard_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetDashboard_Call) RunAndReturn(run func(context.Context, *GetDashboardQuery) (*Dashboard, error)) *FakeDashboardStore_GetDashboard_Call { + _c.Call.Return(run) + return _c +} + // GetDashboardACLInfoList provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) GetDashboardACLInfoList(ctx context.Context, query *GetDashboardACLInfoListQuery) ([]*DashboardACLInfoDTO, error) { ret := _m.Called(ctx, query) var r0 []*DashboardACLInfoDTO + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardACLInfoListQuery) ([]*DashboardACLInfoDTO, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardACLInfoListQuery) []*DashboardACLInfoDTO); ok { r0 = rf(ctx, query) } else { @@ -163,7 +433,6 @@ func (_m *FakeDashboardStore) GetDashboardACLInfoList(ctx context.Context, query } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *GetDashboardACLInfoListQuery) error); ok { r1 = rf(ctx, query) } else { @@ -173,11 +442,44 @@ func (_m *FakeDashboardStore) GetDashboardACLInfoList(ctx context.Context, query return r0, r1 } +// FakeDashboardStore_GetDashboardACLInfoList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDashboardACLInfoList' +type FakeDashboardStore_GetDashboardACLInfoList_Call struct { + *mock.Call +} + +// GetDashboardACLInfoList is a helper method to define mock.On call +// - ctx context.Context +// - query *GetDashboardACLInfoListQuery +func (_e *FakeDashboardStore_Expecter) GetDashboardACLInfoList(ctx interface{}, query interface{}) *FakeDashboardStore_GetDashboardACLInfoList_Call { + return &FakeDashboardStore_GetDashboardACLInfoList_Call{Call: _e.mock.On("GetDashboardACLInfoList", ctx, query)} +} + +func (_c *FakeDashboardStore_GetDashboardACLInfoList_Call) Run(run func(ctx context.Context, query *GetDashboardACLInfoListQuery)) *FakeDashboardStore_GetDashboardACLInfoList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*GetDashboardACLInfoListQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetDashboardACLInfoList_Call) Return(_a0 []*DashboardACLInfoDTO, _a1 error) *FakeDashboardStore_GetDashboardACLInfoList_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetDashboardACLInfoList_Call) RunAndReturn(run func(context.Context, *GetDashboardACLInfoListQuery) ([]*DashboardACLInfoDTO, error)) *FakeDashboardStore_GetDashboardACLInfoList_Call { + _c.Call.Return(run) + return _c +} + // GetDashboardTags provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) GetDashboardTags(ctx context.Context, query *GetDashboardTagsQuery) ([]*DashboardTagCloudItem, error) { ret := _m.Called(ctx, query) var r0 []*DashboardTagCloudItem + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardTagsQuery) ([]*DashboardTagCloudItem, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardTagsQuery) []*DashboardTagCloudItem); ok { r0 = rf(ctx, query) } else { @@ -186,7 +488,6 @@ func (_m *FakeDashboardStore) GetDashboardTags(ctx context.Context, query *GetDa } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *GetDashboardTagsQuery) error); ok { r1 = rf(ctx, query) } else { @@ -196,11 +497,44 @@ func (_m *FakeDashboardStore) GetDashboardTags(ctx context.Context, query *GetDa return r0, r1 } +// FakeDashboardStore_GetDashboardTags_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDashboardTags' +type FakeDashboardStore_GetDashboardTags_Call struct { + *mock.Call +} + +// GetDashboardTags is a helper method to define mock.On call +// - ctx context.Context +// - query *GetDashboardTagsQuery +func (_e *FakeDashboardStore_Expecter) GetDashboardTags(ctx interface{}, query interface{}) *FakeDashboardStore_GetDashboardTags_Call { + return &FakeDashboardStore_GetDashboardTags_Call{Call: _e.mock.On("GetDashboardTags", ctx, query)} +} + +func (_c *FakeDashboardStore_GetDashboardTags_Call) Run(run func(ctx context.Context, query *GetDashboardTagsQuery)) *FakeDashboardStore_GetDashboardTags_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*GetDashboardTagsQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetDashboardTags_Call) Return(_a0 []*DashboardTagCloudItem, _a1 error) *FakeDashboardStore_GetDashboardTags_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetDashboardTags_Call) RunAndReturn(run func(context.Context, *GetDashboardTagsQuery) ([]*DashboardTagCloudItem, error)) *FakeDashboardStore_GetDashboardTags_Call { + _c.Call.Return(run) + return _c +} + // GetDashboardUIDByID provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) GetDashboardUIDByID(ctx context.Context, query *GetDashboardRefByIDQuery) (*DashboardRef, error) { ret := _m.Called(ctx, query) var r0 *DashboardRef + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardRefByIDQuery) (*DashboardRef, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardRefByIDQuery) *DashboardRef); ok { r0 = rf(ctx, query) } else { @@ -209,7 +543,6 @@ func (_m *FakeDashboardStore) GetDashboardUIDByID(ctx context.Context, query *Ge } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *GetDashboardRefByIDQuery) error); ok { r1 = rf(ctx, query) } else { @@ -219,11 +552,44 @@ func (_m *FakeDashboardStore) GetDashboardUIDByID(ctx context.Context, query *Ge return r0, r1 } +// FakeDashboardStore_GetDashboardUIDByID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDashboardUIDByID' +type FakeDashboardStore_GetDashboardUIDByID_Call struct { + *mock.Call +} + +// GetDashboardUIDByID is a helper method to define mock.On call +// - ctx context.Context +// - query *GetDashboardRefByIDQuery +func (_e *FakeDashboardStore_Expecter) GetDashboardUIDByID(ctx interface{}, query interface{}) *FakeDashboardStore_GetDashboardUIDByID_Call { + return &FakeDashboardStore_GetDashboardUIDByID_Call{Call: _e.mock.On("GetDashboardUIDByID", ctx, query)} +} + +func (_c *FakeDashboardStore_GetDashboardUIDByID_Call) Run(run func(ctx context.Context, query *GetDashboardRefByIDQuery)) *FakeDashboardStore_GetDashboardUIDByID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*GetDashboardRefByIDQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetDashboardUIDByID_Call) Return(_a0 *DashboardRef, _a1 error) *FakeDashboardStore_GetDashboardUIDByID_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetDashboardUIDByID_Call) RunAndReturn(run func(context.Context, *GetDashboardRefByIDQuery) (*DashboardRef, error)) *FakeDashboardStore_GetDashboardUIDByID_Call { + _c.Call.Return(run) + return _c +} + // GetDashboards provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) GetDashboards(ctx context.Context, query *GetDashboardsQuery) ([]*Dashboard, error) { ret := _m.Called(ctx, query) var r0 []*Dashboard + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardsQuery) ([]*Dashboard, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardsQuery) []*Dashboard); ok { r0 = rf(ctx, query) } else { @@ -232,7 +598,6 @@ func (_m *FakeDashboardStore) GetDashboards(ctx context.Context, query *GetDashb } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *GetDashboardsQuery) error); ok { r1 = rf(ctx, query) } else { @@ -242,11 +607,44 @@ func (_m *FakeDashboardStore) GetDashboards(ctx context.Context, query *GetDashb return r0, r1 } +// FakeDashboardStore_GetDashboards_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDashboards' +type FakeDashboardStore_GetDashboards_Call struct { + *mock.Call +} + +// GetDashboards is a helper method to define mock.On call +// - ctx context.Context +// - query *GetDashboardsQuery +func (_e *FakeDashboardStore_Expecter) GetDashboards(ctx interface{}, query interface{}) *FakeDashboardStore_GetDashboards_Call { + return &FakeDashboardStore_GetDashboards_Call{Call: _e.mock.On("GetDashboards", ctx, query)} +} + +func (_c *FakeDashboardStore_GetDashboards_Call) Run(run func(ctx context.Context, query *GetDashboardsQuery)) *FakeDashboardStore_GetDashboards_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*GetDashboardsQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetDashboards_Call) Return(_a0 []*Dashboard, _a1 error) *FakeDashboardStore_GetDashboards_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetDashboards_Call) RunAndReturn(run func(context.Context, *GetDashboardsQuery) ([]*Dashboard, error)) *FakeDashboardStore_GetDashboards_Call { + _c.Call.Return(run) + return _c +} + // GetDashboardsByPluginID provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) GetDashboardsByPluginID(ctx context.Context, query *GetDashboardsByPluginIDQuery) ([]*Dashboard, error) { ret := _m.Called(ctx, query) var r0 []*Dashboard + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardsByPluginIDQuery) ([]*Dashboard, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardsByPluginIDQuery) []*Dashboard); ok { r0 = rf(ctx, query) } else { @@ -255,7 +653,6 @@ func (_m *FakeDashboardStore) GetDashboardsByPluginID(ctx context.Context, query } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *GetDashboardsByPluginIDQuery) error); ok { r1 = rf(ctx, query) } else { @@ -265,11 +662,44 @@ func (_m *FakeDashboardStore) GetDashboardsByPluginID(ctx context.Context, query return r0, r1 } +// FakeDashboardStore_GetDashboardsByPluginID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDashboardsByPluginID' +type FakeDashboardStore_GetDashboardsByPluginID_Call struct { + *mock.Call +} + +// GetDashboardsByPluginID is a helper method to define mock.On call +// - ctx context.Context +// - query *GetDashboardsByPluginIDQuery +func (_e *FakeDashboardStore_Expecter) GetDashboardsByPluginID(ctx interface{}, query interface{}) *FakeDashboardStore_GetDashboardsByPluginID_Call { + return &FakeDashboardStore_GetDashboardsByPluginID_Call{Call: _e.mock.On("GetDashboardsByPluginID", ctx, query)} +} + +func (_c *FakeDashboardStore_GetDashboardsByPluginID_Call) Run(run func(ctx context.Context, query *GetDashboardsByPluginIDQuery)) *FakeDashboardStore_GetDashboardsByPluginID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*GetDashboardsByPluginIDQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetDashboardsByPluginID_Call) Return(_a0 []*Dashboard, _a1 error) *FakeDashboardStore_GetDashboardsByPluginID_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetDashboardsByPluginID_Call) RunAndReturn(run func(context.Context, *GetDashboardsByPluginIDQuery) ([]*Dashboard, error)) *FakeDashboardStore_GetDashboardsByPluginID_Call { + _c.Call.Return(run) + return _c +} + // GetProvisionedDashboardData provides a mock function with given fields: ctx, name func (_m *FakeDashboardStore) GetProvisionedDashboardData(ctx context.Context, name string) ([]*DashboardProvisioning, error) { ret := _m.Called(ctx, name) var r0 []*DashboardProvisioning + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) ([]*DashboardProvisioning, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) []*DashboardProvisioning); ok { r0 = rf(ctx, name) } else { @@ -278,7 +708,6 @@ func (_m *FakeDashboardStore) GetProvisionedDashboardData(ctx context.Context, n } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, name) } else { @@ -288,11 +717,44 @@ func (_m *FakeDashboardStore) GetProvisionedDashboardData(ctx context.Context, n return r0, r1 } +// FakeDashboardStore_GetProvisionedDashboardData_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProvisionedDashboardData' +type FakeDashboardStore_GetProvisionedDashboardData_Call struct { + *mock.Call +} + +// GetProvisionedDashboardData is a helper method to define mock.On call +// - ctx context.Context +// - name string +func (_e *FakeDashboardStore_Expecter) GetProvisionedDashboardData(ctx interface{}, name interface{}) *FakeDashboardStore_GetProvisionedDashboardData_Call { + return &FakeDashboardStore_GetProvisionedDashboardData_Call{Call: _e.mock.On("GetProvisionedDashboardData", ctx, name)} +} + +func (_c *FakeDashboardStore_GetProvisionedDashboardData_Call) Run(run func(ctx context.Context, name string)) *FakeDashboardStore_GetProvisionedDashboardData_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetProvisionedDashboardData_Call) Return(_a0 []*DashboardProvisioning, _a1 error) *FakeDashboardStore_GetProvisionedDashboardData_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetProvisionedDashboardData_Call) RunAndReturn(run func(context.Context, string) ([]*DashboardProvisioning, error)) *FakeDashboardStore_GetProvisionedDashboardData_Call { + _c.Call.Return(run) + return _c +} + // GetProvisionedDataByDashboardID provides a mock function with given fields: ctx, dashboardID func (_m *FakeDashboardStore) GetProvisionedDataByDashboardID(ctx context.Context, dashboardID int64) (*DashboardProvisioning, error) { ret := _m.Called(ctx, dashboardID) var r0 *DashboardProvisioning + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, int64) (*DashboardProvisioning, error)); ok { + return rf(ctx, dashboardID) + } if rf, ok := ret.Get(0).(func(context.Context, int64) *DashboardProvisioning); ok { r0 = rf(ctx, dashboardID) } else { @@ -301,7 +763,6 @@ func (_m *FakeDashboardStore) GetProvisionedDataByDashboardID(ctx context.Contex } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok { r1 = rf(ctx, dashboardID) } else { @@ -311,11 +772,44 @@ func (_m *FakeDashboardStore) GetProvisionedDataByDashboardID(ctx context.Contex return r0, r1 } +// FakeDashboardStore_GetProvisionedDataByDashboardID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProvisionedDataByDashboardID' +type FakeDashboardStore_GetProvisionedDataByDashboardID_Call struct { + *mock.Call +} + +// GetProvisionedDataByDashboardID is a helper method to define mock.On call +// - ctx context.Context +// - dashboardID int64 +func (_e *FakeDashboardStore_Expecter) GetProvisionedDataByDashboardID(ctx interface{}, dashboardID interface{}) *FakeDashboardStore_GetProvisionedDataByDashboardID_Call { + return &FakeDashboardStore_GetProvisionedDataByDashboardID_Call{Call: _e.mock.On("GetProvisionedDataByDashboardID", ctx, dashboardID)} +} + +func (_c *FakeDashboardStore_GetProvisionedDataByDashboardID_Call) Run(run func(ctx context.Context, dashboardID int64)) *FakeDashboardStore_GetProvisionedDataByDashboardID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetProvisionedDataByDashboardID_Call) Return(_a0 *DashboardProvisioning, _a1 error) *FakeDashboardStore_GetProvisionedDataByDashboardID_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetProvisionedDataByDashboardID_Call) RunAndReturn(run func(context.Context, int64) (*DashboardProvisioning, error)) *FakeDashboardStore_GetProvisionedDataByDashboardID_Call { + _c.Call.Return(run) + return _c +} + // GetProvisionedDataByDashboardUID provides a mock function with given fields: ctx, orgID, dashboardUID func (_m *FakeDashboardStore) GetProvisionedDataByDashboardUID(ctx context.Context, orgID int64, dashboardUID string) (*DashboardProvisioning, error) { ret := _m.Called(ctx, orgID, dashboardUID) var r0 *DashboardProvisioning + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, int64, string) (*DashboardProvisioning, error)); ok { + return rf(ctx, orgID, dashboardUID) + } if rf, ok := ret.Get(0).(func(context.Context, int64, string) *DashboardProvisioning); ok { r0 = rf(ctx, orgID, dashboardUID) } else { @@ -324,7 +818,6 @@ func (_m *FakeDashboardStore) GetProvisionedDataByDashboardUID(ctx context.Conte } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, int64, string) error); ok { r1 = rf(ctx, orgID, dashboardUID) } else { @@ -334,18 +827,51 @@ func (_m *FakeDashboardStore) GetProvisionedDataByDashboardUID(ctx context.Conte return r0, r1 } +// FakeDashboardStore_GetProvisionedDataByDashboardUID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProvisionedDataByDashboardUID' +type FakeDashboardStore_GetProvisionedDataByDashboardUID_Call struct { + *mock.Call +} + +// GetProvisionedDataByDashboardUID is a helper method to define mock.On call +// - ctx context.Context +// - orgID int64 +// - dashboardUID string +func (_e *FakeDashboardStore_Expecter) GetProvisionedDataByDashboardUID(ctx interface{}, orgID interface{}, dashboardUID interface{}) *FakeDashboardStore_GetProvisionedDataByDashboardUID_Call { + return &FakeDashboardStore_GetProvisionedDataByDashboardUID_Call{Call: _e.mock.On("GetProvisionedDataByDashboardUID", ctx, orgID, dashboardUID)} +} + +func (_c *FakeDashboardStore_GetProvisionedDataByDashboardUID_Call) Run(run func(ctx context.Context, orgID int64, dashboardUID string)) *FakeDashboardStore_GetProvisionedDataByDashboardUID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64), args[2].(string)) + }) + return _c +} + +func (_c *FakeDashboardStore_GetProvisionedDataByDashboardUID_Call) Return(_a0 *DashboardProvisioning, _a1 error) *FakeDashboardStore_GetProvisionedDataByDashboardUID_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_GetProvisionedDataByDashboardUID_Call) RunAndReturn(run func(context.Context, int64, string) (*DashboardProvisioning, error)) *FakeDashboardStore_GetProvisionedDataByDashboardUID_Call { + _c.Call.Return(run) + return _c +} + // HasAdminPermissionInDashboardsOrFolders provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) HasAdminPermissionInDashboardsOrFolders(ctx context.Context, query *folder.HasAdminPermissionInDashboardsOrFoldersQuery) (bool, error) { ret := _m.Called(ctx, query) var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *folder.HasAdminPermissionInDashboardsOrFoldersQuery) (bool, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *folder.HasAdminPermissionInDashboardsOrFoldersQuery) bool); ok { r0 = rf(ctx, query) } else { r0 = ret.Get(0).(bool) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *folder.HasAdminPermissionInDashboardsOrFoldersQuery) error); ok { r1 = rf(ctx, query) } else { @@ -355,18 +881,50 @@ func (_m *FakeDashboardStore) HasAdminPermissionInDashboardsOrFolders(ctx contex return r0, r1 } +// FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasAdminPermissionInDashboardsOrFolders' +type FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call struct { + *mock.Call +} + +// HasAdminPermissionInDashboardsOrFolders is a helper method to define mock.On call +// - ctx context.Context +// - query *folder.HasAdminPermissionInDashboardsOrFoldersQuery +func (_e *FakeDashboardStore_Expecter) HasAdminPermissionInDashboardsOrFolders(ctx interface{}, query interface{}) *FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call { + return &FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call{Call: _e.mock.On("HasAdminPermissionInDashboardsOrFolders", ctx, query)} +} + +func (_c *FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call) Run(run func(ctx context.Context, query *folder.HasAdminPermissionInDashboardsOrFoldersQuery)) *FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*folder.HasAdminPermissionInDashboardsOrFoldersQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call) Return(_a0 bool, _a1 error) *FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call) RunAndReturn(run func(context.Context, *folder.HasAdminPermissionInDashboardsOrFoldersQuery) (bool, error)) *FakeDashboardStore_HasAdminPermissionInDashboardsOrFolders_Call { + _c.Call.Return(run) + return _c +} + // HasEditPermissionInFolders provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) HasEditPermissionInFolders(ctx context.Context, query *folder.HasEditPermissionInFoldersQuery) (bool, error) { ret := _m.Called(ctx, query) var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *folder.HasEditPermissionInFoldersQuery) (bool, error)); ok { + return rf(ctx, query) + } if rf, ok := ret.Get(0).(func(context.Context, *folder.HasEditPermissionInFoldersQuery) bool); ok { r0 = rf(ctx, query) } else { r0 = ret.Get(0).(bool) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *folder.HasEditPermissionInFoldersQuery) error); ok { r1 = rf(ctx, query) } else { @@ -376,6 +934,35 @@ func (_m *FakeDashboardStore) HasEditPermissionInFolders(ctx context.Context, qu return r0, r1 } +// FakeDashboardStore_HasEditPermissionInFolders_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasEditPermissionInFolders' +type FakeDashboardStore_HasEditPermissionInFolders_Call struct { + *mock.Call +} + +// HasEditPermissionInFolders is a helper method to define mock.On call +// - ctx context.Context +// - query *folder.HasEditPermissionInFoldersQuery +func (_e *FakeDashboardStore_Expecter) HasEditPermissionInFolders(ctx interface{}, query interface{}) *FakeDashboardStore_HasEditPermissionInFolders_Call { + return &FakeDashboardStore_HasEditPermissionInFolders_Call{Call: _e.mock.On("HasEditPermissionInFolders", ctx, query)} +} + +func (_c *FakeDashboardStore_HasEditPermissionInFolders_Call) Run(run func(ctx context.Context, query *folder.HasEditPermissionInFoldersQuery)) *FakeDashboardStore_HasEditPermissionInFolders_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*folder.HasEditPermissionInFoldersQuery)) + }) + return _c +} + +func (_c *FakeDashboardStore_HasEditPermissionInFolders_Call) Return(_a0 bool, _a1 error) *FakeDashboardStore_HasEditPermissionInFolders_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_HasEditPermissionInFolders_Call) RunAndReturn(run func(context.Context, *folder.HasEditPermissionInFoldersQuery) (bool, error)) *FakeDashboardStore_HasEditPermissionInFolders_Call { + _c.Call.Return(run) + return _c +} + // SaveAlerts provides a mock function with given fields: ctx, dashID, alerts func (_m *FakeDashboardStore) SaveAlerts(ctx context.Context, dashID int64, alerts []*models.Alert) error { ret := _m.Called(ctx, dashID, alerts) @@ -390,11 +977,45 @@ func (_m *FakeDashboardStore) SaveAlerts(ctx context.Context, dashID int64, aler return r0 } +// FakeDashboardStore_SaveAlerts_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SaveAlerts' +type FakeDashboardStore_SaveAlerts_Call struct { + *mock.Call +} + +// SaveAlerts is a helper method to define mock.On call +// - ctx context.Context +// - dashID int64 +// - alerts []*models.Alert +func (_e *FakeDashboardStore_Expecter) SaveAlerts(ctx interface{}, dashID interface{}, alerts interface{}) *FakeDashboardStore_SaveAlerts_Call { + return &FakeDashboardStore_SaveAlerts_Call{Call: _e.mock.On("SaveAlerts", ctx, dashID, alerts)} +} + +func (_c *FakeDashboardStore_SaveAlerts_Call) Run(run func(ctx context.Context, dashID int64, alerts []*models.Alert)) *FakeDashboardStore_SaveAlerts_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64), args[2].([]*models.Alert)) + }) + return _c +} + +func (_c *FakeDashboardStore_SaveAlerts_Call) Return(_a0 error) *FakeDashboardStore_SaveAlerts_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *FakeDashboardStore_SaveAlerts_Call) RunAndReturn(run func(context.Context, int64, []*models.Alert) error) *FakeDashboardStore_SaveAlerts_Call { + _c.Call.Return(run) + return _c +} + // SaveDashboard provides a mock function with given fields: ctx, cmd func (_m *FakeDashboardStore) SaveDashboard(ctx context.Context, cmd SaveDashboardCommand) (*Dashboard, error) { ret := _m.Called(ctx, cmd) var r0 *Dashboard + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, SaveDashboardCommand) (*Dashboard, error)); ok { + return rf(ctx, cmd) + } if rf, ok := ret.Get(0).(func(context.Context, SaveDashboardCommand) *Dashboard); ok { r0 = rf(ctx, cmd) } else { @@ -403,7 +1024,6 @@ func (_m *FakeDashboardStore) SaveDashboard(ctx context.Context, cmd SaveDashboa } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, SaveDashboardCommand) error); ok { r1 = rf(ctx, cmd) } else { @@ -413,11 +1033,44 @@ func (_m *FakeDashboardStore) SaveDashboard(ctx context.Context, cmd SaveDashboa return r0, r1 } +// FakeDashboardStore_SaveDashboard_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SaveDashboard' +type FakeDashboardStore_SaveDashboard_Call struct { + *mock.Call +} + +// SaveDashboard is a helper method to define mock.On call +// - ctx context.Context +// - cmd SaveDashboardCommand +func (_e *FakeDashboardStore_Expecter) SaveDashboard(ctx interface{}, cmd interface{}) *FakeDashboardStore_SaveDashboard_Call { + return &FakeDashboardStore_SaveDashboard_Call{Call: _e.mock.On("SaveDashboard", ctx, cmd)} +} + +func (_c *FakeDashboardStore_SaveDashboard_Call) Run(run func(ctx context.Context, cmd SaveDashboardCommand)) *FakeDashboardStore_SaveDashboard_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(SaveDashboardCommand)) + }) + return _c +} + +func (_c *FakeDashboardStore_SaveDashboard_Call) Return(_a0 *Dashboard, _a1 error) *FakeDashboardStore_SaveDashboard_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_SaveDashboard_Call) RunAndReturn(run func(context.Context, SaveDashboardCommand) (*Dashboard, error)) *FakeDashboardStore_SaveDashboard_Call { + _c.Call.Return(run) + return _c +} + // SaveProvisionedDashboard provides a mock function with given fields: ctx, cmd, provisioning func (_m *FakeDashboardStore) SaveProvisionedDashboard(ctx context.Context, cmd SaveDashboardCommand, provisioning *DashboardProvisioning) (*Dashboard, error) { ret := _m.Called(ctx, cmd, provisioning) var r0 *Dashboard + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, SaveDashboardCommand, *DashboardProvisioning) (*Dashboard, error)); ok { + return rf(ctx, cmd, provisioning) + } if rf, ok := ret.Get(0).(func(context.Context, SaveDashboardCommand, *DashboardProvisioning) *Dashboard); ok { r0 = rf(ctx, cmd, provisioning) } else { @@ -426,7 +1079,6 @@ func (_m *FakeDashboardStore) SaveProvisionedDashboard(ctx context.Context, cmd } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, SaveDashboardCommand, *DashboardProvisioning) error); ok { r1 = rf(ctx, cmd, provisioning) } else { @@ -436,6 +1088,36 @@ func (_m *FakeDashboardStore) SaveProvisionedDashboard(ctx context.Context, cmd return r0, r1 } +// FakeDashboardStore_SaveProvisionedDashboard_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SaveProvisionedDashboard' +type FakeDashboardStore_SaveProvisionedDashboard_Call struct { + *mock.Call +} + +// SaveProvisionedDashboard is a helper method to define mock.On call +// - ctx context.Context +// - cmd SaveDashboardCommand +// - provisioning *DashboardProvisioning +func (_e *FakeDashboardStore_Expecter) SaveProvisionedDashboard(ctx interface{}, cmd interface{}, provisioning interface{}) *FakeDashboardStore_SaveProvisionedDashboard_Call { + return &FakeDashboardStore_SaveProvisionedDashboard_Call{Call: _e.mock.On("SaveProvisionedDashboard", ctx, cmd, provisioning)} +} + +func (_c *FakeDashboardStore_SaveProvisionedDashboard_Call) Run(run func(ctx context.Context, cmd SaveDashboardCommand, provisioning *DashboardProvisioning)) *FakeDashboardStore_SaveProvisionedDashboard_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(SaveDashboardCommand), args[2].(*DashboardProvisioning)) + }) + return _c +} + +func (_c *FakeDashboardStore_SaveProvisionedDashboard_Call) Return(_a0 *Dashboard, _a1 error) *FakeDashboardStore_SaveProvisionedDashboard_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_SaveProvisionedDashboard_Call) RunAndReturn(run func(context.Context, SaveDashboardCommand, *DashboardProvisioning) (*Dashboard, error)) *FakeDashboardStore_SaveProvisionedDashboard_Call { + _c.Call.Return(run) + return _c +} + // UnprovisionDashboard provides a mock function with given fields: ctx, id func (_m *FakeDashboardStore) UnprovisionDashboard(ctx context.Context, id int64) error { ret := _m.Called(ctx, id) @@ -450,6 +1132,35 @@ func (_m *FakeDashboardStore) UnprovisionDashboard(ctx context.Context, id int64 return r0 } +// FakeDashboardStore_UnprovisionDashboard_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UnprovisionDashboard' +type FakeDashboardStore_UnprovisionDashboard_Call struct { + *mock.Call +} + +// UnprovisionDashboard is a helper method to define mock.On call +// - ctx context.Context +// - id int64 +func (_e *FakeDashboardStore_Expecter) UnprovisionDashboard(ctx interface{}, id interface{}) *FakeDashboardStore_UnprovisionDashboard_Call { + return &FakeDashboardStore_UnprovisionDashboard_Call{Call: _e.mock.On("UnprovisionDashboard", ctx, id)} +} + +func (_c *FakeDashboardStore_UnprovisionDashboard_Call) Run(run func(ctx context.Context, id int64)) *FakeDashboardStore_UnprovisionDashboard_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64)) + }) + return _c +} + +func (_c *FakeDashboardStore_UnprovisionDashboard_Call) Return(_a0 error) *FakeDashboardStore_UnprovisionDashboard_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *FakeDashboardStore_UnprovisionDashboard_Call) RunAndReturn(run func(context.Context, int64) error) *FakeDashboardStore_UnprovisionDashboard_Call { + _c.Call.Return(run) + return _c +} + // UpdateDashboardACL provides a mock function with given fields: ctx, uid, items func (_m *FakeDashboardStore) UpdateDashboardACL(ctx context.Context, uid int64, items []*DashboardACL) error { ret := _m.Called(ctx, uid, items) @@ -464,18 +1175,51 @@ func (_m *FakeDashboardStore) UpdateDashboardACL(ctx context.Context, uid int64, return r0 } +// FakeDashboardStore_UpdateDashboardACL_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateDashboardACL' +type FakeDashboardStore_UpdateDashboardACL_Call struct { + *mock.Call +} + +// UpdateDashboardACL is a helper method to define mock.On call +// - ctx context.Context +// - uid int64 +// - items []*DashboardACL +func (_e *FakeDashboardStore_Expecter) UpdateDashboardACL(ctx interface{}, uid interface{}, items interface{}) *FakeDashboardStore_UpdateDashboardACL_Call { + return &FakeDashboardStore_UpdateDashboardACL_Call{Call: _e.mock.On("UpdateDashboardACL", ctx, uid, items)} +} + +func (_c *FakeDashboardStore_UpdateDashboardACL_Call) Run(run func(ctx context.Context, uid int64, items []*DashboardACL)) *FakeDashboardStore_UpdateDashboardACL_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64), args[2].([]*DashboardACL)) + }) + return _c +} + +func (_c *FakeDashboardStore_UpdateDashboardACL_Call) Return(_a0 error) *FakeDashboardStore_UpdateDashboardACL_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *FakeDashboardStore_UpdateDashboardACL_Call) RunAndReturn(run func(context.Context, int64, []*DashboardACL) error) *FakeDashboardStore_UpdateDashboardACL_Call { + _c.Call.Return(run) + return _c +} + // ValidateDashboardBeforeSave provides a mock function with given fields: ctx, dashboard, overwrite func (_m *FakeDashboardStore) ValidateDashboardBeforeSave(ctx context.Context, dashboard *Dashboard, overwrite bool) (bool, error) { ret := _m.Called(ctx, dashboard, overwrite) var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *Dashboard, bool) (bool, error)); ok { + return rf(ctx, dashboard, overwrite) + } if rf, ok := ret.Get(0).(func(context.Context, *Dashboard, bool) bool); ok { r0 = rf(ctx, dashboard, overwrite) } else { r0 = ret.Get(0).(bool) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *Dashboard, bool) error); ok { r1 = rf(ctx, dashboard, overwrite) } else { @@ -485,6 +1229,36 @@ func (_m *FakeDashboardStore) ValidateDashboardBeforeSave(ctx context.Context, d return r0, r1 } +// FakeDashboardStore_ValidateDashboardBeforeSave_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ValidateDashboardBeforeSave' +type FakeDashboardStore_ValidateDashboardBeforeSave_Call struct { + *mock.Call +} + +// ValidateDashboardBeforeSave is a helper method to define mock.On call +// - ctx context.Context +// - dashboard *Dashboard +// - overwrite bool +func (_e *FakeDashboardStore_Expecter) ValidateDashboardBeforeSave(ctx interface{}, dashboard interface{}, overwrite interface{}) *FakeDashboardStore_ValidateDashboardBeforeSave_Call { + return &FakeDashboardStore_ValidateDashboardBeforeSave_Call{Call: _e.mock.On("ValidateDashboardBeforeSave", ctx, dashboard, overwrite)} +} + +func (_c *FakeDashboardStore_ValidateDashboardBeforeSave_Call) Run(run func(ctx context.Context, dashboard *Dashboard, overwrite bool)) *FakeDashboardStore_ValidateDashboardBeforeSave_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*Dashboard), args[2].(bool)) + }) + return _c +} + +func (_c *FakeDashboardStore_ValidateDashboardBeforeSave_Call) Return(_a0 bool, _a1 error) *FakeDashboardStore_ValidateDashboardBeforeSave_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FakeDashboardStore_ValidateDashboardBeforeSave_Call) RunAndReturn(run func(context.Context, *Dashboard, bool) (bool, error)) *FakeDashboardStore_ValidateDashboardBeforeSave_Call { + _c.Call.Return(run) + return _c +} + type mockConstructorTestingTNewFakeDashboardStore interface { mock.TestingT Cleanup(func()) diff --git a/pkg/services/folder/folderimpl/folder.go b/pkg/services/folder/folderimpl/folder.go index 2dae51cd872..8b169b453f5 100644 --- a/pkg/services/folder/folderimpl/folder.go +++ b/pkg/services/folder/folderimpl/folder.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "strings" + "sync" "time" "github.com/grafana/grafana/pkg/bus" @@ -36,6 +37,9 @@ type Service struct { // bus is currently used to publish event in case of title change bus bus.Bus + + mutex sync.RWMutex + registry map[string]folder.RegistryService } func ProvideService( @@ -58,6 +62,7 @@ func ProvideService( accessControl: ac, bus: bus, db: db, + registry: make(map[string]folder.RegistryService), } if features.IsEnabled(featuremgmt.FlagNestedFolders) { srv.DBMigration(db) @@ -437,6 +442,12 @@ func (s *Service) Delete(ctx context.Context, cmd *folder.DeleteFolderCommand) e if cmd.SignedInUser == nil { return folder.ErrBadRequest.Errorf("missing signed in user") } + if cmd.UID == "" { + return folder.ErrBadRequest.Errorf("missing UID") + } + if cmd.OrgID < 1 { + return folder.ErrBadRequest.Errorf("invalid orgID") + } result := []string{cmd.UID} err := s.db.InTransaction(ctx, func(ctx context.Context) error { if s.features.IsEnabled(featuremgmt.FlagNestedFolders) { @@ -466,6 +477,11 @@ func (s *Service) Delete(ctx context.Context, cmd *folder.DeleteFolderCommand) e } return dashboards.ErrFolderAccessDenied } + + if err := s.deleteChildrenInFolder(ctx, dashFolder.OrgID, dashFolder.UID); err != nil { + return err + } + err = s.legacyDelete(ctx, cmd, dashFolder) if err != nil { return err @@ -477,6 +493,15 @@ func (s *Service) Delete(ctx context.Context, cmd *folder.DeleteFolderCommand) e return err } +func (s *Service) deleteChildrenInFolder(ctx context.Context, orgID int64, UID string) error { + for _, v := range s.registry { + if err := v.DeleteInFolder(ctx, orgID, UID); err != nil { + return err + } + } + return nil +} + func (s *Service) legacyDelete(ctx context.Context, cmd *folder.DeleteFolderCommand, dashFolder *folder.Folder) error { deleteCmd := dashboards.DeleteDashboardCommand{OrgID: cmd.OrgID, ID: dashFolder.ID, ForceDeleteFolderRules: cmd.ForceDeleteRules} @@ -588,7 +613,8 @@ func (s *Service) nestedFolderDelete(ctx context.Context, cmd *folder.DeleteFold } result = append(result, subfolders...) } - logger.Info("deleting folder", "org_id", cmd.OrgID, "uid", cmd.UID) + + logger.Info("deleting folder and its contents", "org_id", cmd.OrgID, "uid", cmd.UID) err = s.store.Delete(ctx, cmd.UID, cmd.OrgID) if err != nil { logger.Info("failed deleting folder", "org_id", cmd.OrgID, "uid", cmd.UID, "err", err) @@ -794,3 +820,17 @@ func toFolderError(err error) error { return err } + +func (s *Service) RegisterService(r folder.RegistryService) error { + s.mutex.Lock() + defer s.mutex.Unlock() + + _, ok := s.registry[r.Kind()] + if ok { + return folder.ErrTargetRegistrySrvConflict.Errorf("target registry service: %s already exists", r.Kind()) + } + + s.registry[r.Kind()] = r + + return nil +} diff --git a/pkg/services/folder/foldertest/foldertest.go b/pkg/services/folder/foldertest/foldertest.go index c83be22bec0..684cdf0bd6c 100644 --- a/pkg/services/folder/foldertest/foldertest.go +++ b/pkg/services/folder/foldertest/foldertest.go @@ -45,3 +45,7 @@ func (s *FakeService) MakeUserAdmin(ctx context.Context, orgID int64, userID, fo func (s *FakeService) Move(ctx context.Context, cmd *folder.MoveFolderCommand) (*folder.Folder, error) { return s.ExpectedFolder, s.ExpectedError } + +func (s *FakeService) RegisterService(service folder.RegistryService) error { + return s.ExpectedError +} diff --git a/pkg/services/folder/model.go b/pkg/services/folder/model.go index ef32296a9c2..ee656d74ed3 100644 --- a/pkg/services/folder/model.go +++ b/pkg/services/folder/model.go @@ -13,6 +13,7 @@ var ErrDatabaseError = errutil.NewBase(errutil.StatusInternal, "folder.database- var ErrInternal = errutil.NewBase(errutil.StatusInternal, "folder.internal") var ErrFolderTooDeep = errutil.NewBase(errutil.StatusInternal, "folder.too-deep") var ErrCircularReference = errutil.NewBase(errutil.StatusBadRequest, "folder.circular-reference", errutil.WithPublicMessage("Circular reference detected")) +var ErrTargetRegistrySrvConflict = errutil.NewBase(errutil.StatusInternal, "folder.target-registry-srv-conflict") const ( GeneralFolderUID = "general" diff --git a/pkg/services/folder/registry.go b/pkg/services/folder/registry.go new file mode 100644 index 00000000000..7aa088a38c9 --- /dev/null +++ b/pkg/services/folder/registry.go @@ -0,0 +1,10 @@ +package folder + +import ( + "context" +) + +type RegistryService interface { + DeleteInFolder(ctx context.Context, orgID int64, UID string) error + Kind() string +} diff --git a/pkg/services/folder/service.go b/pkg/services/folder/service.go index 068588fba17..06028c96783 100644 --- a/pkg/services/folder/service.go +++ b/pkg/services/folder/service.go @@ -25,6 +25,7 @@ type Service interface { MakeUserAdmin(ctx context.Context, orgID int64, userID, folderID int64, setViewAndEditPermissions bool) error // Move changes a folder's parent folder to the requested new parent. Move(ctx context.Context, cmd *MoveFolderCommand) (*Folder, error) + RegisterService(service RegistryService) error } // FolderStore is a folder store. diff --git a/pkg/services/libraryelements/libraryelements_test.go b/pkg/services/libraryelements/libraryelements_test.go index 2da4b10263a..967d43cbe3d 100644 --- a/pkg/services/libraryelements/libraryelements_test.go +++ b/pkg/services/libraryelements/libraryelements_test.go @@ -295,11 +295,12 @@ func createDashboard(t *testing.T, sqlStore db.DB, user user.SignedInUser, dash folderPermissions := acmock.NewMockedPermissionsService() dashboardPermissions := acmock.NewMockedPermissionsService() folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - service := dashboardservice.ProvideDashboardServiceImpl( + service, err := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, dashAlertExtractor, features, folderPermissions, dashboardPermissions, ac, foldertest.NewFakeService(), ) + require.NoError(t, err) dashboard, err := service.SaveDashboard(context.Background(), dashItem, true) require.NoError(t, err) @@ -441,11 +442,12 @@ func testScenario(t *testing.T, desc string, fn func(t *testing.T, sc scenarioCo folderPermissions := acmock.NewMockedPermissionsService() dashboardPermissions := acmock.NewMockedPermissionsService() folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - dashboardService := dashboardservice.ProvideDashboardServiceImpl( + dashboardService, err := dashboardservice.ProvideDashboardServiceImpl( sqlStore.Cfg, dashboardStore, folderStore, nil, features, folderPermissions, dashboardPermissions, ac, foldertest.NewFakeService(), ) + require.NoError(t, err) guardian.InitLegacyGuardian(sqlStore.Cfg, sqlStore, dashboardService, &teamtest.FakeService{}) service := LibraryElementService{ Cfg: sqlStore.Cfg, diff --git a/pkg/services/librarypanels/librarypanels_test.go b/pkg/services/librarypanels/librarypanels_test.go index 8c3f363e3f7..37130266d95 100644 --- a/pkg/services/librarypanels/librarypanels_test.go +++ b/pkg/services/librarypanels/librarypanels_test.go @@ -707,11 +707,12 @@ func createDashboard(t *testing.T, sqlStore db.DB, user *user.SignedInUser, dash dashAlertService := alerting.ProvideDashAlertExtractorService(nil, nil, nil) ac := acmock.New() folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - service := dashboardservice.ProvideDashboardServiceImpl( + service, err := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, dashAlertService, featuremgmt.WithFeatures(), acmock.NewMockedPermissionsService(), acmock.NewMockedPermissionsService(), ac, foldertest.NewFakeService(), ) + require.NoError(t, err) dashboard, err := service.SaveDashboard(context.Background(), dashItem, true) require.NoError(t, err) diff --git a/pkg/services/ngalert/store/testing.go b/pkg/services/ngalert/store/testing.go index 6d3af7bf618..5480f443867 100644 --- a/pkg/services/ngalert/store/testing.go +++ b/pkg/services/ngalert/store/testing.go @@ -150,12 +150,13 @@ func SetupDashboardService(tb testing.TB, sqlStore *sqlstore.SQLStore, fs *folde quotaService := quotatest.New(false, nil) dashboardStore, err := database.ProvideDashboardStore(sqlStore, sqlStore.Cfg, features, tagimpl.ProvideService(sqlStore, sqlStore.Cfg), quotaService) - dashboardService := dashboardservice.ProvideDashboardServiceImpl( + require.NoError(tb, err) + + dashboardService, err := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, fs, nil, features, folderPermissions, dashboardPermissions, ac, foldertest.NewFakeService(), ) - require.NoError(tb, err) return dashboardService, dashboardStore