@@ -116,6 +116,38 @@ func (r *Client) GetDashboardBySlug(ctx context.Context, slug string) (Board, Bo
116
116
return r .getDashboard (ctx , path )
117
117
}
118
118
119
+ // DashboardVersion represents a response from /api/dashboards/id/:dashboardId/versions API
120
+ type DashboardVersion struct {
121
+ ID uint `json:"id"`
122
+ DashboardID uint `json:"dashboardId"`
123
+ ParentVersion uint `json:"parentVersion"`
124
+ RestoredFrom uint `json:"restoredFrom"`
125
+ Version uint `json:"version"`
126
+ Created time.Time `json:"created"`
127
+ CreatedBy string `json:"createdBy"`
128
+ Message string `json:"message"`
129
+ }
130
+
131
+ // GetDashboardVersionsByDashboardID reflects /api/dashboards/id/:dashboardId/versions API call
132
+ func (r * Client ) GetDashboardVersionsByDashboardID (ctx context.Context , dashboardID uint , params ... QueryParam ) ([]DashboardVersion , error ) {
133
+ var (
134
+ raw []byte
135
+ code int
136
+ err error
137
+ )
138
+
139
+ if raw , code , err = r .get (ctx , fmt .Sprintf ("api/dashboards/id/%d/versions" , dashboardID ), queryParams (params ... )); err != nil {
140
+ return nil , err
141
+ }
142
+ if code != 200 {
143
+ return nil , fmt .Errorf ("HTTP error %d: returns %s" , code , raw )
144
+ }
145
+ var versions []DashboardVersion
146
+ err = json .Unmarshal (raw , & versions )
147
+
148
+ return versions , err
149
+ }
150
+
119
151
// getDashboard loads a dashboard from Grafana instance along with metadata for a dashboard.
120
152
// For dashboards from a filesystem set "file/" prefix for slug. By default dashboards from
121
153
// a database assumed. Database dashboards may have "db/" prefix or may have not, it will
@@ -396,8 +428,34 @@ type (
396
428
SearchParam func (* url.Values )
397
429
// SearchParamType is a type accepted by SearchType func.
398
430
SearchParamType string
431
+ // QueryParam is a type for specifying arbitrary API parameters
432
+ QueryParam func (* url.Values )
399
433
)
400
434
435
+ // queryParams returns url.Values built from multiple QueryParam
436
+ func queryParams (params ... QueryParam ) url.Values {
437
+ u := url.URL {}
438
+ q := u .Query ()
439
+ for _ , p := range params {
440
+ p (& q )
441
+ }
442
+ return q
443
+ }
444
+
445
+ // QueryParamStart sets `start` parameter
446
+ func QueryParamStart (start uint ) QueryParam {
447
+ return func (v * url.Values ) {
448
+ v .Set ("start" , strconv .Itoa (int (start )))
449
+ }
450
+ }
451
+
452
+ // QueryParamLimit sets `limit` parameter
453
+ func QueryParamLimit (limit uint ) QueryParam {
454
+ return func (v * url.Values ) {
455
+ v .Set ("limit" , strconv .Itoa (int (limit )))
456
+ }
457
+ }
458
+
401
459
// Search entities to be used with SearchType().
402
460
const (
403
461
SearchTypeFolder SearchParamType = "dash-folder"
0 commit comments