stats_store.rb 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class StatsStore < ApplicationModel
  3. include HasSearchIndexBackend
  4. include StatsStore::SearchIndex
  5. # rubocop:disable Rails/InverseOf
  6. belongs_to :stats_store_object, class_name: 'ObjectLookup', foreign_key: 'stats_store_object_id'
  7. belongs_to :related_stats_store_object, class_name: 'ObjectLookup', foreign_key: 'related_stats_store_object_id'
  8. # rubocop:enable Rails/InverseOf
  9. store :data
  10. =begin
  11. count = StatsStore.count_by_search(
  12. object: 'User',
  13. o_id: ticket.owner_id,
  14. key: 'ticket:reopen',
  15. start: Time.zone.now - 7.days,
  16. end: Time.zone.now,
  17. )
  18. =end
  19. def self.count_by_search(data)
  20. # lookups
  21. if data[:object]
  22. object_id = ObjectLookup.by_name(data[:object])
  23. end
  24. StatsStore.where(stats_store_object_id: object_id, o_id: data[:o_id], key: data[:key])
  25. .where('created_at > ? AND created_at < ?', data[:start], data[:end]).count
  26. end
  27. =begin
  28. item = StatsStore.search(
  29. object: 'User',
  30. o_id: current_user.id,
  31. key: 'dashboard',
  32. )
  33. =end
  34. def self.search(data)
  35. # lookups
  36. if data[:object]
  37. data[:stats_store_object_id] = ObjectLookup.by_name(data[:object])
  38. data.delete(:object)
  39. end
  40. find_by(data)
  41. end
  42. =begin
  43. item = StatsStore.sync(
  44. object: 'User',
  45. o_id: current_user.id,
  46. key: 'dashboard',
  47. data: {some data},
  48. )
  49. =end
  50. def self.sync(params)
  51. data = params[:data]
  52. params.delete(:data)
  53. item = search(params)
  54. if item
  55. item.data = data
  56. item.save
  57. return item
  58. end
  59. # lookups
  60. if data[:object]
  61. data[:stats_store_object_id] = ObjectLookup.by_name(data[:object])
  62. data.delete(:object)
  63. end
  64. params[:data] = data
  65. params[:created_by_id] = 1
  66. create(params)
  67. end
  68. =begin
  69. StatsStore.add(
  70. object: 'User',
  71. o_id: ticket.owner_id,
  72. key: 'ticket:reopen',
  73. data: { ticket_id: ticket.id },
  74. created_at: Time.zone.now,
  75. )
  76. =end
  77. def self.add(data)
  78. # lookups
  79. if data[:object]
  80. object_id = ObjectLookup.by_name(data[:object])
  81. end
  82. # create history
  83. record = {
  84. stats_store_object_id: object_id,
  85. o_id: data[:o_id],
  86. key: data[:key],
  87. data: data[:data],
  88. created_at: data[:created_at],
  89. created_by_id: data[:created_by_id],
  90. }
  91. StatsStore.create(record)
  92. end
  93. =begin
  94. StatsStore.remove(
  95. object: 'User',
  96. o_id: ticket.owner_id,
  97. )
  98. =end
  99. def self.remove(data)
  100. # lookups
  101. if data[:object]
  102. object_id = ObjectLookup.by_name(data[:object])
  103. end
  104. # create history
  105. record = {
  106. stats_store_object_id: object_id,
  107. o_id: data[:o_id],
  108. }
  109. StatsStore.where(record).destroy_all
  110. end
  111. =begin
  112. cleanup old stats store
  113. StatsStore.cleanup
  114. optional you can put the max oldest stats store entries as argument
  115. StatsStore.cleanup(12.months)
  116. =end
  117. def self.cleanup(diff = 12.months)
  118. StatsStore.where('updated_at < ?', Time.zone.now - diff).delete_all
  119. true
  120. end
  121. end