Chore: GetDashboardQuery should be dispatched using DispatchCtx (#36877)

* Chore: GetDashboardQuery should be dispatched using DispatchCtx

* Fix after merge

* Changes after review

* Various fixes

* Use GetDashboardCtx function instead of GetDashboard
This commit is contained in:
Marcus Efraimsson
2021-09-14 16:08:04 +02:00
committed by GitHub
parent 2b1d3d27e4
commit fa9857499b
28 changed files with 149 additions and 135 deletions

View File

@@ -1,6 +1,7 @@
package libraryelements
import (
"context"
"encoding/json"
"errors"
"fmt"
@@ -123,8 +124,8 @@ func (l *LibraryElementService) createLibraryElement(c *models.ReqContext, cmd C
return LibraryElementDTO{}, err
}
err := l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
if err := l.requirePermissionsOnFolder(c.SignedInUser, cmd.FolderID); err != nil {
err := l.SQLStore.WithTransactionalDbSession(c.Req.Context(), func(session *sqlstore.DBSession) error {
if err := l.requirePermissionsOnFolder(c.Req.Context(), c.SignedInUser, cmd.FolderID); err != nil {
return err
}
if _, err := session.Insert(&element); err != nil {
@@ -169,12 +170,12 @@ func (l *LibraryElementService) createLibraryElement(c *models.ReqContext, cmd C
// deleteLibraryElement deletes a library element.
func (l *LibraryElementService) deleteLibraryElement(c *models.ReqContext, uid string) error {
return l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
return l.SQLStore.WithTransactionalDbSession(c.Req.Context(), func(session *sqlstore.DBSession) error {
element, err := getLibraryElement(l.SQLStore.Dialect, session, uid, c.SignedInUser.OrgId)
if err != nil {
return err
}
if err := l.requirePermissionsOnFolder(c.SignedInUser, element.FolderID); err != nil {
if err := l.requirePermissionsOnFolder(c.Req.Context(), c.SignedInUser, element.FolderID); err != nil {
return err
}
var connectionIDs []struct {
@@ -408,7 +409,7 @@ func (l *LibraryElementService) getAllLibraryElements(c *models.ReqContext, quer
return result, err
}
func (l *LibraryElementService) handleFolderIDPatches(elementToPatch *LibraryElement, fromFolderID int64, toFolderID int64, user *models.SignedInUser) error {
func (l *LibraryElementService) handleFolderIDPatches(ctx context.Context, elementToPatch *LibraryElement, fromFolderID int64, toFolderID int64, user *models.SignedInUser) error {
// FolderID was not provided in the PATCH request
if toFolderID == -1 {
toFolderID = fromFolderID
@@ -416,13 +417,13 @@ func (l *LibraryElementService) handleFolderIDPatches(elementToPatch *LibraryEle
// FolderID was provided in the PATCH request
if toFolderID != -1 && toFolderID != fromFolderID {
if err := l.requirePermissionsOnFolder(user, toFolderID); err != nil {
if err := l.requirePermissionsOnFolder(ctx, user, toFolderID); err != nil {
return err
}
}
// Always check permissions for the folder where library element resides
if err := l.requirePermissionsOnFolder(user, fromFolderID); err != nil {
if err := l.requirePermissionsOnFolder(ctx, user, fromFolderID); err != nil {
return err
}
@@ -437,7 +438,7 @@ func (l *LibraryElementService) patchLibraryElement(c *models.ReqContext, cmd pa
if err := l.requireSupportedElementKind(cmd.Kind); err != nil {
return LibraryElementDTO{}, err
}
err := l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
err := l.SQLStore.WithTransactionalDbSession(c.Req.Context(), func(session *sqlstore.DBSession) error {
elementInDB, err := getLibraryElement(l.SQLStore.Dialect, session, uid, c.SignedInUser.OrgId)
if err != nil {
return err
@@ -484,7 +485,7 @@ func (l *LibraryElementService) patchLibraryElement(c *models.ReqContext, cmd pa
if cmd.Model == nil {
libraryElement.Model = elementInDB.Model
}
if err := l.handleFolderIDPatches(&libraryElement, elementInDB.FolderID, cmd.FolderID, c.SignedInUser); err != nil {
if err := l.handleFolderIDPatches(c.Req.Context(), &libraryElement, elementInDB.FolderID, cmd.FolderID, c.SignedInUser); err != nil {
return err
}
if err := syncFieldsWithModel(&libraryElement); err != nil {
@@ -633,7 +634,7 @@ func (l *LibraryElementService) getElementsForDashboardID(c *models.ReqContext,
// connectElementsToDashboardID adds connections for all elements Library Elements in a Dashboard.
func (l *LibraryElementService) connectElementsToDashboardID(c *models.ReqContext, elementUIDs []string, dashboardID int64) error {
err := l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
err := l.SQLStore.WithTransactionalDbSession(c.Req.Context(), func(session *sqlstore.DBSession) error {
_, err := session.Exec("DELETE FROM "+models.LibraryElementConnectionTableName+" WHERE kind=1 AND connection_id=?", dashboardID)
if err != nil {
return err
@@ -643,7 +644,7 @@ func (l *LibraryElementService) connectElementsToDashboardID(c *models.ReqContex
if err != nil {
return err
}
if err := l.requirePermissionsOnFolder(c.SignedInUser, element.FolderID); err != nil {
if err := l.requirePermissionsOnFolder(c.Req.Context(), c.SignedInUser, element.FolderID); err != nil {
return err
}
@@ -680,7 +681,7 @@ func (l *LibraryElementService) disconnectElementsFromDashboardID(c *models.ReqC
// deleteLibraryElementsInFolderUID deletes all Library Elements in a folder.
func (l *LibraryElementService) deleteLibraryElementsInFolderUID(c *models.ReqContext, folderUID string) error {
return l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
return l.SQLStore.WithTransactionalDbSession(c.Req.Context(), func(session *sqlstore.DBSession) error {
var folderUIDs []struct {
ID int64 `xorm:"id"`
}
@@ -693,7 +694,7 @@ func (l *LibraryElementService) deleteLibraryElementsInFolderUID(c *models.ReqCo
}
folderID := folderUIDs[0].ID
if err := l.requirePermissionsOnFolder(c.SignedInUser, folderID); err != nil {
if err := l.requirePermissionsOnFolder(c.Req.Context(), c.SignedInUser, folderID); err != nil {
return err
}
var connectionIDs []struct {

View File

@@ -1,6 +1,8 @@
package libraryelements
import (
"context"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/guardian"
@@ -22,7 +24,7 @@ func (l *LibraryElementService) requireSupportedElementKind(kindAsInt int64) err
}
}
func (l *LibraryElementService) requirePermissionsOnFolder(user *models.SignedInUser, folderID int64) error {
func (l *LibraryElementService) requirePermissionsOnFolder(ctx context.Context, user *models.SignedInUser, folderID int64) error {
if isGeneralFolder(folderID) && user.HasRole(models.ROLE_EDITOR) {
return nil
}
@@ -32,7 +34,7 @@ func (l *LibraryElementService) requirePermissionsOnFolder(user *models.SignedIn
}
s := dashboards.NewFolderService(user.OrgId, user, l.SQLStore)
folder, err := s.GetFolderByID(folderID)
folder, err := s.GetFolderByID(ctx, folderID)
if err != nil {
return err
}

View File

@@ -207,7 +207,7 @@ func createFolderWithACL(t *testing.T, sqlStore *sqlstore.SQLStore, title string
s := dashboards.NewFolderService(user.OrgId, &user, sqlStore)
t.Logf("Creating folder with title and UID %q", title)
folder, err := s.CreateFolder(title, title)
folder, err := s.CreateFolder(context.Background(), title, title)
require.NoError(t, err)
updateFolderACL(t, sqlStore, folder.Id, items)