dashboards.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. package models
  2. import (
  3. "errors"
  4. "strings"
  5. "time"
  6. "github.com/gosimple/slug"
  7. "github.com/grafana/grafana/pkg/components/simplejson"
  8. "github.com/grafana/grafana/pkg/util"
  9. )
  10. // Typed errors
  11. var (
  12. ErrDashboardNotFound = errors.New("Dashboard not found")
  13. ErrDashboardSnapshotNotFound = errors.New("Dashboard snapshot not found")
  14. ErrDashboardWithSameNameExists = errors.New("A dashboard with the same name already exists")
  15. ErrDashboardVersionMismatch = errors.New("The dashboard has been changed by someone else")
  16. ErrDashboardTitleEmpty = errors.New("Dashboard title cannot be empty")
  17. ErrDashboardFolderCannotHaveParent = errors.New("A Dashboard Folder cannot be added to another folder")
  18. ErrDashboardContainsInvalidAlertData = errors.New("Invalid alert data. Cannot save dashboard")
  19. ErrDashboardFailedToUpdateAlertData = errors.New("Failed to save alert data")
  20. )
  21. type UpdatePluginDashboardError struct {
  22. PluginId string
  23. }
  24. func (d UpdatePluginDashboardError) Error() string {
  25. return "Dashboard belong to plugin"
  26. }
  27. var (
  28. DashTypeJson = "file"
  29. DashTypeDB = "db"
  30. DashTypeScript = "script"
  31. DashTypeSnapshot = "snapshot"
  32. )
  33. // Dashboard model
  34. type Dashboard struct {
  35. Id int64
  36. Uid string
  37. Slug string
  38. OrgId int64
  39. GnetId int64
  40. Version int
  41. PluginId string
  42. Created time.Time
  43. Updated time.Time
  44. UpdatedBy int64
  45. CreatedBy int64
  46. FolderId int64
  47. IsFolder bool
  48. HasAcl bool
  49. Title string
  50. Data *simplejson.Json
  51. }
  52. // NewDashboard creates a new dashboard
  53. func NewDashboard(title string) *Dashboard {
  54. dash := &Dashboard{}
  55. dash.Uid, _ = util.GenerateShortUid()
  56. dash.Data = simplejson.New()
  57. dash.Data.Set("title", title)
  58. dash.Title = title
  59. dash.Created = time.Now()
  60. dash.Updated = time.Now()
  61. dash.UpdateSlug()
  62. return dash
  63. }
  64. // NewDashboardFolder creates a new dashboard folder
  65. func NewDashboardFolder(title string) *Dashboard {
  66. folder := NewDashboard(title)
  67. folder.Data.Set("schemaVersion", 16)
  68. folder.Data.Set("editable", true)
  69. folder.Data.Set("hideControls", true)
  70. return folder
  71. }
  72. // GetTags turns the tags in data json into go string array
  73. func (dash *Dashboard) GetTags() []string {
  74. return dash.Data.Get("tags").MustStringArray()
  75. }
  76. func NewDashboardFromJson(data *simplejson.Json) *Dashboard {
  77. dash := &Dashboard{}
  78. dash.Data = data
  79. dash.Title = dash.Data.Get("title").MustString()
  80. dash.UpdateSlug()
  81. if id, err := dash.Data.Get("id").Float64(); err == nil {
  82. dash.Id = int64(id)
  83. if version, err := dash.Data.Get("version").Float64(); err == nil {
  84. dash.Version = int(version)
  85. dash.Updated = time.Now()
  86. }
  87. } else {
  88. dash.Data.Set("version", 0)
  89. dash.Created = time.Now()
  90. dash.Updated = time.Now()
  91. }
  92. if gnetId, err := dash.Data.Get("gnetId").Float64(); err == nil {
  93. dash.GnetId = int64(gnetId)
  94. }
  95. if uid, err := dash.Data.Get("uid").String(); err == nil {
  96. dash.Uid = uid
  97. } else {
  98. dash.Uid, _ = util.GenerateShortUid()
  99. }
  100. return dash
  101. }
  102. // GetDashboardModel turns the command into the savable model
  103. func (cmd *SaveDashboardCommand) GetDashboardModel() *Dashboard {
  104. dash := NewDashboardFromJson(cmd.Dashboard)
  105. userId := cmd.UserId
  106. if userId == 0 {
  107. userId = -1
  108. }
  109. if dash.Data.Get("version").MustInt(0) == 0 {
  110. dash.CreatedBy = userId
  111. }
  112. dash.UpdatedBy = userId
  113. dash.OrgId = cmd.OrgId
  114. dash.PluginId = cmd.PluginId
  115. dash.IsFolder = cmd.IsFolder
  116. dash.FolderId = cmd.FolderId
  117. dash.UpdateSlug()
  118. return dash
  119. }
  120. // GetString a
  121. func (dash *Dashboard) GetString(prop string, defaultValue string) string {
  122. return dash.Data.Get(prop).MustString(defaultValue)
  123. }
  124. // UpdateSlug updates the slug
  125. func (dash *Dashboard) UpdateSlug() {
  126. title := dash.Data.Get("title").MustString()
  127. dash.Slug = SlugifyTitle(title)
  128. }
  129. func SlugifyTitle(title string) string {
  130. return slug.Make(strings.ToLower(title))
  131. }
  132. //
  133. // COMMANDS
  134. //
  135. type SaveDashboardCommand struct {
  136. Dashboard *simplejson.Json `json:"dashboard" binding:"Required"`
  137. UserId int64 `json:"userId"`
  138. Overwrite bool `json:"overwrite"`
  139. Message string `json:"message"`
  140. OrgId int64 `json:"-"`
  141. RestoredFrom int `json:"-"`
  142. PluginId string `json:"-"`
  143. FolderId int64 `json:"folderId"`
  144. IsFolder bool `json:"isFolder"`
  145. UpdatedAt time.Time
  146. Result *Dashboard
  147. }
  148. type DeleteDashboardCommand struct {
  149. Id int64
  150. OrgId int64
  151. }
  152. //
  153. // QUERIES
  154. //
  155. type GetDashboardQuery struct {
  156. Slug string // required if no Id or Uid is specified
  157. Id int64 // optional if slug is set
  158. Uid string // optional if slug is set
  159. OrgId int64
  160. Result *Dashboard
  161. }
  162. type DashboardTagCloudItem struct {
  163. Term string `json:"term"`
  164. Count int `json:"count"`
  165. }
  166. type GetDashboardTagsQuery struct {
  167. OrgId int64
  168. Result []*DashboardTagCloudItem
  169. }
  170. type GetDashboardsQuery struct {
  171. DashboardIds []int64
  172. Result []*Dashboard
  173. }
  174. type GetDashboardsByPluginIdQuery struct {
  175. OrgId int64
  176. PluginId string
  177. Result []*Dashboard
  178. }
  179. type GetDashboardSlugByIdQuery struct {
  180. Id int64
  181. Result string
  182. }