2019-10-11 17:08:15 +02:00
|
|
|
package search
|
|
|
|
|
|
|
|
|
|
import (
|
2021-10-27 14:57:06 +01:00
|
|
|
"context"
|
2020-04-27 14:16:03 +02:00
|
|
|
"sort"
|
|
|
|
|
|
2020-04-20 16:20:45 +02:00
|
|
|
"github.com/grafana/grafana/pkg/setting"
|
2019-10-11 17:08:15 +02:00
|
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/bus"
|
|
|
|
|
"github.com/grafana/grafana/pkg/models"
|
|
|
|
|
)
|
|
|
|
|
|
2021-08-25 15:11:22 +02:00
|
|
|
func ProvideService(cfg *setting.Cfg, bus bus.Bus) *SearchService {
|
|
|
|
|
s := &SearchService{
|
|
|
|
|
Cfg: cfg,
|
|
|
|
|
Bus: bus,
|
|
|
|
|
sortOptions: map[string]SortOption{
|
|
|
|
|
SortAlphaAsc.Name: SortAlphaAsc,
|
|
|
|
|
SortAlphaDesc.Name: SortAlphaDesc,
|
|
|
|
|
},
|
|
|
|
|
}
|
2022-01-27 10:33:02 +01:00
|
|
|
s.Bus.AddHandler(s.SearchHandler)
|
2021-08-25 15:11:22 +02:00
|
|
|
return s
|
2019-10-11 17:08:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Query struct {
|
|
|
|
|
Title string
|
|
|
|
|
Tags []string
|
|
|
|
|
OrgId int64
|
|
|
|
|
SignedInUser *models.SignedInUser
|
|
|
|
|
Limit int64
|
|
|
|
|
Page int64
|
|
|
|
|
IsStarred bool
|
|
|
|
|
Type string
|
|
|
|
|
DashboardIds []int64
|
|
|
|
|
FolderIds []int64
|
|
|
|
|
Permission models.PermissionType
|
2020-04-20 16:20:45 +02:00
|
|
|
Sort string
|
2019-10-11 17:08:15 +02:00
|
|
|
|
|
|
|
|
Result HitList
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type FindPersistedDashboardsQuery struct {
|
|
|
|
|
Title string
|
|
|
|
|
OrgId int64
|
|
|
|
|
SignedInUser *models.SignedInUser
|
|
|
|
|
IsStarred bool
|
|
|
|
|
DashboardIds []int64
|
|
|
|
|
Type string
|
|
|
|
|
FolderIds []int64
|
|
|
|
|
Tags []string
|
|
|
|
|
Limit int64
|
|
|
|
|
Page int64
|
|
|
|
|
Permission models.PermissionType
|
2021-02-11 08:49:16 +01:00
|
|
|
Sort SortOption
|
2019-10-11 17:08:15 +02:00
|
|
|
|
2020-05-06 11:42:52 +02:00
|
|
|
Filters []interface{}
|
2020-04-20 16:20:45 +02:00
|
|
|
|
2019-10-11 17:08:15 +02:00
|
|
|
Result HitList
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-04 13:41:15 +01:00
|
|
|
type Service interface {
|
|
|
|
|
SearchHandler(context.Context, *Query) error
|
|
|
|
|
SortOptions() []SortOption
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-11 17:08:15 +02:00
|
|
|
type SearchService struct {
|
2022-02-04 01:46:38 +08:00
|
|
|
Bus bus.Bus
|
|
|
|
|
Cfg *setting.Cfg
|
2020-04-20 16:20:45 +02:00
|
|
|
sortOptions map[string]SortOption
|
2019-10-11 17:08:15 +02:00
|
|
|
}
|
|
|
|
|
|
2022-01-27 10:33:02 +01:00
|
|
|
func (s *SearchService) SearchHandler(ctx context.Context, query *Query) error {
|
2020-04-27 14:16:03 +02:00
|
|
|
dashboardQuery := FindPersistedDashboardsQuery{
|
|
|
|
|
Title: query.Title,
|
|
|
|
|
SignedInUser: query.SignedInUser,
|
|
|
|
|
IsStarred: query.IsStarred,
|
|
|
|
|
DashboardIds: query.DashboardIds,
|
|
|
|
|
Type: query.Type,
|
|
|
|
|
FolderIds: query.FolderIds,
|
|
|
|
|
Tags: query.Tags,
|
|
|
|
|
Limit: query.Limit,
|
|
|
|
|
Page: query.Page,
|
|
|
|
|
Permission: query.Permission,
|
2020-04-20 16:20:45 +02:00
|
|
|
}
|
|
|
|
|
|
2020-04-27 14:16:03 +02:00
|
|
|
if sortOpt, exists := s.sortOptions[query.Sort]; exists {
|
2021-02-11 08:49:16 +01:00
|
|
|
dashboardQuery.Sort = sortOpt
|
2019-10-11 17:08:15 +02:00
|
|
|
}
|
|
|
|
|
|
2021-12-28 17:36:22 +01:00
|
|
|
if err := bus.Dispatch(ctx, &dashboardQuery); err != nil {
|
2019-10-11 17:08:15 +02:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-20 16:20:45 +02:00
|
|
|
hits := dashboardQuery.Result
|
|
|
|
|
if query.Sort == "" {
|
|
|
|
|
hits = sortedHits(hits)
|
|
|
|
|
}
|
2019-10-11 17:08:15 +02:00
|
|
|
|
2021-10-28 11:29:07 +02:00
|
|
|
if err := setStarredDashboards(ctx, query.SignedInUser.UserId, hits); err != nil {
|
2019-10-11 17:08:15 +02:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
query.Result = hits
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func sortedHits(unsorted HitList) HitList {
|
|
|
|
|
hits := make(HitList, 0)
|
|
|
|
|
hits = append(hits, unsorted...)
|
|
|
|
|
|
|
|
|
|
sort.Sort(hits)
|
|
|
|
|
|
|
|
|
|
for _, hit := range hits {
|
|
|
|
|
sort.Strings(hit.Tags)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return hits
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-28 11:29:07 +02:00
|
|
|
func setStarredDashboards(ctx context.Context, userID int64, hits []*Hit) error {
|
2019-10-11 17:08:15 +02:00
|
|
|
query := models.GetUserStarsQuery{
|
|
|
|
|
UserId: userID,
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-28 17:36:22 +01:00
|
|
|
if err := bus.Dispatch(ctx, &query); err != nil {
|
2019-10-11 17:08:15 +02:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, dashboard := range hits {
|
2021-02-11 08:49:16 +01:00
|
|
|
if _, ok := query.Result[dashboard.ID]; ok {
|
2019-10-11 17:08:15 +02:00
|
|
|
dashboard.IsStarred = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|