From db23a853a95cc72163b7a9a269dca90bb1bff5fd Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Wed, 7 Apr 2021 18:03:03 +0200 Subject: [PATCH] fetch all notification at once --- .../instructeurs/procedures_controller.rb | 8 ++-- app/models/instructeur.rb | 22 ++++++++--- spec/models/instructeur_spec.rb | 38 +++++++++++-------- spec/services/notification_service_spec.rb | 4 +- 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/app/controllers/instructeurs/procedures_controller.rb b/app/controllers/instructeurs/procedures_controller.rb index c10d26657..dea380d52 100644 --- a/app/controllers/instructeurs/procedures_controller.rb +++ b/app/controllers/instructeurs/procedures_controller.rb @@ -85,10 +85,10 @@ module Instructeurs @archived_dossiers end - @has_en_cours_notifications = current_instructeur.notifications_for_procedure(@procedure, :en_cours).exists? - @has_termine_notifications = current_instructeur.notifications_for_procedure(@procedure, :termine).exists? - - @not_archived_notifications_dossier_ids = current_instructeur.notifications_for_procedure(@procedure, :not_archived).pluck(:id) + notifications = current_instructeur.notifications_for_groupe_instructeurs(groupe_instructeur_ids) + @has_en_cours_notifications = notifications[:en_cours].present? + @has_termine_notifications = notifications[:termines].present? + @not_archived_notifications_dossier_ids = notifications[:en_cours] + notifications[:termines] sorted_ids = procedure_presentation.sorted_ids(@dossiers, current_instructeur) diff --git a/app/models/instructeur.rb b/app/models/instructeur.rb index a9afa9516..d3e2fc21b 100644 --- a/app/models/instructeur.rb +++ b/app/models/instructeur.rb @@ -134,14 +134,21 @@ class Instructeur < ApplicationRecord end end - def notifications_for_procedure(procedure, scope) - target_groupes = groupe_instructeurs.where(procedure: procedure) - + def notifications_for_groupe_instructeurs(groupe_instructeurs) Dossier - .where(groupe_instructeur: target_groupes) - .send(scope) # :en_cours or :termine or :not_archived (or any other Dossier scope) + .not_archived + .where(groupe_instructeur: groupe_instructeurs) .merge(followed_dossiers) .with_notifications + .pluck(:state, :id) + .reduce({ termines: [], en_cours: [] }) do |acc, e| + if Dossier::TERMINE.include?(e[0]) + acc[:termines] << e[1] + elsif Dossier::EN_CONSTRUCTION_OU_INSTRUCTION.include?(e[0]) + acc[:en_cours] << e[1] + end + acc + end end def procedure_ids_with_notifications(scope) @@ -165,11 +172,14 @@ class Instructeur < ApplicationRecord .reduce([]) do |acc, groupe| procedure = groupe.procedure + notifications = notifications_for_groupe_instructeurs([groupe.id]) + nb_notification = notifications[:en_cours].count + notifications[:termines].count + h = { nb_en_construction: groupe.dossiers.en_construction.count, nb_en_instruction: groupe.dossiers.en_instruction.count, nb_accepted: Traitement.where(dossier: groupe.dossiers.accepte, processed_at: Time.zone.yesterday.beginning_of_day..Time.zone.yesterday.end_of_day).count, - nb_notification: notifications_for_procedure(procedure, :not_archived).count + nb_notification: nb_notification } if h[:nb_en_construction] > 0 || h[:nb_notification] > 0 diff --git a/spec/models/instructeur_spec.rb b/spec/models/instructeur_spec.rb index 40413d138..06c8155c6 100644 --- a/spec/models/instructeur_spec.rb +++ b/spec/models/instructeur_spec.rb @@ -255,29 +255,35 @@ describe Instructeur, type: :model do end end - describe '#notifications_for_procedure' do + describe '#notifications_for_groupe_instructeurs' do + # one procedure, one group, 2 instructeurs let(:procedure) { create(:simple_procedure, :routee, :with_type_de_champ_private) } - let!(:dossier) { create(:dossier, :followed, groupe_instructeur: procedure.groupe_instructeurs.last, state: Dossier.states.fetch(:en_construction)) } + let(:gi_p1) { procedure.groupe_instructeurs.last } + let!(:dossier) { create(:dossier, :followed, groupe_instructeur: gi_p1, state: Dossier.states.fetch(:en_construction)) } let(:instructeur) { dossier.follows.first.instructeur } - let!(:instructeur_2) { create(:instructeur, groupe_instructeurs: [procedure.groupe_instructeurs.last]) } + let!(:instructeur_2) { create(:instructeur, groupe_instructeurs: [gi_p1]) } + # one other procedure, dossier followed by a third instructeur let!(:dossier_on_procedure_2) { create(:dossier, :followed, state: Dossier.states.fetch(:en_construction)) } let!(:instructeur_on_procedure_2) { dossier_on_procedure_2.follows.first.instructeur } + let(:gi_p2) { dossier.groupe_instructeur } + let(:now) { Time.zone.parse("14/09/1867") } let(:follow) { instructeur.follows.find_by(dossier: dossier) } let(:follow2) { instructeur_2.follows.find_by(dossier: dossier) } + let(:seen_at_instructeur) { now - 1.hour } let(:seen_at_instructeur2) { now - 1.hour } before do - procedure.groupe_instructeurs.last.instructeurs << instructeur + gi_p1.instructeurs << instructeur instructeur_2.followed_dossiers << dossier Timecop.freeze(now) end after { Timecop.return } - subject { instructeur.notifications_for_procedure(procedure, :en_cours) } + subject { instructeur.notifications_for_groupe_instructeurs(gi_p1)[:en_cours] } context 'when the instructeur has just followed the dossier' do it { is_expected.to match([]) } @@ -290,14 +296,14 @@ describe Instructeur, type: :model do follow2.update_attribute('demande_seen_at', seen_at_instructeur2) end - it { is_expected.to match([dossier]) } - it { expect(instructeur_2.notifications_for_procedure(procedure, :en_cours)).to match([dossier]) } - it { expect(instructeur_on_procedure_2.notifications_for_procedure(procedure, :en_cours)).to match([]) } + it { is_expected.to match([dossier.id]) } + it { expect(instructeur_2.notifications_for_groupe_instructeurs(gi_p1)[:en_cours]).to match([dossier.id]) } + it { expect(instructeur_on_procedure_2.notifications_for_groupe_instructeurs(gi_p2)[:en_cours]).to match([]) } context 'and there is a modification on private champs' do before { dossier.champs_private.first.update_attribute('value', 'toto') } - it { is_expected.to match([dossier]) } + it { is_expected.to match([dossier.id]) } end context 'when instructeur update it s public champs last seen' do @@ -305,7 +311,7 @@ describe Instructeur, type: :model do let(:seen_at_instructeur2) { now - 1.hour } it { is_expected.to match([]) } - it { expect(instructeur_2.notifications_for_procedure(procedure, :en_cours)).to match([dossier]) } + it { expect(instructeur_2.notifications_for_groupe_instructeurs(gi_p1)[:en_cours]).to match([dossier.id]) } end end @@ -321,7 +327,7 @@ describe Instructeur, type: :model do follow.update_attribute('annotations_privees_seen_at', seen_at_instructeur) end - it { is_expected.to match([dossier]) } + it { is_expected.to match([dossier.id]) } end context 'when there is a modification on avis' do @@ -330,7 +336,7 @@ describe Instructeur, type: :model do follow.update_attribute('avis_seen_at', seen_at_instructeur) end - it { is_expected.to match([dossier]) } + it { is_expected.to match([dossier.id]) } end context 'the messagerie' do @@ -340,7 +346,7 @@ describe Instructeur, type: :model do follow.update_attribute('messagerie_seen_at', seen_at_instructeur) end - it { is_expected.to match([dossier]) } + it { is_expected.to match([dossier.id]) } end context 'when there is a new commentaire issued by tps' do @@ -431,9 +437,9 @@ describe Instructeur, type: :model do context 'when a notification exists' do before do - allow(instructeur).to receive(:notifications_for_procedure) - .with(procedure_to_assign, :not_archived) - .and_return([1, 2, 3]) + allow(instructeur).to receive(:notifications_for_groupe_instructeurs) + .with([procedure_to_assign.groupe_instructeurs.first.id]) + .and_return(en_cours: [1, 2, 3], termines: []) end it do diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb index 1f1b858c3..15e146e9e 100644 --- a/spec/services/notification_service_spec.rb +++ b/spec/services/notification_service_spec.rb @@ -92,8 +92,8 @@ describe NotificationService do context 'when there is a notification on this procedure' do before do - allow_any_instance_of(Instructeur).to receive(:notifications_for_procedure) - .and_return([12]) + allow_any_instance_of(Instructeur).to receive(:notifications_for_groupe_instructeurs) + .and_return(en_cours: [12], termines: []) end it do