playlist.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package api
  2. import (
  3. "errors"
  4. "github.com/grafana/grafana/pkg/bus"
  5. "github.com/grafana/grafana/pkg/log"
  6. "github.com/grafana/grafana/pkg/middleware"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "strconv"
  9. )
  10. func ValidateOrgPlaylist(c *middleware.Context) {
  11. id := c.ParamsInt64(":id")
  12. query := m.GetPlaylistByIdQuery{Id: id}
  13. err := bus.Dispatch(&query)
  14. if err != nil {
  15. c.JsonApiErr(404, "Playlist not found", err)
  16. return
  17. }
  18. if query.Result.OrgId != c.OrgId {
  19. c.JsonApiErr(403, "You are not allowed to edit/view playlist", nil)
  20. return
  21. }
  22. }
  23. func SearchPlaylists(c *middleware.Context) Response {
  24. query := c.Query("query")
  25. limit := c.QueryInt("limit")
  26. if limit == 0 {
  27. limit = 1000
  28. }
  29. searchQuery := m.PlaylistQuery{
  30. Title: query,
  31. Limit: limit,
  32. OrgId: c.OrgId,
  33. }
  34. err := bus.Dispatch(&searchQuery)
  35. if err != nil {
  36. return ApiError(500, "Search failed", err)
  37. }
  38. return Json(200, searchQuery.Result)
  39. }
  40. func GetPlaylist(c *middleware.Context) Response {
  41. id := c.ParamsInt64(":id")
  42. cmd := m.GetPlaylistByIdQuery{Id: id}
  43. if err := bus.Dispatch(&cmd); err != nil {
  44. return ApiError(500, "Playlist not found", err)
  45. }
  46. itemQuery := m.GetPlaylistItemsByIdQuery{PlaylistId: id}
  47. if err := bus.Dispatch(&itemQuery); err != nil {
  48. log.Warn("itemQuery failed: %v", err)
  49. return ApiError(500, "Playlist items not found", err)
  50. }
  51. playlistDTOs := make([]m.PlaylistItemDTO, 0)
  52. for _, item := range *itemQuery.Result {
  53. playlistDTOs = append(playlistDTOs, m.PlaylistItemDTO{
  54. Id: item.Id,
  55. PlaylistId: item.PlaylistId,
  56. Type: item.Type,
  57. Value: item.Value,
  58. Order: item.Order,
  59. })
  60. }
  61. dto := &m.PlaylistDTO{
  62. Id: cmd.Result.Id,
  63. Title: cmd.Result.Title,
  64. Timespan: cmd.Result.Timespan,
  65. OrgId: cmd.Result.OrgId,
  66. Items: playlistDTOs,
  67. }
  68. return Json(200, dto)
  69. }
  70. func LoadPlaylistItems(id int64) ([]m.PlaylistItem, error) {
  71. itemQuery := m.GetPlaylistItemsByIdQuery{PlaylistId: id}
  72. if err := bus.Dispatch(&itemQuery); err != nil {
  73. log.Warn("itemQuery failed: %v", err)
  74. return nil, errors.New("Playlist not found")
  75. }
  76. return *itemQuery.Result, nil
  77. }
  78. func LoadPlaylistDashboards(id int64) ([]m.PlaylistDashboardDto, error) {
  79. playlistItems, _ := LoadPlaylistItems(id)
  80. dashboardIds := make([]int64, 0)
  81. for _, i := range playlistItems {
  82. dashboardId, _ := strconv.ParseInt(i.Value, 10, 64)
  83. dashboardIds = append(dashboardIds, dashboardId)
  84. }
  85. if len(dashboardIds) == 0 {
  86. return make([]m.PlaylistDashboardDto, 0), nil
  87. }
  88. dashboardQuery := m.GetPlaylistDashboardsQuery{DashboardIds: dashboardIds}
  89. if err := bus.Dispatch(&dashboardQuery); err != nil {
  90. log.Warn("dashboardquery failed: %v", err)
  91. return nil, errors.New("Playlist not found")
  92. }
  93. dtos := make([]m.PlaylistDashboardDto, 0)
  94. for _, item := range *dashboardQuery.Result {
  95. dtos = append(dtos, m.PlaylistDashboardDto{
  96. Id: item.Id,
  97. Slug: item.Slug,
  98. Title: item.Title,
  99. Uri: "db/" + item.Slug,
  100. })
  101. }
  102. return dtos, nil
  103. }
  104. func GetPlaylistItems(c *middleware.Context) Response {
  105. id := c.ParamsInt64(":id")
  106. items, err := LoadPlaylistItems(id)
  107. if err != nil {
  108. return ApiError(500, "Could not load playlist items", err)
  109. }
  110. playlistDTOs := make([]m.PlaylistItemDTO, 0)
  111. for _, item := range items {
  112. playlistDTOs = append(playlistDTOs, m.PlaylistItemDTO{
  113. Id: item.Id,
  114. PlaylistId: item.PlaylistId,
  115. Type: item.Type,
  116. Value: item.Value,
  117. Order: item.Order,
  118. Title: item.Title,
  119. })
  120. }
  121. return Json(200, playlistDTOs)
  122. }
  123. func GetPlaylistDashboards(c *middleware.Context) Response {
  124. id := c.ParamsInt64(":id")
  125. playlists, err := LoadPlaylistDashboards(id)
  126. if err != nil {
  127. return ApiError(500, "Could not load dashboards", err)
  128. }
  129. return Json(200, playlists)
  130. }
  131. func DeletePlaylist(c *middleware.Context) Response {
  132. id := c.ParamsInt64(":id")
  133. cmd := m.DeletePlaylistQuery{Id: id}
  134. if err := bus.Dispatch(&cmd); err != nil {
  135. return ApiError(500, "Failed to delete playlist", err)
  136. }
  137. return Json(200, "")
  138. }
  139. func CreatePlaylist(c *middleware.Context, query m.CreatePlaylistQuery) Response {
  140. query.OrgId = c.OrgId
  141. err := bus.Dispatch(&query)
  142. if err != nil {
  143. return ApiError(500, "Failed to create playlist", err)
  144. }
  145. return Json(200, query.Result)
  146. }
  147. func UpdatePlaylist(c *middleware.Context, query m.UpdatePlaylistQuery) Response {
  148. err := bus.Dispatch(&query)
  149. if err != nil {
  150. return ApiError(500, "Failed to save playlist", err)
  151. }
  152. items, err := LoadPlaylistItems(query.Id)
  153. playlistDTOs := make([]m.PlaylistItemDTO, 0)
  154. for _, item := range items {
  155. playlistDTOs = append(playlistDTOs, m.PlaylistItemDTO{
  156. Id: item.Id,
  157. PlaylistId: item.PlaylistId,
  158. Type: item.Type,
  159. Value: item.Value,
  160. Order: item.Order,
  161. })
  162. }
  163. if err != nil {
  164. return ApiError(500, "Failed to save playlist", err)
  165. }
  166. query.Result.Items = playlistDTOs
  167. return Json(200, query.Result)
  168. }