From 3bbb889768c5191051d8af3581348d30bbc0beb3 Mon Sep 17 00:00:00 2001 From: Daria Danilenko Date: Tue, 28 Mar 2023 12:32:37 +0200 Subject: [PATCH] Add full metadata for versions query too --- pkg/api/dashboard.go | 71 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 6 deletions(-) diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 62da8b2f0e4a..677b1d558305 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -703,10 +703,10 @@ func (hs *HTTPServer) GetDashboardVersions(c *models.ReqContext) response.Respon // 500: internalServerError func (hs *HTTPServer) GetDashboardVersion(c *models.ReqContext) response.Response { var dashID int64 - var err error - dashUID := web.Params(c.Req)[":uid"] + var dash *models.Dashboard + dashUID := web.Params(c.Req)[":uid"] if dashUID == "" { dashID, err = strconv.ParseInt(web.Params(c.Req)[":dashboardId"], 10, 64) if err != nil { @@ -721,12 +721,20 @@ func (hs *HTTPServer) GetDashboardVersion(c *models.ReqContext) response.Respons return response.Error(http.StatusBadRequest, "failed to get dashboard by UID", err) } dashID = q.Result.Id + dash = q.Result } guardian := guardian.New(c.Req.Context(), dashID, c.OrgID, c.SignedInUser) - if canSave, err := guardian.CanSave(); err != nil || !canSave { + canSave := true + if canSave, err = guardian.CanSave(); err != nil || !canSave { return dashboardGuardianResponse(err) } + if canView, err := guardian.CanView(); err != nil || !canView { + return dashboardGuardianResponse(err) + } + canEdit, _ := guardian.CanEdit() + canAdmin, _ := guardian.CanAdmin() + canDelete, _ := guardian.CanDelete() version, _ := strconv.ParseInt(web.Params(c.Req)[":id"], 10, 32) query := dashver.GetDashboardVersionQuery{ @@ -745,10 +753,61 @@ func (hs *HTTPServer) GetDashboardVersion(c *models.ReqContext) response.Respons creator = hs.getUserLogin(c.Req.Context(), res.CreatedBy) } + annotationPermissions := &dtos.AnnotationPermission{} + if !hs.AccessControl.IsDisabled() { + hs.getAnnotationPermissionsByScope(c, &annotationPermissions.Dashboard, accesscontrol.ScopeAnnotationsTypeDashboard) + hs.getAnnotationPermissionsByScope(c, &annotationPermissions.Organization, accesscontrol.ScopeAnnotationsTypeOrganization) + } + + hasPublicDashboard := false + publicDashboardEnabled := false + // If public dashboards is enabled and we have a public dashboard, update meta values + if hs.Features.IsEnabled(featuremgmt.FlagPublicDashboards) { + publicDashboard, err := hs.PublicDashboardsApi.PublicDashboardService.FindByDashboardUid(c.Req.Context(), c.OrgID, dash.Uid) + if err != nil && !errors.Is(err, publicdashboardModels.ErrPublicDashboardNotFound) { + return response.Error(500, "Error while retrieving public dashboards", err) + } + if publicDashboard != nil { + hasPublicDashboard = true + publicDashboardEnabled = publicDashboard.IsEnabled + } + } + meta := dtos.DashboardMeta{ - Type: models.DashTypeDB, - CreatedBy: creator, - Version: res.Version, + Slug: dash.Slug, + Type: models.DashTypeDB, + CanStar: c.IsSignedIn, + CanSave: canSave, + CanEdit: canEdit, + CanAdmin: canAdmin, + CanDelete: canDelete, + Created: dash.Created, + Updated: dash.Updated, + UpdatedBy: "Someone", + CreatedBy: creator, + Version: dash.Version, + HasACL: dash.HasACL, + IsFolder: dash.IsFolder, + FolderId: dash.FolderId, + Url: dash.GetUrl(), + FolderTitle: "General", + AnnotationsPermissions: annotationPermissions, + PublicDashboardEnabled: publicDashboardEnabled, + HasPublicDashboard: hasPublicDashboard, + } + + // lookup folder title + if dash.FolderId > 0 { + query := models.GetDashboardQuery{Id: dash.FolderId, OrgId: c.OrgID} + if err := hs.DashboardService.GetDashboard(c.Req.Context(), &query); err != nil { + if errors.Is(err, dashboards.ErrFolderNotFound) { + return response.Error(404, "Folder not found", err) + } + return response.Error(500, "Dashboard folder could not be read", err) + } + meta.FolderUid = query.Result.Uid + meta.FolderTitle = query.Result.Title + meta.FolderUrl = query.Result.GetUrl() } dto := dtos.DashboardFullWithMeta{