From 6b483a8dca0977ee6ddce5cacb5ddc5cae3952df Mon Sep 17 00:00:00 2001 From: idafurjes <36131195+idafurjes@users.noreply.github.com> Date: Fri, 28 Oct 2022 15:35:49 +0200 Subject: [PATCH] Add implementation for folder store methods (#57700) * Add implementation for folder store methods * Add Move implementation * Add back comment and fix query * Remove Move from store * Adjust GetChildren * Fix errutil error declaration and usage * Add org id to get children query --- pkg/services/folder/folderimpl/sqlstore.go | 60 ++++++++++++------- .../folder/folderimpl/sqlstore_test.go | 2 - pkg/services/folder/folderimpl/store.go | 5 +- pkg/services/folder/model.go | 5 ++ 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/pkg/services/folder/folderimpl/sqlstore.go b/pkg/services/folder/folderimpl/sqlstore.go index 83a352807a9..b10e650fe7a 100644 --- a/pkg/services/folder/folderimpl/sqlstore.go +++ b/pkg/services/folder/folderimpl/sqlstore.go @@ -24,30 +24,50 @@ func ProvideStore(db db.DB, cfg *setting.Cfg, features featuremgmt.FeatureManage return &sqlStore{db: db, log: log.New("folder-store"), cfg: cfg, fm: features} } -func (s *sqlStore) Create(ctx context.Context, cmd *folder.CreateFolderCommand) (*folder.Folder, error) { +func (ss *sqlStore) Create(ctx context.Context, cmd *folder.CreateFolderCommand) (*folder.Folder, error) { panic("not implemented") } -func (s *sqlStore) Delete(ctx context.Context, uid string, orgID int64) error { +func (ss *sqlStore) Delete(ctx context.Context, uid string, orgID int64) error { + return ss.db.WithDbSession(ctx, func(sess *db.Session) error { + _, err := sess.Exec("DELETE FROM folder WHERE folder_uid=? AND org_id=?", uid, orgID) + return err + }) +} + +func (ss *sqlStore) Update(ctx context.Context, cmd *folder.UpdateFolderCommand) (*folder.Folder, error) { + err := ss.db.WithDbSession(ctx, func(sess *db.Session) error { + _, err := sess.ID(cmd.Folder.ID).AllCols().Update(cmd.Folder) + return err + }) + + return cmd.Folder, err +} + +func (ss *sqlStore) Get(ctx context.Context, cmd *folder.GetFolderQuery) (*folder.Folder, error) { + var foldr *folder.Folder + err := ss.db.WithDbSession(ctx, func(sess *db.Session) error { + exists, err := sess.Where("uid=? OR id=? OR title=?", cmd.UID, cmd.ID, cmd.Title).Get(foldr) + if err != nil { + return err + } + if !exists { + return folder.ErrFolderNotFound.Errorf("folder not found") + } + return nil + }) + return foldr, err +} + +func (ss *sqlStore) GetParents(ctx context.Context, cmd *folder.GetParentsQuery) ([]*folder.Folder, error) { panic("not implemented") } -func (s *sqlStore) Update(ctx context.Context, cmd *folder.UpdateFolderCommand) (*folder.Folder, error) { - panic("not implemented") -} - -func (s *sqlStore) Move(ctx context.Context, cmd *folder.MoveFolderCommand) (*folder.Folder, error) { - panic("not implemented") -} - -func (s *sqlStore) Get(ctx context.Context, cmd *folder.GetFolderQuery) (*folder.Folder, error) { - panic("not implemented") -} - -func (s *sqlStore) GetParents(ctx context.Context, cmd *folder.GetParentsQuery) ([]*folder.Folder, error) { - panic("not implemented") -} - -func (s *sqlStore) GetChildren(ctx context.Context, cmd *folder.GetTreeQuery) ([]*folder.Folder, error) { - panic("not implemented") +func (ss *sqlStore) GetChildren(ctx context.Context, cmd *folder.GetTreeQuery) ([]*folder.Folder, error) { + var folders []*folder.Folder + err := ss.db.WithDbSession(ctx, func(sess *db.Session) error { + err := sess.Where("parent_uid=? AND org_id=?", cmd.UID, cmd.OrgID).Find(folders) + return err + }) + return folders, err } diff --git a/pkg/services/folder/folderimpl/sqlstore_test.go b/pkg/services/folder/folderimpl/sqlstore_test.go index 545842dce95..056a906673b 100644 --- a/pkg/services/folder/folderimpl/sqlstore_test.go +++ b/pkg/services/folder/folderimpl/sqlstore_test.go @@ -8,8 +8,6 @@ func TestDelete(t *testing.T) {} func TestUpdate(t *testing.T) {} -func TestMove(t *testing.T) {} - func TestGet(t *testing.T) {} func TestGetParent(t *testing.T) {} diff --git a/pkg/services/folder/folderimpl/store.go b/pkg/services/folder/folderimpl/store.go index a4e118fcba0..2a374343592 100644 --- a/pkg/services/folder/folderimpl/store.go +++ b/pkg/services/folder/folderimpl/store.go @@ -6,7 +6,7 @@ import ( "github.com/grafana/grafana/pkg/services/folder" ) -// Store is the interface which a folder store must implement. +// store is the interface which a folder store must implement. type store interface { // Create creates a folder and returns the newly-created folder. Create(ctx context.Context, cmd *folder.CreateFolderCommand) (*folder.Folder, error) @@ -18,9 +18,6 @@ type store interface { // Use Move to change a dashboard's parent ID. Update(ctx context.Context, cmd *folder.UpdateFolderCommand) (*folder.Folder, error) - // Move changes the given folder's parent folder uid and applies any necessary permissions changes. - Move(ctx context.Context, cmd *folder.MoveFolderCommand) (*folder.Folder, error) - // Get returns a folder. Get(ctx context.Context, cmd *folder.GetFolderQuery) (*folder.Folder, error) diff --git a/pkg/services/folder/model.go b/pkg/services/folder/model.go index 7549b0f6a70..962daee3c8e 100644 --- a/pkg/services/folder/model.go +++ b/pkg/services/folder/model.go @@ -2,6 +2,8 @@ package folder import ( "time" + + "github.com/grafana/grafana/pkg/util/errutil" ) const ( @@ -9,6 +11,8 @@ const ( MaxNestedFolderDepth = 8 ) +var ErrFolderNotFound = errutil.NewBase(errutil.StatusNotFound, "folder.notFound") + type Folder struct { ID int64 OrgID int64 @@ -87,6 +91,7 @@ type GetParentsQuery struct { type GetTreeQuery struct { UID string + OrgID int64 Depth int64 // Pagination options