dashboard.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package api
  2. import (
  3. "regexp"
  4. "strings"
  5. "github.com/torkelo/grafana-pro/pkg/bus"
  6. "github.com/torkelo/grafana-pro/pkg/middleware"
  7. m "github.com/torkelo/grafana-pro/pkg/models"
  8. "github.com/torkelo/grafana-pro/pkg/utils"
  9. )
  10. func GetDashboard(c *middleware.Context) {
  11. slug := c.Params(":slug")
  12. query := m.GetDashboardQuery{Slug: slug, AccountId: c.GetAccountId()}
  13. err := bus.Dispatch(&query)
  14. if err != nil {
  15. c.JsonApiErr(404, "Dashboard not found", nil)
  16. return
  17. }
  18. query.Result.Data["id"] = query.Result.Id
  19. c.JSON(200, query.Result.Data)
  20. }
  21. func DeleteDashboard(c *middleware.Context) {
  22. slug := c.Params(":slug")
  23. query := m.GetDashboardQuery{Slug: slug, AccountId: c.GetAccountId()}
  24. err := bus.Dispatch(&query)
  25. if err != nil {
  26. c.JsonApiErr(404, "Dashboard not found", nil)
  27. return
  28. }
  29. cmd := m.DeleteDashboardCommand{Slug: slug, AccountId: c.GetAccountId()}
  30. err = bus.Dispatch(&cmd)
  31. if err != nil {
  32. c.JsonApiErr(500, "Failed to delete dashboard", err)
  33. return
  34. }
  35. var resp = map[string]interface{}{"title": query.Result.Title}
  36. c.JSON(200, resp)
  37. }
  38. func Search(c *middleware.Context) {
  39. queryText := c.Query("q")
  40. result := m.SearchResult{
  41. Dashboards: []*m.DashboardSearchHit{},
  42. Tags: []*m.DashboardTagCloudItem{},
  43. }
  44. if strings.HasPrefix(queryText, "tags!:") {
  45. query := m.GetDashboardTagsQuery{}
  46. err := bus.Dispatch(&query)
  47. if err != nil {
  48. c.JsonApiErr(500, "Failed to get tags from database", err)
  49. return
  50. }
  51. result.Tags = query.Result
  52. result.TagsOnly = true
  53. } else {
  54. searchQueryRegEx, _ := regexp.Compile(`(tags:(\w*)\sAND\s)?(?:title:)?(.*)?`)
  55. matches := searchQueryRegEx.FindStringSubmatch(queryText)
  56. query := m.SearchDashboardsQuery{
  57. Title: matches[3],
  58. Tag: matches[2],
  59. AccountId: c.GetAccountId(),
  60. }
  61. err := bus.Dispatch(&query)
  62. if err != nil {
  63. c.JsonApiErr(500, "Search failed", err)
  64. return
  65. }
  66. result.Dashboards = query.Result
  67. }
  68. c.JSON(200, result)
  69. }
  70. func PostDashboard(c *middleware.Context) {
  71. var cmd m.SaveDashboardCommand
  72. if !c.JsonBody(&cmd) {
  73. c.JsonApiErr(400, "bad request", nil)
  74. return
  75. }
  76. cmd.AccountId = c.GetAccountId()
  77. err := bus.Dispatch(&cmd)
  78. if err != nil {
  79. if err == m.ErrDashboardWithSameNameExists {
  80. c.JsonApiErr(400, "Dashboard with the same title already exists", nil)
  81. return
  82. }
  83. c.JsonApiErr(500, "Failed to save dashboard", err)
  84. return
  85. }
  86. c.JSON(200, utils.DynMap{"status": "success", "slug": cmd.Result.Slug})
  87. }