grafana-backuper/pkg/grafana/search.go

106 lines
1.9 KiB
Go
Raw Normal View History

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"
)
2024-06-19 22:07:51 +02:00
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
}