ticket_overview_list.rb 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. class Sessions::Backend::TicketOverviewList < Sessions::Backend::Base
  2. def self.reset(user_id)
  3. Cache.write("TicketOverviewPull::#{user_id}", { needed: true })
  4. end
  5. def initialize(user, asset_lookup, client = nil, client_id = nil, ttl = 8)
  6. @user = user
  7. @client = client
  8. @client_id = client_id
  9. @ttl = ttl
  10. @asset_lookup = asset_lookup
  11. @last_change = nil
  12. @last_overview = {}
  13. @last_overview_change = nil
  14. @last_ticket_change = nil
  15. end
  16. def load
  17. # get whole collection
  18. index_and_lists = Ticket::Overviews.index(@user)
  19. # no data exists
  20. return if index_and_lists.blank?
  21. # no change exists
  22. return if @last_change == index_and_lists
  23. # remember last state
  24. @last_change = index_and_lists
  25. index_and_lists
  26. end
  27. def local_to_run?
  28. return false if !@time_now
  29. result = Cache.get("TicketOverviewPull::#{@user.id}")
  30. Cache.delete("TicketOverviewPull::#{@user.id}") if result
  31. return true if result
  32. false
  33. end
  34. def push
  35. return if !to_run? && !local_to_run?
  36. @time_now = Time.zone.now.to_i
  37. # check if min one ticket or overview has changed
  38. last_overview_change = Overview.latest_change
  39. last_ticket_change = Ticket.latest_change
  40. return if last_ticket_change == @last_ticket_change && last_overview_change == @last_overview_change
  41. @last_overview_change = last_overview_change
  42. @last_ticket_change = last_ticket_change
  43. # load current data
  44. index_and_lists = load
  45. return if !index_and_lists
  46. # push overview index
  47. indexes = []
  48. index_and_lists.each do |index|
  49. overview = Overview.lookup(id: index[:overview][:id])
  50. next if !overview
  51. meta = {
  52. name: overview.name,
  53. prio: overview.prio,
  54. link: overview.link,
  55. count: index[:count],
  56. }
  57. indexes.push meta
  58. end
  59. if @client
  60. @client.log "push overview_index for user #{@user.id}"
  61. @client.send(
  62. event: 'ticket_overview_index',
  63. data: indexes,
  64. )
  65. end
  66. @time_now = Time.zone.now.to_i
  67. # push overviews
  68. results = []
  69. index_and_lists.each do |data|
  70. # do not deliver unchanged lists
  71. next if @last_overview[data[:overview][:id]] == [data[:tickets], data[:overview]]
  72. @last_overview[data[:overview][:id]] = [data[:tickets], data[:overview]]
  73. assets = {}
  74. overview = Overview.lookup(id: data[:overview][:id])
  75. next if !overview
  76. if asset_needed?(overview)
  77. assets = asset_push(overview, assets)
  78. end
  79. data[:tickets].each do |ticket_meta|
  80. next if !asset_needed_by_updated_at?('Ticket', ticket_meta[:id], ticket_meta[:updated_at])
  81. ticket = Ticket.lookup(id: ticket_meta[:id])
  82. next if !ticket
  83. assets = asset_push(ticket, assets)
  84. end
  85. data[:assets] = assets
  86. if !@client
  87. result = {
  88. event: 'ticket_overview_list',
  89. data: data,
  90. }
  91. results.push result
  92. else
  93. @client.log "push overview_list #{overview.link} for user #{@user.id}"
  94. # send update to browser
  95. @client.send(
  96. event: 'ticket_overview_list',
  97. data: data,
  98. )
  99. end
  100. end
  101. return results if !@client
  102. nil
  103. end
  104. end