From 07aa173939ea17dd6955cbda75760efc02abfbdb Mon Sep 17 00:00:00 2001 From: Tania <10127682+undef1nd@users.noreply.github.com> Date: Mon, 22 Jan 2024 17:04:18 +0100 Subject: [PATCH] Nested Folders: Add back syncing of folders between folder and dashboard tbls (#80972) Add back syncing of folders between folder and dashboard tbls This partially reverts commit 06d2ae3ada3bb2c6c12065434c67be5660c6d632. --- pkg/services/folder/folderimpl/folder.go | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/pkg/services/folder/folderimpl/folder.go b/pkg/services/folder/folderimpl/folder.go index b2094dff7dfb..b088d3f4774b 100644 --- a/pkg/services/folder/folderimpl/folder.go +++ b/pkg/services/folder/folderimpl/folder.go @@ -23,6 +23,8 @@ import ( "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/guardian" + "github.com/grafana/grafana/pkg/services/sqlstore" + "github.com/grafana/grafana/pkg/services/sqlstore/migrator" "github.com/grafana/grafana/pkg/services/store/entity" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" @@ -70,6 +72,7 @@ func ProvideService( registry: make(map[string]folder.RegistryService), metrics: newFoldersMetrics(r), } + srv.DBMigration(db) ac.RegisterScopeAttributeResolver(dashboards.NewFolderNameScopeResolver(folderStore, srv)) ac.RegisterScopeAttributeResolver(dashboards.NewFolderIDScopeResolver(folderStore, srv)) @@ -77,6 +80,47 @@ func ProvideService( return srv } +func (s *Service) DBMigration(db db.DB) { + s.log.Debug("syncing dashboard and folder tables started") + + ctx := context.Background() + err := db.WithDbSession(ctx, func(sess *sqlstore.DBSession) error { + var err error + if db.GetDialect().DriverName() == migrator.SQLite { + _, err = sess.Exec(` + INSERT INTO folder (uid, org_id, title, created, updated) + SELECT uid, org_id, title, created, updated FROM dashboard WHERE is_folder = 1 + ON CONFLICT DO UPDATE SET title=excluded.title, updated=excluded.updated + `) + } else if db.GetDialect().DriverName() == migrator.Postgres { + _, err = sess.Exec(` + INSERT INTO folder (uid, org_id, title, created, updated) + SELECT uid, org_id, title, created, updated FROM dashboard WHERE is_folder = true + ON CONFLICT(uid, org_id) DO UPDATE SET title=excluded.title, updated=excluded.updated + `) + } else { + _, err = sess.Exec(` + INSERT INTO folder (uid, org_id, title, created, updated) + SELECT * FROM (SELECT uid, org_id, title, created, updated FROM dashboard WHERE is_folder = 1) AS derived + ON DUPLICATE KEY UPDATE title=derived.title, updated=derived.updated + `) + } + if err != nil { + return err + } + _, err = sess.Exec(` + DELETE FROM folder WHERE NOT EXISTS + (SELECT 1 FROM dashboard WHERE dashboard.uid = folder.uid AND dashboard.org_id = folder.org_id AND dashboard.is_folder = true) + `) + return err + }) + if err != nil { + s.log.Error("DB migration on folder service start failed.", "err", err) + } + + s.log.Debug("syncing dashboard and folder tables finished") +} + func (s *Service) Get(ctx context.Context, q *folder.GetFolderQuery) (*folder.Folder, error) { if q.SignedInUser == nil { return nil, folder.ErrBadRequest.Errorf("missing signed in user")