dashboards.go 5.4 KB

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