diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 19708ddc9ec..ce81df0fc44 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -194,6 +194,10 @@ func PostDashboard(c *middleware.Context, cmd m.SaveDashboardCommand) Response { return ApiError(403, "Does not have permission to save this dashboard", nil) } + if dash.IsFolder && dash.ParentId > 0 { + return ApiError(400, m.ErrDashboardFolderCannotHaveParent.Error(), nil) + } + // Check if Title is empty if dash.Title == "" { return ApiError(400, m.ErrDashboardTitleEmpty.Error(), nil) diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index 4e6b240e9dd..6f9aea03d6e 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -132,6 +132,26 @@ func TestDashboardApiEndpoint(t *testing.T) { CallPostDashboard(sc) So(sc.resp.Code, ShouldEqual, 200) }) + + Convey("When saving a dashboard folder in another folder", func() { + bus.AddHandler("test", func(query *models.GetDashboardQuery) error { + query.Result = fakeDash + query.Result.IsFolder = true + return nil + }) + invalidCmd := models.SaveDashboardCommand{ + Dashboard: simplejson.NewFromAny(map[string]interface{}{ + "parentId": fakeDash.ParentId, + "title": fakeDash.Title, + }), + } + Convey("Should return an error", func() { + postDashboardScenario("When calling POST on", "/api/dashboards", "/api/dashboards", role, invalidCmd, func(sc *scenarioContext) { + CallPostDashboard(sc) + So(sc.resp.Code, ShouldEqual, 400) + }) + }) + }) }) }) diff --git a/pkg/models/dashboards.go b/pkg/models/dashboards.go index d4fa9acc0f1..b61f26505eb 100644 --- a/pkg/models/dashboards.go +++ b/pkg/models/dashboards.go @@ -11,11 +11,12 @@ import ( // Typed errors var ( - ErrDashboardNotFound = errors.New("Dashboard not found") - ErrDashboardSnapshotNotFound = errors.New("Dashboard snapshot not found") - ErrDashboardWithSameNameExists = errors.New("A dashboard with the same name already exists") - ErrDashboardVersionMismatch = errors.New("The dashboard has been changed by someone else") - ErrDashboardTitleEmpty = errors.New("Dashboard title cannot be empty") + ErrDashboardNotFound = errors.New("Dashboard not found") + ErrDashboardSnapshotNotFound = errors.New("Dashboard snapshot not found") + ErrDashboardWithSameNameExists = errors.New("A dashboard with the same name already exists") + ErrDashboardVersionMismatch = errors.New("The dashboard has been changed by someone else") + ErrDashboardTitleEmpty = errors.New("Dashboard title cannot be empty") + ErrDashboardFolderCannotHaveParent = errors.New("A Dashboard Folder cannot be added to another folder") ) type UpdatePluginDashboardError struct {