handlers.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package search
  2. import (
  3. "sort"
  4. "github.com/grafana/grafana/pkg/bus"
  5. m "github.com/grafana/grafana/pkg/models"
  6. )
  7. func Init() {
  8. bus.AddHandler("search", searchHandler)
  9. }
  10. func searchHandler(query *Query) error {
  11. hits := make(HitList, 0)
  12. dashQuery := FindPersistedDashboardsQuery{
  13. Title: query.Title,
  14. UserId: query.UserId,
  15. IsStarred: query.IsStarred,
  16. OrgId: query.OrgId,
  17. DashboardIds: query.DashboardIds,
  18. }
  19. if err := bus.Dispatch(&dashQuery); err != nil {
  20. return err
  21. }
  22. hits = append(hits, dashQuery.Result...)
  23. // filter out results with tag filter
  24. if len(query.Tags) > 0 {
  25. filtered := HitList{}
  26. for _, hit := range hits {
  27. if hasRequiredTags(query.Tags, hit.Tags) {
  28. filtered = append(filtered, hit)
  29. }
  30. }
  31. hits = filtered
  32. }
  33. // sort main result array
  34. sort.Sort(hits)
  35. if len(hits) > query.Limit {
  36. hits = hits[0:query.Limit]
  37. }
  38. // sort tags
  39. for _, hit := range hits {
  40. sort.Strings(hit.Tags)
  41. }
  42. // add isStarred info
  43. if err := setIsStarredFlagOnSearchResults(query.UserId, hits); err != nil {
  44. return err
  45. }
  46. query.Result = hits
  47. return nil
  48. }
  49. func stringInSlice(a string, list []string) bool {
  50. for _, b := range list {
  51. if b == a {
  52. return true
  53. }
  54. }
  55. return false
  56. }
  57. func hasRequiredTags(queryTags, hitTags []string) bool {
  58. for _, queryTag := range queryTags {
  59. if !stringInSlice(queryTag, hitTags) {
  60. return false
  61. }
  62. }
  63. return true
  64. }
  65. func setIsStarredFlagOnSearchResults(userId int64, hits []*Hit) error {
  66. query := m.GetUserStarsQuery{UserId: userId}
  67. if err := bus.Dispatch(&query); err != nil {
  68. return err
  69. }
  70. for _, dash := range hits {
  71. if _, exists := query.Result[dash.Id]; exists {
  72. dash.IsStarred = true
  73. }
  74. }
  75. return nil
  76. }