dashboards.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package models
  2. import (
  3. "errors"
  4. "strings"
  5. "time"
  6. "github.com/dalu/slug"
  7. )
  8. // Typed errors
  9. var (
  10. ErrDashboardNotFound = errors.New("Dashboard not found")
  11. ErrDashboardWithSameNameExists = errors.New("A dashboard with the same name already exists")
  12. ErrDashboardVersionMismatch = errors.New("The dashboard has been changed by someone else")
  13. )
  14. var (
  15. DashTypeJson = "file"
  16. DashTypeDB = "db"
  17. DashTypeScript = "script"
  18. )
  19. // Dashboard model
  20. type Dashboard struct {
  21. Id int64
  22. Slug string
  23. OrgId int64
  24. Version int
  25. Created time.Time
  26. Updated time.Time
  27. Title string
  28. Data map[string]interface{}
  29. }
  30. // NewDashboard creates a new dashboard
  31. func NewDashboard(title string) *Dashboard {
  32. dash := &Dashboard{}
  33. dash.Data = make(map[string]interface{})
  34. dash.Data["title"] = title
  35. dash.Title = title
  36. dash.UpdateSlug()
  37. return dash
  38. }
  39. // GetTags turns the tags in data json into go string array
  40. func (dash *Dashboard) GetTags() []string {
  41. jsonTags := dash.Data["tags"]
  42. if jsonTags == nil {
  43. return []string{}
  44. }
  45. arr := jsonTags.([]interface{})
  46. b := make([]string, len(arr))
  47. for i := range arr {
  48. b[i] = arr[i].(string)
  49. }
  50. return b
  51. }
  52. func NewDashboardFromJson(data map[string]interface{}) *Dashboard {
  53. dash := &Dashboard{}
  54. dash.Data = data
  55. dash.Title = dash.Data["title"].(string)
  56. dash.UpdateSlug()
  57. if dash.Data["id"] != nil {
  58. dash.Id = int64(dash.Data["id"].(float64))
  59. if dash.Data["version"] != nil {
  60. dash.Version = int(dash.Data["version"].(float64))
  61. }
  62. } else {
  63. dash.Data["version"] = 0
  64. }
  65. return dash
  66. }
  67. // GetDashboardModel turns the command into the savable model
  68. func (cmd *SaveDashboardCommand) GetDashboardModel() *Dashboard {
  69. dash := NewDashboardFromJson(cmd.Dashboard)
  70. dash.OrgId = cmd.OrgId
  71. dash.UpdateSlug()
  72. return dash
  73. }
  74. // GetString a
  75. func (dash *Dashboard) GetString(prop string) string {
  76. return dash.Data[prop].(string)
  77. }
  78. // UpdateSlug updates the slug
  79. func (dash *Dashboard) UpdateSlug() {
  80. title := strings.ToLower(dash.Data["title"].(string))
  81. dash.Slug = slug.Make(title)
  82. }
  83. //
  84. // COMMANDS
  85. //
  86. type SaveDashboardCommand struct {
  87. Dashboard map[string]interface{} `json:"dashboard" binding:"Required"`
  88. Overwrite bool `json:"overwrite"`
  89. OrgId int64 `json:"-"`
  90. Result *Dashboard
  91. }
  92. type DeleteDashboardCommand struct {
  93. Slug string
  94. OrgId int64
  95. }
  96. //
  97. // QUERIES
  98. //
  99. type GetDashboardQuery struct {
  100. Slug string
  101. OrgId int64
  102. Result *Dashboard
  103. }