mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			143 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
| package api
 | |
| 
 | |
| import (
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/grafana/grafana/pkg/api/dtos"
 | |
| 	"github.com/grafana/grafana/pkg/bus"
 | |
| 	"github.com/grafana/grafana/pkg/metrics"
 | |
| 	"github.com/grafana/grafana/pkg/middleware"
 | |
| 	m "github.com/grafana/grafana/pkg/models"
 | |
| 	"github.com/grafana/grafana/pkg/setting"
 | |
| 	"github.com/grafana/grafana/pkg/util"
 | |
| )
 | |
| 
 | |
| func GetSharingOptions(c *middleware.Context) {
 | |
| 	c.JSON(200, util.DynMap{
 | |
| 		"externalSnapshotURL":  setting.ExternalSnapshotUrl,
 | |
| 		"externalSnapshotName": setting.ExternalSnapshotName,
 | |
| 		"externalEnabled":      setting.ExternalEnabled,
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func CreateDashboardSnapshot(c *middleware.Context, cmd m.CreateDashboardSnapshotCommand) {
 | |
| 	if cmd.Name == "" {
 | |
| 		cmd.Name = "Unnamed snapshot"
 | |
| 	}
 | |
| 
 | |
| 	if cmd.External {
 | |
| 		// external snapshot ref requires key and delete key
 | |
| 		if cmd.Key == "" || cmd.DeleteKey == "" {
 | |
| 			c.JsonApiErr(400, "Missing key and delete key for external snapshot", nil)
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		cmd.OrgId = -1
 | |
| 		cmd.UserId = -1
 | |
| 		metrics.M_Api_Dashboard_Snapshot_External.Inc(1)
 | |
| 	} else {
 | |
| 		cmd.Key = util.GetRandomString(32)
 | |
| 		cmd.DeleteKey = util.GetRandomString(32)
 | |
| 		cmd.OrgId = c.OrgId
 | |
| 		cmd.UserId = c.UserId
 | |
| 		metrics.M_Api_Dashboard_Snapshot_Create.Inc(1)
 | |
| 	}
 | |
| 
 | |
| 	if err := bus.Dispatch(&cmd); err != nil {
 | |
| 		c.JsonApiErr(500, "Failed to create snaphost", err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	c.JSON(200, util.DynMap{
 | |
| 		"key":       cmd.Key,
 | |
| 		"deleteKey": cmd.DeleteKey,
 | |
| 		"url":       setting.ToAbsUrl("dashboard/snapshot/" + cmd.Key),
 | |
| 		"deleteUrl": setting.ToAbsUrl("api/snapshots-delete/" + cmd.DeleteKey),
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func GetDashboardSnapshot(c *middleware.Context) {
 | |
| 	key := c.Params(":key")
 | |
| 	query := &m.GetDashboardSnapshotQuery{Key: key}
 | |
| 
 | |
| 	err := bus.Dispatch(query)
 | |
| 	if err != nil {
 | |
| 		c.JsonApiErr(500, "Failed to get dashboard snapshot", err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	snapshot := query.Result
 | |
| 
 | |
| 	// expired snapshots should also be removed from db
 | |
| 	if snapshot.Expires.Before(time.Now()) {
 | |
| 		c.JsonApiErr(404, "Dashboard snapshot not found", err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	dto := dtos.DashboardFullWithMeta{
 | |
| 		Dashboard: snapshot.Dashboard,
 | |
| 		Meta: dtos.DashboardMeta{
 | |
| 			Type:       m.DashTypeSnapshot,
 | |
| 			IsSnapshot: true,
 | |
| 			Created:    snapshot.Created,
 | |
| 			Expires:    snapshot.Expires,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	metrics.M_Api_Dashboard_Snapshot_Get.Inc(1)
 | |
| 
 | |
| 	c.Resp.Header().Set("Cache-Control", "public, max-age=3600")
 | |
| 	c.JSON(200, dto)
 | |
| }
 | |
| 
 | |
| func DeleteDashboardSnapshot(c *middleware.Context) {
 | |
| 	key := c.Params(":key")
 | |
| 	cmd := &m.DeleteDashboardSnapshotCommand{DeleteKey: key}
 | |
| 
 | |
| 	if err := bus.Dispatch(cmd); err != nil {
 | |
| 		c.JsonApiErr(500, "Failed to delete dashboard snapshot", err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	c.JSON(200, util.DynMap{"message": "Snapshot deleted. It might take an hour before it's cleared from a CDN cache."})
 | |
| }
 | |
| 
 | |
| func SearchDashboardSnapshots(c *middleware.Context) Response {
 | |
| 	query := c.Query("query")
 | |
| 	limit := c.QueryInt("limit")
 | |
| 
 | |
| 	if limit == 0 {
 | |
| 		limit = 1000
 | |
| 	}
 | |
| 
 | |
| 	searchQuery := m.GetDashboardSnapshotsQuery{
 | |
| 		Name:  query,
 | |
| 		Limit: limit,
 | |
| 		OrgId: c.OrgId,
 | |
| 	}
 | |
| 
 | |
| 	err := bus.Dispatch(&searchQuery)
 | |
| 	if err != nil {
 | |
| 		return ApiError(500, "Search failed", err)
 | |
| 	}
 | |
| 
 | |
| 	dtos := make([]*m.DashboardSnapshotDTO, len(searchQuery.Result))
 | |
| 	for i, snapshot := range searchQuery.Result {
 | |
| 		dtos[i] = &m.DashboardSnapshotDTO{
 | |
| 			Id:          snapshot.Id,
 | |
| 			Name:        snapshot.Name,
 | |
| 			Key:         snapshot.Key,
 | |
| 			DeleteKey:   snapshot.DeleteKey,
 | |
| 			OrgId:       snapshot.OrgId,
 | |
| 			UserId:      snapshot.UserId,
 | |
| 			External:    snapshot.External,
 | |
| 			ExternalUrl: snapshot.ExternalUrl,
 | |
| 			Expires:     snapshot.Expires,
 | |
| 			Created:     snapshot.Created,
 | |
| 			Updated:     snapshot.Updated,
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return Json(200, dtos)
 | |
| }
 |