Added isStarred to search result hit, very inefficient loading right now but can be cached later on

This commit is contained in:
Torkel Ödegaard
2015-02-05 09:49:00 +01:00
parent 69e7279cff
commit 076905d14e
7 changed files with 45 additions and 30 deletions

Submodule grafana updated: ff47eccf4b...d5471c153a

View File

@@ -45,7 +45,6 @@ func Register(r *macaron.Macaron) {
r.Put("/", bind(m.UpdateUserCommand{}), UpdateUser)
r.Post("/using/:id", SetUsingAccount)
r.Get("/accounts", GetUserAccounts)
r.Get("/stars/", GetUserStars)
r.Post("/stars/dashboard/:id", StarDashboard)
r.Delete("/stars/dashboard/:id", UnstarDashboard)
})

View File

@@ -10,6 +10,26 @@ import (
"github.com/torkelo/grafana-pro/pkg/setting"
)
// TODO: this needs to be cached or improved somehow
func setIsStarredFlagOnSearchResults(c *middleware.Context, hits []*m.DashboardSearchHit) error {
if !c.IsSignedIn {
return nil
}
query := m.GetUserStarsQuery{UserId: c.UserId}
if err := bus.Dispatch(&query); err != nil {
return err
}
for _, dash := range hits {
if _, exists := query.Result[dash.Id]; exists {
dash.IsStarred = true
}
}
return nil
}
func Search(c *middleware.Context) {
queryText := c.Query("q")
starred := c.Query("starred")
@@ -20,6 +40,7 @@ func Search(c *middleware.Context) {
}
if strings.HasPrefix(queryText, "tags!:") {
query := m.GetDashboardTagsQuery{AccountId: c.AccountId}
err := bus.Dispatch(&query)
if err != nil {
@@ -28,7 +49,9 @@ func Search(c *middleware.Context) {
}
result.Tags = query.Result
result.TagsOnly = true
} else {
searchQueryRegEx, _ := regexp.Compile(`(tags:(\w*)\sAND\s)?(?:title:)?(.*)?`)
matches := searchQueryRegEx.FindStringSubmatch(queryText)
query := m.SearchDashboardsQuery{
@@ -38,12 +61,18 @@ func Search(c *middleware.Context) {
IsStarred: starred == "1",
AccountId: c.AccountId,
}
err := bus.Dispatch(&query)
if err != nil {
c.JsonApiErr(500, "Search failed", err)
return
}
if err := setIsStarredFlagOnSearchResults(c, query.Result); err != nil {
c.JsonApiErr(500, "Failed to get user stars", err)
return
}
result.Dashboards = query.Result
for _, dash := range result.Dashboards {
dash.Url = setting.AbsUrlTo("dashboard/db/" + dash.Slug)

View File

@@ -1,9 +1,6 @@
package api
import (
"strconv"
"github.com/torkelo/grafana-pro/pkg/api/dtos"
"github.com/torkelo/grafana-pro/pkg/bus"
"github.com/torkelo/grafana-pro/pkg/middleware"
m "github.com/torkelo/grafana-pro/pkg/models"
@@ -46,20 +43,3 @@ func UnstarDashboard(c *middleware.Context) {
c.JsonOK("Dashboard unstarred")
}
func GetUserStars(c *middleware.Context) {
query := m.GetUserStarsQuery{UserId: c.UserId}
if err := bus.Dispatch(&query); err != nil {
c.JsonApiErr(500, "Failed to get user stars", err)
return
}
var result dtos.UserStars
result.DashboardIds = make(map[string]bool)
for _, star := range query.Result {
result.DashboardIds[strconv.FormatInt(star.DashboardId, 10)] = true
}
c.JSON(200, &result)
}

View File

@@ -7,11 +7,12 @@ type SearchResult struct {
}
type DashboardSearchHit struct {
Id int64 `json:"id"`
Title string `json:"title"`
Slug string `json:"slug"`
Tags []string `json:"tags"`
Url string `json:"url"`
Id int64 `json:"id"`
Title string `json:"title"`
Slug string `json:"slug"`
Tags []string `json:"tags"`
Url string `json:"url"`
IsStarred bool `json:"isStarred"`
}
type DashboardTagCloudItem struct {

View File

@@ -29,7 +29,7 @@ type UnstarDashboardCommand struct {
type GetUserStarsQuery struct {
UserId int64
Result []Star
Result map[int64]bool // dashboard ids
}
type IsStarredByUserQuery struct {

View File

@@ -61,7 +61,13 @@ func UnstarDashboard(cmd *m.UnstarDashboardCommand) error {
}
func GetUserStars(query *m.GetUserStarsQuery) error {
query.Result = make([]m.Star, 0)
err := x.Where("user_id=?", query.UserId).Find(&query.Result)
var stars = make([]m.Star, 0)
err := x.Where("user_id=?", query.UserId).Find(&stars)
query.Result = make(map[int64]bool)
for _, star := range stars {
query.Result[star.DashboardId] = true
}
return err
}