diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 79e0e2b05cf..62f83d5dc43 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -116,13 +116,9 @@ func DeleteDashboard(c *middleware.Context) { } func PostDashboard(c *middleware.Context, cmd m.SaveDashboardCommand) Response { - cmd.OrgId = c.OrgId - if !c.IsSignedIn { - cmd.UserId = -1 - } else { - cmd.UserId = c.UserId - } + cmd.OrgId = c.OrgId + cmd.UserId = c.UserId dash := cmd.GetDashboardModel() // Check if Title is empty @@ -261,19 +257,16 @@ func GetDashboardFromJsonFile(c *middleware.Context) { // GetDashboardVersions returns all dashboard versions as JSON func GetDashboardVersions(c *middleware.Context) Response { dashboardId := c.ParamsInt64(":dashboardId") - orderBy := c.Query("orderBy") limit := c.QueryInt("limit") start := c.QueryInt("start") - if orderBy == "" { - orderBy = "version" - } + if limit == 0 { limit = 1000 } - query := m.GetDashboardVersionsCommand{ + query := m.GetDashboardVersionsQuery{ + OrgId: c.OrgId, DashboardId: dashboardId, - OrderBy: orderBy, Limit: limit, Start: start, } @@ -282,26 +275,6 @@ func GetDashboardVersions(c *middleware.Context) Response { return ApiError(404, fmt.Sprintf("No versions found for dashboardId %d", dashboardId), err) } - // // TODO(ben) use inner join with DTO - // dashboardVersions := make([]*m.DashboardVersionDTO, len(query.Result)) - // for i, dashboardVersion := range query.Result { - // creator := "Anonymous" - // if dashboardVersion.CreatedBy > 0 { - // creator = getUserLogin(dashboardVersion.CreatedBy) - // } - - // dashboardVersions[i] = &m.DashboardVersionDTO{ - // Id: dashboardVersion.Id, - // DashboardId: dashboardVersion.DashboardId, - // ParentVersion: dashboardVersion.ParentVersion, - // RestoredFrom: dashboardVersion.RestoredFrom, - // Version: dashboardVersion.Version, - // Created: dashboardVersion.Created, - // CreatedBy: creator, - // Message: dashboardVersion.Message, - // } - // } - return Json(200, query.Result) } @@ -310,16 +283,14 @@ func GetDashboardVersion(c *middleware.Context) Response { dashboardId := c.ParamsInt64(":dashboardId") version := c.ParamsInt(":id") - query := m.GetDashboardVersionCommand{ + query := m.GetDashboardVersionQuery{ + OrgId: c.OrgId, DashboardId: dashboardId, Version: version, } + if err := bus.Dispatch(&query); err != nil { - return ApiError( - 500, - fmt.Sprintf("Dashboard version %d not found for dashboardId %d", version, dashboardId), - err, - ) + return ApiError(500, fmt.Sprintf("Dashboard version %d not found for dashboardId %d", version, dashboardId), err) } creator := "Anonymous" @@ -360,6 +331,7 @@ func createCompareDashboardVersionCommand(c *middleware.Context) (m.CompareDashb } cmd.DashboardId = int64(dashboardId) + cmd.OrgId = c.OrgId cmd.Original = originalDash cmd.New = newDash return cmd, nil @@ -428,12 +400,9 @@ func CompareDashboardVersionsBasic(c *middleware.Context) Response { // RestoreDashboardVersion restores a dashboard to the given version. func RestoreDashboardVersion(c *middleware.Context, cmd m.RestoreDashboardVersionCommand) Response { - if !c.IsSignedIn { - return ApiError(401, "Must be signed in to restore a version", nil) - } - - cmd.UserId = c.UserId cmd.DashboardId = c.ParamsInt64(":dashboardId") + cmd.UserId = c.UserId + cmd.OrgId = c.OrgId if err := bus.Dispatch(&cmd); err != nil { return ApiError(500, "Cannot restore version", err) diff --git a/pkg/models/dashboard_version.go b/pkg/models/dashboard_version.go index fd375db951c..4d4a49fea63 100644 --- a/pkg/models/dashboard_version.go +++ b/pkg/models/dashboard_version.go @@ -29,9 +29,8 @@ type DashboardVersion struct { RestoredFrom int `json:"restoredFrom"` Version int `json:"version"` - Created time.Time `json:"created"` - - CreatedBy int64 `json:"createdBy"` + Created time.Time `json:"created"` + CreatedBy int64 `json:"createdBy"` Message string `json:"message"` Data *simplejson.Json `json:"data"` @@ -59,45 +58,47 @@ type DashboardVersionDTO struct { } // -// COMMANDS +// Queries // -// GetDashboardVersionCommand contains the data required to execute the -// sqlstore.GetDashboardVersionCommand, which returns the DashboardVersion for -// the given Version. -type GetDashboardVersionCommand struct { - DashboardId int64 `json:"dashboardId" binding:"Required"` - Version int `json:"version" binding:"Required"` +type GetDashboardVersionQuery struct { + DashboardId int64 + OrgId int64 + Version int Result *DashboardVersion } -// GetDashboardVersionsCommand contains the data required to execute the -// sqlstore.GetDashboardVersionsCommand, which returns all dashboard versions. -type GetDashboardVersionsCommand struct { - DashboardId int64 `json:"dashboardId" binding:"Required"` - OrderBy string `json:"orderBy"` - Limit int `json:"limit"` - Start int `json:"start"` +type GetDashboardVersionsQuery struct { + DashboardId int64 + OrgId int64 + Limit int + Start int Result []*DashboardVersionDTO } +// +// Commands +// + // RestoreDashboardVersionCommand creates a new dashboard version. type RestoreDashboardVersionCommand struct { DashboardId int64 `json:"dashboardId"` Version int `json:"version" binding:"Required"` UserId int64 `json:"-"` + OrgId int64 `json:"-"` Result *Dashboard } // CompareDashboardVersionsCommand is used to compare two versions. type CompareDashboardVersionsCommand struct { - DashboardId int64 `json:"dashboardId"` - Original int `json:"original" binding:"Required"` - New int `json:"new" binding:"Required"` - DiffType DiffType `json:"-"` + OrgId int64 + DashboardId int64 + Original int + New int + DiffType DiffType Delta []byte `json:"delta"` } diff --git a/pkg/models/dashboards.go b/pkg/models/dashboards.go index f0d00af380f..a6ebdd0220a 100644 --- a/pkg/models/dashboards.go +++ b/pkg/models/dashboards.go @@ -98,12 +98,17 @@ func NewDashboardFromJson(data *simplejson.Json) *Dashboard { // GetDashboardModel turns the command into the savable model func (cmd *SaveDashboardCommand) GetDashboardModel() *Dashboard { dash := NewDashboardFromJson(cmd.Dashboard) + userId := cmd.UserId - if dash.Data.Get("version").MustInt(0) == 0 { - dash.CreatedBy = cmd.UserId + if userId == 0 { + userId = -1 } - dash.UpdatedBy = cmd.UserId + if dash.Data.Get("version").MustInt(0) == 0 { + dash.CreatedBy = userId + } + + dash.UpdatedBy = userId dash.OrgId = cmd.OrgId dash.PluginId = cmd.PluginId dash.UpdateSlug() diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go index 7a02045d4fa..66b2e79b85d 100644 --- a/pkg/services/sqlstore/dashboard.go +++ b/pkg/services/sqlstore/dashboard.go @@ -70,24 +70,22 @@ func SaveDashboard(cmd *m.SaveDashboardCommand) error { } parentVersion := dash.Version - version, err := getMaxVersion(sess, dash.Id) - if err != nil { - return err - } - dash.Version = version - affectedRows := int64(0) + if dash.Id == 0 { metrics.M_Models_Dashboard_Insert.Inc(1) dash.Data.Set("version", dash.Version) affectedRows, err = sess.Insert(dash) } else { + dash.Version += 1 dash.Data.Set("version", dash.Version) affectedRows, err = sess.Id(dash.Id).Update(dash) } + if err != nil { return err } + if affectedRows == 0 { return m.ErrDashboardNotFound } @@ -102,11 +100,11 @@ func SaveDashboard(cmd *m.SaveDashboardCommand) error { Message: cmd.Message, Data: dash.Data, } - affectedRows, err = sess.Insert(dashVersion) - if err != nil { + + // insert version entry + if affectedRows, err = sess.Insert(dashVersion); err != nil { return err - } - if affectedRows == 0 { + } else if affectedRows == 0 { return m.ErrDashboardNotFound } diff --git a/pkg/services/sqlstore/dashboard_version.go b/pkg/services/sqlstore/dashboard_version.go index c3695dc778f..92bed305a7c 100644 --- a/pkg/services/sqlstore/dashboard_version.go +++ b/pkg/services/sqlstore/dashboard_version.go @@ -32,12 +32,12 @@ func init() { // CompareDashboardVersionsCommand computes the JSON diff of two versions, // assigning the delta of the diff to the `Delta` field. func CompareDashboardVersionsCommand(cmd *m.CompareDashboardVersionsCommand) error { - original, err := getDashboardVersion(cmd.DashboardId, cmd.Original) + original, err := getDashboardVersion(cmd.DashboardId, cmd.Original, cmd.OrgId) if err != nil { return err } - newDashboard, err := getDashboardVersion(cmd.DashboardId, cmd.New) + newDashboard, err := getDashboardVersion(cmd.DashboardId, cmd.New, cmd.OrgId) if err != nil { return err } @@ -79,8 +79,8 @@ func CompareDashboardVersionsCommand(cmd *m.CompareDashboardVersionsCommand) err // GetDashboardVersion gets the dashboard version for the given dashboard ID // and version number. -func GetDashboardVersion(query *m.GetDashboardVersionCommand) error { - result, err := getDashboardVersion(query.DashboardId, query.Version) +func GetDashboardVersion(query *m.GetDashboardVersionQuery) error { + result, err := getDashboardVersion(query.DashboardId, query.Version, query.OrgId) if err != nil { return err } @@ -90,12 +90,7 @@ func GetDashboardVersion(query *m.GetDashboardVersionCommand) error { } // GetDashboardVersions gets all dashboard versions for the given dashboard ID. -func GetDashboardVersions(query *m.GetDashboardVersionsCommand) error { - if query.OrderBy == "" { - query.OrderBy = "version" - } - query.OrderBy += " desc" - +func GetDashboardVersions(query *m.GetDashboardVersionsQuery) error { err := x.Table("dashboard_version"). Select(`dashboard_version.id, dashboard_version.dashboard_id, @@ -108,8 +103,9 @@ func GetDashboardVersions(query *m.GetDashboardVersionsCommand) error { dashboard_version.data, "user".login as created_by`). Join("LEFT", "user", `dashboard_version.created_by = "user".id`). - Where("dashboard_version.dashboard_id=?", query.DashboardId). - OrderBy("dashboard_version."+query.OrderBy). + Join("LEFT", "dashboard", `dashboard.id = "dashboard_version".dashboard_id`). + Where("dashboard_version.dashboard_id=? AND dashboard.org_id=?", query.DashboardId, query.OrgId). + OrderBy("dashboard_version.version DESC"). Limit(query.Limit, query.Start). Find(&query.Result) if err != nil { @@ -132,26 +128,21 @@ func RestoreDashboardVersion(cmd *m.RestoreDashboardVersionCommand) error { // session instead of using the global `x`, so we copy those functions // here, replacing `x` with `sess` dashboardVersion := m.DashboardVersion{} - has, err := sess.Where( - "dashboard_id=? AND version=?", - cmd.DashboardId, - cmd.Version, - ).Get(&dashboardVersion) + has, err := sess.Where("dashboard_id=? AND version=? AND org_id=?", cmd.DashboardId, cmd.Version, cmd.OrgId).Get(&dashboardVersion) if err != nil { return err } if !has { return m.ErrDashboardVersionNotFound } + dashboardVersion.Data.Set("id", dashboardVersion.DashboardId) - // get the dashboard version dashboard := m.Dashboard{Id: cmd.DashboardId} - has, err = sess.Get(&dashboard) - if err != nil { + // Get the dashboard version + if has, err = sess.Get(&dashboard); err != nil { return err - } - if has == false { + } else if !has { return m.ErrDashboardNotFound } @@ -166,11 +157,11 @@ func RestoreDashboardVersion(cmd *m.RestoreDashboardVersionCommand) error { dashboard.UpdatedBy = cmd.UserId dashboard.Version = version dashboard.Data.Set("version", dashboard.Version) - affectedRows, err := sess.Id(dashboard.Id).Update(dashboard) - if err != nil { + + // Update dashboard + if affectedRows, err := sess.Id(dashboard.Id).Update(dashboard); err != nil { return err - } - if affectedRows == 0 { + } else if affectedRows == 0 { return m.ErrDashboardNotFound } @@ -185,11 +176,10 @@ func RestoreDashboardVersion(cmd *m.RestoreDashboardVersionCommand) error { Message: "", Data: dashboard.Data, } - affectedRows, err = sess.Insert(dashVersion) - if err != nil { + + if affectedRows, err := sess.Insert(dashVersion); err != nil { return err - } - if affectedRows == 0 { + } else if affectedRows == 0 { return m.ErrDashboardNotFound } @@ -200,9 +190,9 @@ func RestoreDashboardVersion(cmd *m.RestoreDashboardVersionCommand) error { // getDashboardVersion is a helper function that gets the dashboard version for // the given dashboard ID and version ID. -func getDashboardVersion(dashboardId int64, version int) (*m.DashboardVersion, error) { +func getDashboardVersion(dashboardId int64, version int, orgId int64) (*m.DashboardVersion, error) { dashboardVersion := m.DashboardVersion{} - has, err := x.Where("dashboard_id=? AND version=?", dashboardId, version).Get(&dashboardVersion) + has, err := x.Where("dashboard_id=? AND version=? AND org_id=?", dashboardId, version, orgId).Get(&dashboardVersion) if err != nil { return nil, err } diff --git a/public/app/features/dashboard/dashboard_srv.ts b/public/app/features/dashboard/dashboard_srv.ts index 30ba7defdfd..205e7a8f9c6 100644 --- a/public/app/features/dashboard/dashboard_srv.ts +++ b/public/app/features/dashboard/dashboard_srv.ts @@ -34,7 +34,7 @@ export class DashboardSrv { yesText: "Save & Overwrite", icon: "fa-warning", onConfirm: () => { - this.saveDashboard({overwrite: true}, clone); + this.save(clone, {overwrite: true}); } }); } @@ -49,7 +49,7 @@ export class DashboardSrv { yesText: "Save & Overwrite", icon: "fa-warning", onConfirm: () => { - this.saveDashboard({overwrite: true}, clone); + this.save(clone, {overwrite: true}); } }); } @@ -68,7 +68,7 @@ export class DashboardSrv { this.showSaveAsModal(); }, onConfirm: () => { - this.saveDashboard({overwrite: true}, clone); + this.save(clone, {overwrite: true}); } }); } diff --git a/public/app/features/dashboard/history/history.html b/public/app/features/dashboard/history/history.html index 889a186021c..696265667dd 100644 --- a/public/app/features/dashboard/history/history.html +++ b/public/app/features/dashboard/history/history.html @@ -1,6 +1,6 @@

- Changelog + Version History