From a55a606a55fe62ba3d89e91dd6e6b47232c7b0c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 22 Dec 2014 12:25:08 +0100 Subject: [PATCH] Refactoring dashboard data access --- pkg/api/api_dashboard.go | 40 ++++---------- pkg/api/dtos/commands.go | 11 ---- pkg/models/dashboards.go | 39 ++++++++++---- pkg/stores/sqlstore/dashboards.go | 60 +++++++++++++++++++++ pkg/stores/sqlstore/sqlstore.go | 1 - pkg/stores/sqlstore/sqlstore_dashboards.go | 62 ---------------------- 6 files changed, 99 insertions(+), 114 deletions(-) delete mode 100644 pkg/api/dtos/commands.go create mode 100644 pkg/stores/sqlstore/dashboards.go delete mode 100644 pkg/stores/sqlstore/sqlstore_dashboards.go diff --git a/pkg/api/api_dashboard.go b/pkg/api/api_dashboard.go index b70d9c8b24d..cbbc79be612 100644 --- a/pkg/api/api_dashboard.go +++ b/pkg/api/api_dashboard.go @@ -1,16 +1,16 @@ package api import ( - "github.com/torkelo/grafana-pro/pkg/api/dtos" + "github.com/torkelo/grafana-pro/pkg/bus" "github.com/torkelo/grafana-pro/pkg/middleware" - "github.com/torkelo/grafana-pro/pkg/models" + m "github.com/torkelo/grafana-pro/pkg/models" "github.com/torkelo/grafana-pro/pkg/utils" ) func GetDashboard(c *middleware.Context) { slug := c.Params(":slug") - dash, err := models.GetDashboard(slug, c.GetAccountId()) + dash, err := m.GetDashboard(slug, c.GetAccountId()) if err != nil { c.JsonApiErr(404, "Dashboard not found", nil) return @@ -24,13 +24,13 @@ func GetDashboard(c *middleware.Context) { func DeleteDashboard(c *middleware.Context) { slug := c.Params(":slug") - dash, err := models.GetDashboard(slug, c.GetAccountId()) + dash, err := m.GetDashboard(slug, c.GetAccountId()) if err != nil { c.JsonApiErr(404, "Dashboard not found", nil) return } - err = models.DeleteDashboard(slug, c.GetAccountId()) + err = m.DeleteDashboard(slug, c.GetAccountId()) if err != nil { c.JsonApiErr(500, "Failed to delete dashboard", err) return @@ -44,7 +44,7 @@ func DeleteDashboard(c *middleware.Context) { func Search(c *middleware.Context) { query := c.Query("q") - results, err := models.SearchQuery(query, c.GetAccountId()) + results, err := m.SearchQuery(query, c.GetAccountId()) if err != nil { c.JsonApiErr(500, "Search failed", err) return @@ -53,39 +53,21 @@ func Search(c *middleware.Context) { c.JSON(200, results) } -func convertToStringArray(arr []interface{}) []string { - b := make([]string, len(arr)) - for i := range arr { - b[i] = arr[i].(string) - } - - return b -} - func PostDashboard(c *middleware.Context) { - var command dtos.SaveDashboardCommand + var cmd m.SaveDashboardCommand - if !c.JsonBody(&command) { + if !c.JsonBody(&cmd) { c.JsonApiErr(400, "bad request", nil) return } - dashboard := models.NewDashboard("test") - dashboard.Data = command.Dashboard - dashboard.Title = dashboard.Data["title"].(string) - dashboard.AccountId = c.GetAccountId() - dashboard.Tags = convertToStringArray(dashboard.Data["tags"].([]interface{})) - dashboard.UpdateSlug() + cmd.AccountId = c.GetAccountId() - if dashboard.Data["id"] != nil { - dashboard.Id = int64(dashboard.Data["id"].(float64)) - } - - err := models.SaveDashboard(dashboard) + err := bus.Dispatch(cmd) if err != nil { c.JsonApiErr(500, "Failed to save dashboard", err) return } - c.JSON(200, utils.DynMap{"status": "success", "slug": dashboard.Slug}) + c.JSON(200, utils.DynMap{"status": "success", "slug": cmd.Result.Slug}) } diff --git a/pkg/api/dtos/commands.go b/pkg/api/dtos/commands.go deleted file mode 100644 index 6770a3cbefd..00000000000 --- a/pkg/api/dtos/commands.go +++ /dev/null @@ -1,11 +0,0 @@ -package dtos - -type AddCollaboratorCommand struct { - Email string `json:"email" binding:"required"` -} - -type SaveDashboardCommand struct { - Id string `json:"id"` - Title string `json:"title"` - Dashboard map[string]interface{} `json:"dashboard"` -} diff --git a/pkg/models/dashboards.go b/pkg/models/dashboards.go index 54d033afaa3..ac8140fc656 100644 --- a/pkg/models/dashboards.go +++ b/pkg/models/dashboards.go @@ -1,9 +1,7 @@ package models import ( - "encoding/json" "errors" - "io" "regexp" "strings" "time" @@ -11,7 +9,6 @@ import ( var ( GetDashboard func(slug string, accountId int64) (*Dashboard, error) - SaveDashboard func(dash *Dashboard) error DeleteDashboard func(slug string, accountId int64) error SearchQuery func(query string, acccountId int64) ([]*SearchResult, error) ) @@ -40,26 +37,46 @@ type SearchResult struct { Slug string `json:"slug"` } +type SaveDashboardCommand struct { + Id string `json:"id"` + Title string `json:"title"` + Dashboard map[string]interface{} `json:"dashboard"` + AccountId int64 `json:"-"` + + Result *Dashboard +} + +func convertToStringArray(arr []interface{}) []string { + b := make([]string, len(arr)) + for i := range arr { + b[i] = arr[i].(string) + } + + return b +} + func NewDashboard(title string) *Dashboard { dash := &Dashboard{} - dash.Id = 0 dash.Data = make(map[string]interface{}) dash.Data["title"] = title dash.Title = title dash.UpdateSlug() - return dash } -func NewFromJson(reader io.Reader) (*Dashboard, error) { - dash := NewDashboard("temp") - jsonParser := json.NewDecoder(reader) +func (cmd *SaveDashboardCommand) GetDashboardModel() *Dashboard { + dash := &Dashboard{} + dash.Data = cmd.Dashboard + dash.Title = dash.Data["title"].(string) + dash.AccountId = cmd.AccountId + dash.Tags = convertToStringArray(dash.Data["tags"].([]interface{})) + dash.UpdateSlug() - if err := jsonParser.Decode(&dash.Data); err != nil { - return nil, err + if dash.Data["id"] != nil { + dash.Id = int64(dash.Data["id"].(float64)) } - return dash, nil + return dash } func (dash *Dashboard) GetString(prop string) string { diff --git a/pkg/stores/sqlstore/dashboards.go b/pkg/stores/sqlstore/dashboards.go new file mode 100644 index 00000000000..21bf1dbb357 --- /dev/null +++ b/pkg/stores/sqlstore/dashboards.go @@ -0,0 +1,60 @@ +package sqlstore + +import ( + "github.com/go-xorm/xorm" + "github.com/torkelo/grafana-pro/pkg/bus" + m "github.com/torkelo/grafana-pro/pkg/models" +) + +func init() { + bus.AddHandler("sql", SaveDashboard2) +} + +func SaveDashboard2(cmd *m.SaveDashboardCommand) error { + return inTransaction(func(sess *xorm.Session) error { + dash := cmd.GetDashboardModel() + + var err error + if dash.Id == 0 { + _, err = sess.Insert(dash) + } else { + _, err = sess.Id(dash.Id).Update(dash) + } + + cmd.Result = dash + + return err + }) +} + +func GetDashboard(slug string, accountId int64) (*m.Dashboard, error) { + dashboard := m.Dashboard{Slug: slug, AccountId: accountId} + has, err := x.Get(&dashboard) + if err != nil { + return nil, err + } else if has == false { + return nil, m.ErrDashboardNotFound + } + + return &dashboard, nil +} + +func SearchQuery(query string, accountId int64) ([]*m.SearchResult, error) { + sess := x.Limit(100, 0).Where("account_id=?", accountId) + sess.Table("Dashboard") + + results := make([]*m.SearchResult, 0) + err := sess.Find(&results) + + return results, err +} + +func DeleteDashboard(slug string, accountId int64) error { + sess := x.NewSession() + defer sess.Close() + + rawSql := "DELETE FROM Dashboard WHERE account_id=? and slug=?" + _, err := sess.Exec(rawSql, accountId, slug) + + return err +} diff --git a/pkg/stores/sqlstore/sqlstore.go b/pkg/stores/sqlstore/sqlstore.go index ff868955ae4..43aad899417 100644 --- a/pkg/stores/sqlstore/sqlstore.go +++ b/pkg/stores/sqlstore/sqlstore.go @@ -36,7 +36,6 @@ func init() { func Init() { m.GetDashboard = GetDashboard - m.SaveDashboard = SaveDashboard m.SearchQuery = SearchQuery m.DeleteDashboard = DeleteDashboard } diff --git a/pkg/stores/sqlstore/sqlstore_dashboards.go b/pkg/stores/sqlstore/sqlstore_dashboards.go deleted file mode 100644 index 9beaaef3a66..00000000000 --- a/pkg/stores/sqlstore/sqlstore_dashboards.go +++ /dev/null @@ -1,62 +0,0 @@ -package sqlstore - -import "github.com/torkelo/grafana-pro/pkg/models" - -func SaveDashboard(dash *models.Dashboard) error { - var err error - - sess := x.NewSession() - defer sess.Close() - - if err = sess.Begin(); err != nil { - return err - } - - if dash.Id == 0 { - _, err = sess.Insert(dash) - } else { - _, err = sess.Id(dash.Id).Update(dash) - } - - if err != nil { - sess.Rollback() - return err - } else if err = sess.Commit(); err != nil { - return err - } - - return nil -} - -func GetDashboard(slug string, accountId int64) (*models.Dashboard, error) { - - dashboard := models.Dashboard{Slug: slug, AccountId: accountId} - has, err := x.Get(&dashboard) - if err != nil { - return nil, err - } else if has == false { - return nil, models.ErrDashboardNotFound - } - - return &dashboard, nil -} - -func SearchQuery(query string, accountId int64) ([]*models.SearchResult, error) { - sess := x.Limit(100, 0).Where("account_id=?", accountId) - sess.Table("Dashboard") - - results := make([]*models.SearchResult, 0) - err := sess.Find(&results) - - return results, err -} - -func DeleteDashboard(slug string, accountId int64) error { - sess := x.NewSession() - defer sess.Close() - - rawSql := "DELETE FROM Dashboard WHERE account_id=? and slug=?" - _, err := sess.Exec(rawSql, accountId, slug) - - return err -}