refactor(grafana): rework grafana package and make it more modular

This commit is contained in:
Tom Neuber 2024-06-23 02:37:22 +02:00
parent cfcf3c6c2b
commit 7ce90dacc4
Signed by: tom
GPG key ID: F17EFE4272D89FF6
12 changed files with 710 additions and 282 deletions

View file

@ -2,68 +2,30 @@ package grafana
import (
"context"
"encoding/json"
"fmt"
"net/url"
"strconv"
"git.ar21.de/yolokube/grafana-backuper/pkg/grafana/schema"
)
type (
SearchParam func(*url.Values)
SearchType string
)
const (
SearchTypeFolder SearchParamType = "dash-folder"
SearchTypeDashboard SearchParamType = "dash-db"
SearchTypeFolder SearchType = "dash-folder"
SearchTypeDashboard SearchType = "dash-db"
)
type FoundBoard struct {
ID uint `json:"id"`
UID string `json:"uid"`
Title string `json:"title"`
URI string `json:"uri"`
URL string `json:"url"`
Slug string `json:"slug"`
Type string `json:"type"`
Tags []string `json:"tags"`
IsStarred bool `json:"isStarred"`
FolderID int `json:"folderId"`
FolderUID string `json:"folderUid"`
FolderTitle string `json:"folderTitle"`
FolderURL string `json:"folderUrl"`
func WithType(searchType SearchType) SearchParam {
return func(v *url.Values) {
v.Set("type", string(searchType))
}
}
type (
// SearchParam is a type for specifying Search params.
SearchParam func(*url.Values)
// SearchParamType is a type accepted by SearchType func.
SearchParamType string
// QueryParam is a type for specifying arbitrary API parameters
QueryParam func(*url.Values)
)
func (c *Client) Search(ctx context.Context, params ...SearchParam) ([]FoundBoard, error) {
var (
raw []byte
boards []FoundBoard
code int
err error
)
u := url.URL{}
q := u.Query()
for _, p := range params {
p(&q)
}
if raw, code, err = c.get(ctx, "api/search", q); err != nil {
return nil, err
}
if code != 200 {
return nil, fmt.Errorf("HTTP error %d: returns %s", code, raw)
}
err = json.Unmarshal(raw, &boards)
return boards, err
}
func SearchQuery(query string) SearchParam {
func WithQuery(query string) SearchParam {
return func(v *url.Values) {
if query != "" {
v.Set("query", query)
@ -71,13 +33,13 @@ func SearchQuery(query string) SearchParam {
}
}
func SearchStarred(starred bool) SearchParam {
func WithStarred() SearchParam {
return func(v *url.Values) {
v.Set("starred", strconv.FormatBool(starred))
v.Set("starred", strconv.FormatBool(true))
}
}
func SearchTag(tag string) SearchParam {
func WithTag(tag string) SearchParam {
return func(v *url.Values) {
if tag != "" {
v.Add("tag", tag)
@ -85,8 +47,59 @@ func SearchTag(tag string) SearchParam {
}
}
func SearchType(searchType SearchParamType) SearchParam {
return func(v *url.Values) {
v.Set("type", string(searchType))
}
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
}