From 7ee691dc480ab6f47689e5d7f7f69504a9313be7 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Tue, 30 Jan 2018 13:11:48 +0100 Subject: [PATCH] dashboards: api for retrieving uid by slug. #7883 --- pkg/api/api.go | 1 + pkg/api/dashboard.go | 15 +++++++ pkg/api/dashboard_test.go | 88 +++++++++++++++++++++++++++++++++++++++ pkg/models/dashboards.go | 6 +++ 4 files changed, 110 insertions(+) diff --git a/pkg/api/api.go b/pkg/api/api.go index 2d45868e58d..1c3036eccee 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -245,6 +245,7 @@ func (hs *HttpServer) registerRoutes() { dashboardRoute.Get("/uid/:uid", wrap(GetDashboard)) dashboardRoute.Get("/db/:slug", wrap(GetDashboard)) + dashboardRoute.Get("/db/:slug/uid", wrap(GetDashboardUidBySlug)) dashboardRoute.Delete("/db/:slug", reqEditorRole, wrap(DeleteDashboard)) dashboardRoute.Post("/calculate-diff", bind(dtos.CalculateDiffOptions{}), wrap(CalculateDashboardDiff)) diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index bfd53513feb..0c30fd54ee5 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -113,6 +113,21 @@ func GetDashboard(c *middleware.Context) Response { return Json(200, dto) } +func GetDashboardUidBySlug(c *middleware.Context) Response { + dash, rsp := getDashboardHelper(c.OrgId, c.Params(":slug"), 0, "") + if rsp != nil { + return rsp + } + + guardian := guardian.NewDashboardGuardian(dash.Id, c.OrgId, c.SignedInUser) + if canView, err := guardian.CanView(); err != nil || !canView { + fmt.Printf("%v", err) + return dashboardGuardianResponse(err) + } + + return Json(200, util.DynMap{"uid": dash.Uid}) +} + func getUserLogin(userId int64) string { query := m.GetUserByIdQuery{Id: userId} err := bus.Dispatch(&query) diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index cc718229f96..4255764d892 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -47,6 +47,11 @@ func TestDashboardApiEndpoint(t *testing.T) { return nil }) + bus.AddHandler("test", func(query *m.GetDashboardUidBySlugQuery) error { + query.Result = fakeDash.Uid + return nil + }) + viewerRole := m.ROLE_VIEWER editorRole := m.ROLE_EDITOR @@ -104,6 +109,14 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) + loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/db/child-dash/uid", "/api/dashboards/db/:slug/uid", role, func(sc *scenarioContext) { + uid := GetDashboardUidBySlugShouldReturn200(sc) + + Convey("Should return uid", func() { + So(uid, ShouldEqual, fakeDash.Uid) + }) + }) + loggedInUserScenarioWithRole("When calling DELETE on", "DELETE", "/api/dashboards/db/child-dash", "/api/dashboards/db/:slug", role, func(sc *scenarioContext) { CallDeleteDashboard(sc) So(sc.resp.Code, ShouldEqual, 403) @@ -160,6 +173,14 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) + loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/db/child-dash/uid", "/api/dashboards/db/:slug/uid", role, func(sc *scenarioContext) { + uid := GetDashboardUidBySlugShouldReturn200(sc) + + Convey("Should return uid", func() { + So(uid, ShouldEqual, fakeDash.Uid) + }) + }) + loggedInUserScenarioWithRole("When calling DELETE on", "DELETE", "/api/dashboards/db/child-dash", "/api/dashboards/db/:slug", role, func(sc *scenarioContext) { CallDeleteDashboard(sc) So(sc.resp.Code, ShouldEqual, 200) @@ -241,6 +262,11 @@ func TestDashboardApiEndpoint(t *testing.T) { return nil }) + bus.AddHandler("test", func(query *m.GetDashboardUidBySlugQuery) error { + query.Result = fakeDash.Uid + return nil + }) + bus.AddHandler("test", func(query *m.GetTeamsByUserQuery) error { query.Result = []*m.Team{} return nil @@ -284,6 +310,14 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) + loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/db/child-dash/uid", "/api/dashboards/db/:slug/uid", role, func(sc *scenarioContext) { + CallGetDashboardUidBySlug(sc) + + Convey("Should be denied access", func() { + So(sc.resp.Code, ShouldEqual, 403) + }) + }) + loggedInUserScenarioWithRole("When calling DELETE on", "DELETE", "/api/dashboards/db/child-dash", "/api/dashboards/db/:slug", role, func(sc *scenarioContext) { CallDeleteDashboard(sc) So(sc.resp.Code, ShouldEqual, 403) @@ -338,6 +372,14 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) + loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/db/child-dash/uid", "/api/dashboards/db/:slug/uid", role, func(sc *scenarioContext) { + CallGetDashboardUidBySlug(sc) + + Convey("Should be denied access", func() { + So(sc.resp.Code, ShouldEqual, 403) + }) + }) + loggedInUserScenarioWithRole("When calling DELETE on", "DELETE", "/api/dashboards/db/child-dash", "/api/dashboards/db/:slug", role, func(sc *scenarioContext) { CallDeleteDashboard(sc) So(sc.resp.Code, ShouldEqual, 403) @@ -403,6 +445,14 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) + loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/db/child-dash/uid", "/api/dashboards/db/:slug/uid", role, func(sc *scenarioContext) { + uid := GetDashboardUidBySlugShouldReturn200(sc) + + Convey("Should return uid", func() { + So(uid, ShouldEqual, fakeDash.Uid) + }) + }) + loggedInUserScenarioWithRole("When calling DELETE on", "DELETE", "/api/dashboards/db/child-dash", "/api/dashboards/db/:slug", role, func(sc *scenarioContext) { CallDeleteDashboard(sc) So(sc.resp.Code, ShouldEqual, 200) @@ -474,6 +524,14 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) + loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/db/child-dash/uid", "/api/dashboards/db/:slug/uid", role, func(sc *scenarioContext) { + uid := GetDashboardUidBySlugShouldReturn200(sc) + + Convey("Should return uid", func() { + So(uid, ShouldEqual, fakeDash.Uid) + }) + }) + loggedInUserScenarioWithRole("When calling DELETE on", "DELETE", "/api/dashboards/db/child-dash", "/api/dashboards/db/:slug", role, func(sc *scenarioContext) { CallDeleteDashboard(sc) So(sc.resp.Code, ShouldEqual, 403) @@ -524,6 +582,14 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) + loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/db/child-dash/uid", "/api/dashboards/db/:slug/uid", role, func(sc *scenarioContext) { + uid := GetDashboardUidBySlugShouldReturn200(sc) + + Convey("Should return uid", func() { + So(uid, ShouldEqual, fakeDash.Uid) + }) + }) + loggedInUserScenarioWithRole("When calling DELETE on", "DELETE", "/api/dashboards/db/child-dash", "/api/dashboards/db/:slug", role, func(sc *scenarioContext) { CallDeleteDashboard(sc) So(sc.resp.Code, ShouldEqual, 200) @@ -592,6 +658,14 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) + loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/db/child-dash/uid", "/api/dashboards/db/:slug/uid", role, func(sc *scenarioContext) { + uid := GetDashboardUidBySlugShouldReturn200(sc) + + Convey("Should return uid", func() { + So(uid, ShouldEqual, fakeDash.Uid) + }) + }) + loggedInUserScenarioWithRole("When calling DELETE on", "DELETE", "/api/dashboards/db/child-dash", "/api/dashboards/db/:slug", role, func(sc *scenarioContext) { CallDeleteDashboard(sc) So(sc.resp.Code, ShouldEqual, 403) @@ -632,6 +706,20 @@ func GetDashboardShouldReturn200(sc *scenarioContext) dtos.DashboardFullWithMeta return dash } +func GetDashboardUidBySlugShouldReturn200(sc *scenarioContext) string { + CallGetDashboardUidBySlug(sc) + + So(sc.resp.Code, ShouldEqual, 200) + + result := sc.ToJson() + return result.Get("uid").MustString() +} + +func CallGetDashboardUidBySlug(sc *scenarioContext) { + sc.handlerFunc = GetDashboardUidBySlug + sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec() +} + func CallGetDashboardVersion(sc *scenarioContext) { bus.AddHandler("test", func(query *m.GetDashboardVersionQuery) error { query.Result = &m.DashboardVersion{} diff --git a/pkg/models/dashboards.go b/pkg/models/dashboards.go index a858666a44e..0dfbd3b924f 100644 --- a/pkg/models/dashboards.go +++ b/pkg/models/dashboards.go @@ -219,3 +219,9 @@ type GetDashboardSlugByIdQuery struct { Id int64 Result string } + +type GetDashboardUidBySlugQuery struct { + OrgId int64 + Slug string + Result string +}