From 8f1afc99c6963c731be3969fbe245bf19a1cd611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 17 Jun 2020 11:26:23 +0200 Subject: [PATCH] PanelEdit: Redirects for old edit & view panel urls --- pkg/api/api.go | 5 +++-- pkg/middleware/dashboard_redirect.go | 27 +++++++++++++++++++++++ pkg/middleware/dashboard_redirect_test.go | 17 ++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index d2fd5dc499a5..9c2f20e00851 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -18,6 +18,7 @@ func (hs *HTTPServer) registerRoutes() { reqSnapshotPublicModeOrSignedIn := middleware.SnapshotPublicModeOrSignedIn() redirectFromLegacyDashboardURL := middleware.RedirectFromLegacyDashboardURL() redirectFromLegacyDashboardSoloURL := middleware.RedirectFromLegacyDashboardSoloURL() + redirectFromLegacyPanelEditURL := middleware.RedirectFromLegacyPanelEditURL() quota := middleware.Quota(hs.QuotaService) bind := binding.Bind @@ -65,8 +66,8 @@ func (hs *HTTPServer) registerRoutes() { r.Get("/plugins/:id/page/:page", reqSignedIn, hs.Index) r.Get("/a/:id/*", reqSignedIn, hs.Index) // App Root Page - r.Get("/d/:uid/:slug", reqSignedIn, hs.Index) - r.Get("/d/:uid", reqSignedIn, hs.Index) + r.Get("/d/:uid/:slug", reqSignedIn, redirectFromLegacyPanelEditURL, hs.Index) + r.Get("/d/:uid", reqSignedIn, redirectFromLegacyPanelEditURL, hs.Index) r.Get("/dashboard/db/:slug", reqSignedIn, redirectFromLegacyDashboardURL, hs.Index) r.Get("/dashboard/script/*", reqSignedIn, hs.Index) r.Get("/dashboard-solo/snapshot/*", hs.Index) diff --git a/pkg/middleware/dashboard_redirect.go b/pkg/middleware/dashboard_redirect.go index 2bf4da3c35bf..4f0b16df9943 100644 --- a/pkg/middleware/dashboard_redirect.go +++ b/pkg/middleware/dashboard_redirect.go @@ -34,6 +34,33 @@ func RedirectFromLegacyDashboardURL() macaron.Handler { } } +// In Grafana v7.0 we changed panel edit & view query parameters. +// This middleware tries to detect those old url parameters and direct to the new url query params +func RedirectFromLegacyPanelEditURL() macaron.Handler { + return func(c *models.ReqContext) { + queryParams := c.Req.URL.Query() + + panelId, hasPanelId := queryParams["panelId"] + _, hasFullscreen := queryParams["fullscreen"] + _, hasEdit := queryParams["edit"] + + if hasPanelId && hasFullscreen { + delete(queryParams, "panelId") + delete(queryParams, "fullscreen") + delete(queryParams, "edit") + + if hasEdit { + queryParams["editPanel"] = panelId + } else { + queryParams["viewPanel"] = panelId + } + + newURL := setting.ToAbsUrl(fmt.Sprintf("%s?%s", strings.TrimPrefix(c.Req.URL.Path, "/"), queryParams.Encode())) + c.Redirect(newURL, 301) + } + } +} + func RedirectFromLegacyDashboardSoloURL() macaron.Handler { return func(c *models.ReqContext) { slug := c.Params("slug") diff --git a/pkg/middleware/dashboard_redirect_test.go b/pkg/middleware/dashboard_redirect_test.go index 38115e373853..e2c35a2184ca 100644 --- a/pkg/middleware/dashboard_redirect_test.go +++ b/pkg/middleware/dashboard_redirect_test.go @@ -55,4 +55,21 @@ func TestMiddlewareDashboardRedirect(t *testing.T) { }) }) }) + + Convey("Given the dashboard legacy edit panel middleware", t, func() { + bus.ClearBusHandlers() + + middlewareScenario(t, "GET dashboard by legacy edit url", func(sc *scenarioContext) { + sc.m.Get("/d/:uid/:slug", RedirectFromLegacyPanelEditURL(), sc.defaultHandler) + + sc.fakeReqWithParams("GET", "/d/asd/dash?orgId=1&panelId=12&fullscreen&edit", map[string]string{}).exec() + + Convey("Should redirect to new dashboard edit url with a 301 Moved Permanently", func() { + So(sc.resp.Code, ShouldEqual, 301) + redirectURL, _ := sc.resp.Result().Location() + So(redirectURL.String(), ShouldEqual, "/d/asd/d/asd/dash?editPanel=12&orgId=1") + }) + }) + }) + }