func PostDashboard(c *middleware.Context, cmd m.SaveDashboardCommand) { cmd.OrgId = c.OrgId dash := cmd.GetDashboardModel() if dash.Id == 0 { limitReached, err := middleware.QuotaReached(c, "dashboard") if err != nil { c.JsonApiErr(500, "failed to get quota", err) return } if limitReached { c.JsonApiErr(403, "Quota reached", nil) return } } err := bus.Dispatch(&cmd) if err != nil { if err == m.ErrDashboardWithSameNameExists { c.JSON(412, util.DynMap{"status": "name-exists", "message": err.Error()}) return } if err == m.ErrDashboardVersionMismatch { c.JSON(412, util.DynMap{"status": "version-mismatch", "message": err.Error()}) return } if err == m.ErrDashboardNotFound { c.JSON(404, util.DynMap{"status": "not-found", "message": err.Error()}) return } c.JsonApiErr(500, "Failed to save dashboard", err) return } metrics.M_Api_Dashboard_Post.Inc(1) c.JSON(200, util.DynMap{"status": "success", "slug": cmd.Result.Slug, "version": cmd.Result.Version}) }
func SaveDashboard(cmd *m.SaveDashboardCommand) error { return inTransaction(func(sess *xorm.Session) error { dash := cmd.GetDashboardModel() // try get existing dashboard var existing, sameTitle m.Dashboard if dash.Id > 0 { dashWithIdExists, err := sess.Where("id=? AND org_id=?", dash.Id, dash.OrgId).Get(&existing) if err != nil { return err } if !dashWithIdExists { return m.ErrDashboardNotFound } // check for is someone else has written in between if dash.Version != existing.Version { if cmd.Overwrite { dash.Version = existing.Version } else { return m.ErrDashboardVersionMismatch } } } sameTitleExists, err := sess.Where("org_id=? AND slug=?", dash.OrgId, dash.Slug).Get(&sameTitle) if err != nil { return err } if sameTitleExists { // another dashboard with same name if dash.Id != sameTitle.Id { if cmd.Overwrite { dash.Id = sameTitle.Id } else { return m.ErrDashboardWithSameNameExists } } } affectedRows := int64(0) if dash.Id == 0 { metrics.M_Models_Dashboard_Insert.Inc(1) affectedRows, err = sess.Insert(dash) } else { dash.Version += 1 dash.Data["version"] = dash.Version affectedRows, err = sess.Id(dash.Id).Update(dash) } if affectedRows == 0 { return m.ErrDashboardNotFound } // delete existing tabs _, err = sess.Exec("DELETE FROM dashboard_tag WHERE dashboard_id=?", dash.Id) if err != nil { return err } // insert new tags tags := dash.GetTags() if len(tags) > 0 { for _, tag := range tags { if _, err := sess.Insert(&DashboardTag{DashboardId: dash.Id, Term: tag}); err != nil { return err } } } cmd.Result = dash return err }) }