dashboard_snapshot.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package sqlstore
  2. import (
  3. "time"
  4. "github.com/grafana/grafana/pkg/bus"
  5. m "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/setting"
  7. )
  8. func init() {
  9. bus.AddHandler("sql", CreateDashboardSnapshot)
  10. bus.AddHandler("sql", GetDashboardSnapshot)
  11. bus.AddHandler("sql", DeleteDashboardSnapshot)
  12. bus.AddHandler("sql", SearchDashboardSnapshots)
  13. bus.AddHandler("sql", DeleteExpiredSnapshots)
  14. }
  15. func DeleteExpiredSnapshots(cmd *m.DeleteExpiredSnapshotsCommand) error {
  16. return inTransaction(func(sess *DBSession) error {
  17. var expiredCount int64 = 0
  18. if setting.SnapShotRemoveExpired {
  19. deleteExpiredSql := "DELETE FROM dashboard_snapshot WHERE expires < ?"
  20. expiredResponse, err := x.Exec(deleteExpiredSql, time.Now)
  21. if err != nil {
  22. return err
  23. }
  24. expiredCount, _ = expiredResponse.RowsAffected()
  25. }
  26. sqlog.Debug("Deleted old/expired snaphots", "expired", expiredCount)
  27. return nil
  28. })
  29. }
  30. func CreateDashboardSnapshot(cmd *m.CreateDashboardSnapshotCommand) error {
  31. return inTransaction(func(sess *DBSession) error {
  32. // never
  33. var expires = time.Now().Add(time.Hour * 24 * 365 * 50)
  34. if cmd.Expires > 0 {
  35. expires = time.Now().Add(time.Second * time.Duration(cmd.Expires))
  36. }
  37. snapshot := &m.DashboardSnapshot{
  38. Name: cmd.Name,
  39. Key: cmd.Key,
  40. DeleteKey: cmd.DeleteKey,
  41. OrgId: cmd.OrgId,
  42. UserId: cmd.UserId,
  43. External: cmd.External,
  44. Dashboard: cmd.Dashboard,
  45. Expires: expires,
  46. Created: time.Now(),
  47. Updated: time.Now(),
  48. }
  49. _, err := sess.Insert(snapshot)
  50. cmd.Result = snapshot
  51. return err
  52. })
  53. }
  54. func DeleteDashboardSnapshot(cmd *m.DeleteDashboardSnapshotCommand) error {
  55. return inTransaction(func(sess *DBSession) error {
  56. var rawSql = "DELETE FROM dashboard_snapshot WHERE delete_key=?"
  57. _, err := sess.Exec(rawSql, cmd.DeleteKey)
  58. return err
  59. })
  60. }
  61. func GetDashboardSnapshot(query *m.GetDashboardSnapshotQuery) error {
  62. snapshot := m.DashboardSnapshot{Key: query.Key, DeleteKey: query.DeleteKey}
  63. has, err := x.Get(&snapshot)
  64. if err != nil {
  65. return err
  66. } else if has == false {
  67. return m.ErrDashboardSnapshotNotFound
  68. }
  69. query.Result = &snapshot
  70. return nil
  71. }
  72. // SearchDashboardSnapshots returns a list of all snapshots for admins
  73. // for other roles, it returns snapshots created by the user
  74. func SearchDashboardSnapshots(query *m.GetDashboardSnapshotsQuery) error {
  75. var snapshots = make(m.DashboardSnapshotsList, 0)
  76. sess := x.Limit(query.Limit)
  77. sess.Table("dashboard_snapshot")
  78. if query.Name != "" {
  79. sess.Where("name LIKE ?", query.Name)
  80. }
  81. // admins can see all snapshots, everyone else can only see their own snapshots
  82. if query.SignedInUser.OrgRole == m.ROLE_ADMIN {
  83. sess.Where("org_id = ?", query.OrgId)
  84. } else if !query.SignedInUser.IsAnonymous {
  85. sess.Where("org_id = ? AND user_id = ?", query.OrgId, query.SignedInUser.UserId)
  86. } else {
  87. query.Result = snapshots
  88. return nil
  89. }
  90. err := sess.Find(&snapshots)
  91. query.Result = snapshots
  92. return err
  93. }