package grafana import ( "context" "net/url" "strconv" "git.ar21.de/yolokube/grafana-backuper/pkg/grafana/schema" ) type ( SearchParam func(*url.Values) SearchType string ) const ( SearchTypeFolder SearchType = "dash-folder" SearchTypeDashboard SearchType = "dash-db" ) func WithType(searchType SearchType) SearchParam { return func(v *url.Values) { v.Set("type", string(searchType)) } } func WithQuery(query string) SearchParam { return func(v *url.Values) { if query != "" { v.Set("query", query) } } } func WithStarred() SearchParam { return func(v *url.Values) { v.Set("starred", strconv.FormatBool(true)) } } func WithTag(tag string) SearchParam { return func(v *url.Values) { if tag != "" { v.Add("tag", tag) } } } type SearchResult struct { ID uint UID string Title string URI string URL string Slug string Type string Tags []string IsStarred bool SortMeta uint FolderID int FolderUID string FolderTitle string FolderURL string } type SearchClient struct { client *Client } func (c *SearchClient) Search(ctx context.Context, params ...SearchParam) ([]*SearchResult, *Response, error) { searchURL, err := url.Parse("/search") if err != nil { return nil, nil, err } if len(params) > 0 { query := searchURL.Query() for _, param := range params { param(&query) } searchURL.RawQuery = query.Encode() } req, err := c.client.NewRequest(ctx, "GET", searchURL.String(), nil) if err != nil { return nil, nil, err } var body schema.SearchResultListResponse resp, err := c.client.Do(req, &body) if err != nil { return nil, resp, err } searchResults := make([]*SearchResult, 0, len(body.SearchResults)) for _, searchResult := range body.SearchResults { searchResults = append(searchResults, SearchResultFromSchema(searchResult)) } return searchResults, resp, nil }