dashboard_snapshot.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. ExternalUrl: cmd.ExternalUrl,
  48. ExternalDeleteUrl: cmd.ExternalDeleteUrl,
  49. Dashboard: cmd.Dashboard,
  50. Expires: expires,
  51. Created: time.Now(),
  52. Updated: time.Now(),
  53. }
  54. _, err := sess.Insert(snapshot)
  55. cmd.Result = snapshot
  56. return err
  57. })
  58. }
  59. func DeleteDashboardSnapshot(cmd *m.DeleteDashboardSnapshotCommand) error {
  60. return inTransaction(func(sess *DBSession) error {
  61. var rawSql = "DELETE FROM dashboard_snapshot WHERE delete_key=?"
  62. _, err := sess.Exec(rawSql, cmd.DeleteKey)
  63. return err
  64. })
  65. }
  66. func GetDashboardSnapshot(query *m.GetDashboardSnapshotQuery) error {
  67. snapshot := m.DashboardSnapshot{Key: query.Key, DeleteKey: query.DeleteKey}
  68. has, err := x.Get(&snapshot)
  69. if err != nil {
  70. return err
  71. } else if !has {
  72. return m.ErrDashboardSnapshotNotFound
  73. }
  74. query.Result = &snapshot
  75. return nil
  76. }
  77. // SearchDashboardSnapshots returns a list of all snapshots for admins
  78. // for other roles, it returns snapshots created by the user
  79. func SearchDashboardSnapshots(query *m.GetDashboardSnapshotsQuery) error {
  80. var snapshots = make(m.DashboardSnapshotsList, 0)
  81. sess := x.Limit(query.Limit)
  82. sess.Table("dashboard_snapshot")
  83. if query.Name != "" {
  84. sess.Where("name LIKE ?", query.Name)
  85. }
  86. // admins can see all snapshots, everyone else can only see their own snapshots
  87. if query.SignedInUser.OrgRole == m.ROLE_ADMIN {
  88. sess.Where("org_id = ?", query.OrgId)
  89. } else if !query.SignedInUser.IsAnonymous {
  90. sess.Where("org_id = ? AND user_id = ?", query.OrgId, query.SignedInUser.UserId)
  91. } else {
  92. query.Result = snapshots
  93. return nil
  94. }
  95. err := sess.Find(&snapshots)
  96. query.Result = snapshots
  97. return err
  98. }