dashboard_snapshot.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. // DeleteExpiredSnapshots removes snapshots with old expiry dates.
  16. // SnapShotRemoveExpired is deprecated and should be removed in the future.
  17. // Snapshot expiry is decided by the user when they share the snapshot.
  18. func DeleteExpiredSnapshots(cmd *m.DeleteExpiredSnapshotsCommand) error {
  19. return inTransaction(func(sess *DBSession) error {
  20. if !setting.SnapShotRemoveExpired {
  21. sqlog.Warn("[Deprecated] The snapshot_remove_expired setting is outdated. Please remove from your config.")
  22. return nil
  23. }
  24. deleteExpiredSql := "DELETE FROM dashboard_snapshot WHERE expires < ?"
  25. expiredResponse, err := sess.Exec(deleteExpiredSql, time.Now())
  26. if err != nil {
  27. return err
  28. }
  29. cmd.DeletedRows, _ = expiredResponse.RowsAffected()
  30. return nil
  31. })
  32. }
  33. func CreateDashboardSnapshot(cmd *m.CreateDashboardSnapshotCommand) error {
  34. return inTransaction(func(sess *DBSession) error {
  35. // never
  36. var expires = time.Now().Add(time.Hour * 24 * 365 * 50)
  37. if cmd.Expires > 0 {
  38. expires = time.Now().Add(time.Second * time.Duration(cmd.Expires))
  39. }
  40. snapshot := &m.DashboardSnapshot{
  41. Name: cmd.Name,
  42. Key: cmd.Key,
  43. DeleteKey: cmd.DeleteKey,
  44. OrgId: cmd.OrgId,
  45. UserId: cmd.UserId,
  46. External: cmd.External,
  47. Dashboard: cmd.Dashboard,
  48. Expires: expires,
  49. Created: time.Now(),
  50. Updated: time.Now(),
  51. }
  52. _, err := sess.Insert(snapshot)
  53. cmd.Result = snapshot
  54. return err
  55. })
  56. }
  57. func DeleteDashboardSnapshot(cmd *m.DeleteDashboardSnapshotCommand) error {
  58. return inTransaction(func(sess *DBSession) error {
  59. var rawSql = "DELETE FROM dashboard_snapshot WHERE delete_key=?"
  60. _, err := sess.Exec(rawSql, cmd.DeleteKey)
  61. return err
  62. })
  63. }
  64. func GetDashboardSnapshot(query *m.GetDashboardSnapshotQuery) error {
  65. snapshot := m.DashboardSnapshot{Key: query.Key, DeleteKey: query.DeleteKey}
  66. has, err := x.Get(&snapshot)
  67. if err != nil {
  68. return err
  69. } else if !has {
  70. return m.ErrDashboardSnapshotNotFound
  71. }
  72. query.Result = &snapshot
  73. return nil
  74. }
  75. // SearchDashboardSnapshots returns a list of all snapshots for admins
  76. // for other roles, it returns snapshots created by the user
  77. func SearchDashboardSnapshots(query *m.GetDashboardSnapshotsQuery) error {
  78. var snapshots = make(m.DashboardSnapshotsList, 0)
  79. sess := x.Limit(query.Limit)
  80. sess.Table("dashboard_snapshot")
  81. if query.Name != "" {
  82. sess.Where("name LIKE ?", query.Name)
  83. }
  84. // admins can see all snapshots, everyone else can only see their own snapshots
  85. if query.SignedInUser.OrgRole == m.ROLE_ADMIN {
  86. sess.Where("org_id = ?", query.OrgId)
  87. } else if !query.SignedInUser.IsAnonymous {
  88. sess.Where("org_id = ? AND user_id = ?", query.OrgId, query.SignedInUser.UserId)
  89. } else {
  90. query.Result = snapshots
  91. return nil
  92. }
  93. err := sess.Find(&snapshots)
  94. query.Result = snapshots
  95. return err
  96. }