From 4182b0b56753b63d067be793e978aa85906be8c9 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Thu, 3 Oct 2019 14:41:07 +0200 Subject: [PATCH] Improved History.list to only retrive history entries of last 2 days (by generic condition as method argument) to save scheduler resources. --- app/models/history.rb | 17 +++++++++++++++- app/models/transaction/notification.rb | 2 +- spec/models/history_spec.rb | 27 ++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/models/history.rb b/app/models/history.rb index 662a555e6..dee341269 100644 --- a/app/models/history.rb +++ b/app/models/history.rb @@ -146,9 +146,20 @@ returns assets: assets, } +return all history entries of an object and it's assets and extended with an condition (e. g. to only retrive new history entries) + + history = History.list('Ticket', 123, nil, true, ['created_at > ?', [Time.zone.now - 2.days]]) + +returns + + history = { + list: list, + assets: assets, + } + =end - def self.list(requested_object, requested_object_id, related_history_object = nil, assets = nil) + def self.list(requested_object, requested_object_id, related_history_object = nil, assets = nil, condition = nil) histories = History.where( history_object_id: object_lookup(requested_object).id, o_id: requested_object_id @@ -163,6 +174,10 @@ returns ) end + if condition.present? + histories = histories.where(condition) + end + histories = histories.order(:created_at) list = histories.map(&:attributes).each do |data| diff --git a/app/models/transaction/notification.rb b/app/models/transaction/notification.rb index d2aa22693..409bb6515 100644 --- a/app/models/transaction/notification.rb +++ b/app/models/transaction/notification.rb @@ -112,7 +112,7 @@ class Transaction::Notification identifier = user.login end already_notified = false - History.list('Ticket', ticket.id).each do |history| + History.list('Ticket', ticket.id, nil, nil, ['created_at > ?', [Time.zone.now - 2.days]]).each do |history| next if history['type'] != 'notification' next if !history['value_to'].match?(/\(#{Regexp.escape(@item[:type])}:/) next if !history['value_to'].match?(/#{Regexp.escape(identifier)}\(/) diff --git a/spec/models/history_spec.rb b/spec/models/history_spec.rb index 0f60f3189..97a1ee57c 100644 --- a/spec/models/history_spec.rb +++ b/spec/models/history_spec.rb @@ -188,5 +188,32 @@ RSpec.describe History, type: :model do end end end + + context 'when given an object with histories' do + context 'and called without "condition" argument' do + let!(:object) { create(:user) } + + before do + travel 3.days + object.update(email: 'foo@example.com') + end + + context 'or "assets" flag' do + let(:list) { described_class.list(object.class.name, object.id, nil, nil, ['created_at > ?', [Time.zone.now - 2.days]]) } + + it 'returns an array of attribute hashes for those histories' do + expect(list).to match_array( + [ + hash_including( + 'type' => 'updated', + 'o_id' => object.id, + 'value_to' => 'foo@example.com', + ) + ] + ) + end + end + end + end end end