From 74e277d0a22889985df05fa2b5cb12df657b5ba7 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 1 Sep 2021 15:11:11 +0200 Subject: [PATCH] feat(graphql): add an option to dossier state change mutations to disable notifications --- .../instructeurs/dossiers_controller.rb | 6 ++-- app/graphql/mutations/dossier_accepter.rb | 5 +-- .../mutations/dossier_classer_sans_suite.rb | 5 +-- .../dossier_passer_en_instruction.rb | 7 ++-- app/graphql/mutations/dossier_refuser.rb | 5 +-- app/graphql/schema.graphql | 20 +++++++++++ app/models/dossier.rb | 36 ++++++++++--------- .../api/v2/graphql_controller_spec.rb | 26 +++++++++++++- .../concern/tags_substitution_concern_spec.rb | 2 +- spec/models/dossier_spec.rb | 8 ++--- 10 files changed, 86 insertions(+), 34 deletions(-) diff --git a/app/controllers/instructeurs/dossiers_controller.rb b/app/controllers/instructeurs/dossiers_controller.rb index 7d89b7a0c..a148e129a 100644 --- a/app/controllers/instructeurs/dossiers_controller.rb +++ b/app/controllers/instructeurs/dossiers_controller.rb @@ -151,15 +151,15 @@ module Instructeurs case params[:process_action] when "refuser" target_state = :refuse - dossier.refuser!(current_instructeur, motivation, justificatif) + dossier.refuser!(current_instructeur, motivation, justificatif: justificatif) flash.notice = "Dossier considéré comme refusé." when "classer_sans_suite" target_state = :sans_suite - dossier.classer_sans_suite!(current_instructeur, motivation, justificatif) + dossier.classer_sans_suite!(current_instructeur, motivation, justificatif: justificatif) flash.notice = "Dossier considéré comme sans suite." when "accepter" target_state = :accepte - dossier.accepter!(current_instructeur, motivation, justificatif) + dossier.accepter!(current_instructeur, motivation, justificatif: justificatif) flash.notice = "Dossier traité avec succès." end rescue AASM::InvalidTransition => e diff --git a/app/graphql/mutations/dossier_accepter.rb b/app/graphql/mutations/dossier_accepter.rb index bbb5bd9f2..89be39e6d 100644 --- a/app/graphql/mutations/dossier_accepter.rb +++ b/app/graphql/mutations/dossier_accepter.rb @@ -8,12 +8,13 @@ module Mutations argument :instructeur_id, ID, "Instructeur qui prend la décision sur le dossier.", required: true, loads: Types::ProfileType argument :motivation, String, required: false argument :justificatif, ID, required: false + argument :disable_notification, Boolean, "Désactiver l’envoi de l’email de notification après l’opération", required: false, default_value: false field :dossier, Types::DossierType, null: true field :errors, [Types::ValidationErrorType], null: true - def resolve(dossier:, instructeur:, motivation: nil, justificatif: nil) - dossier.accepter!(instructeur, motivation, justificatif) + def resolve(dossier:, instructeur:, motivation: nil, justificatif: nil, disable_notification:) + dossier.accepter!(instructeur, motivation, justificatif: justificatif, disable_notification: disable_notification) { dossier: dossier } end diff --git a/app/graphql/mutations/dossier_classer_sans_suite.rb b/app/graphql/mutations/dossier_classer_sans_suite.rb index bf66add79..b18337bd3 100644 --- a/app/graphql/mutations/dossier_classer_sans_suite.rb +++ b/app/graphql/mutations/dossier_classer_sans_suite.rb @@ -8,12 +8,13 @@ module Mutations argument :instructeur_id, ID, "Instructeur qui prend la décision sur le dossier.", required: true, loads: Types::ProfileType argument :motivation, String, required: true argument :justificatif, ID, required: false + argument :disable_notification, Boolean, "Désactiver l’envoi de l’email de notification après l’opération", required: false, default_value: false field :dossier, Types::DossierType, null: true field :errors, [Types::ValidationErrorType], null: true - def resolve(dossier:, instructeur:, motivation:, justificatif: nil) - dossier.classer_sans_suite!(instructeur, motivation, justificatif) + def resolve(dossier:, instructeur:, motivation:, justificatif: nil, disable_notification:) + dossier.classer_sans_suite!(instructeur, motivation, justificatif: justificatif, disable_notification: disable_notification) { dossier: dossier } end diff --git a/app/graphql/mutations/dossier_passer_en_instruction.rb b/app/graphql/mutations/dossier_passer_en_instruction.rb index fa34ead70..42e569471 100644 --- a/app/graphql/mutations/dossier_passer_en_instruction.rb +++ b/app/graphql/mutations/dossier_passer_en_instruction.rb @@ -6,17 +6,18 @@ module Mutations argument :dossier_id, ID, "Dossier ID", required: true, loads: Types::DossierType argument :instructeur_id, ID, "Instructeur qui prend la décision sur le dossier.", required: true, loads: Types::ProfileType + argument :disable_notification, Boolean, "Désactiver l’envoi de l’email de notification après l’opération", required: false, default_value: false field :dossier, Types::DossierType, null: true field :errors, [Types::ValidationErrorType], null: true - def resolve(dossier:, instructeur:) - dossier.passer_en_instruction!(instructeur) + def resolve(dossier:, instructeur:, disable_notification:) + dossier.passer_en_instruction!(instructeur, disable_notification: disable_notification) { dossier: dossier } end - def authorized?(dossier:, instructeur:) + def authorized?(dossier:, instructeur:, **args) if !dossier.en_construction? return false, { errors: ["Le dossier est déjà #{dossier_display_state(dossier, lower: true)}"] } end diff --git a/app/graphql/mutations/dossier_refuser.rb b/app/graphql/mutations/dossier_refuser.rb index 18abc2a7a..53ad7618b 100644 --- a/app/graphql/mutations/dossier_refuser.rb +++ b/app/graphql/mutations/dossier_refuser.rb @@ -8,12 +8,13 @@ module Mutations argument :instructeur_id, ID, "Instructeur qui prend la décision sur le dossier.", required: true, loads: Types::ProfileType argument :motivation, String, required: true argument :justificatif, ID, required: false + argument :disable_notification, Boolean, "Désactiver l’envoi de l’email de notification après l’opération", required: false, default_value: false field :dossier, Types::DossierType, null: true field :errors, [Types::ValidationErrorType], null: true - def resolve(dossier:, instructeur:, motivation:, justificatif: nil) - dossier.refuser!(instructeur, motivation, justificatif) + def resolve(dossier:, instructeur:, motivation:, justificatif: nil, disable_notification:) + dossier.refuser!(instructeur, motivation, justificatif: justificatif, disable_notification: disable_notification) { dossier: dossier } end diff --git a/app/graphql/schema.graphql b/app/graphql/schema.graphql index c1620765c..5f73dbc34 100644 --- a/app/graphql/schema.graphql +++ b/app/graphql/schema.graphql @@ -748,6 +748,11 @@ input DossierAccepterInput { """ clientMutationId: String + """ + Désactiver l’envoi de l’email de notification après l’opération + """ + disableNotification: Boolean = false + """ Dossier ID """ @@ -846,6 +851,11 @@ input DossierClasserSansSuiteInput { """ clientMutationId: String + """ + Désactiver l’envoi de l’email de notification après l’opération + """ + disableNotification: Boolean = false + """ Dossier ID """ @@ -1164,6 +1174,11 @@ input DossierPasserEnInstructionInput { """ clientMutationId: String + """ + Désactiver l’envoi de l’email de notification après l’opération + """ + disableNotification: Boolean = false + """ Dossier ID """ @@ -1196,6 +1211,11 @@ input DossierRefuserInput { """ clientMutationId: String + """ + Désactiver l’envoi de l’email de notification après l’opération + """ + disableNotification: Boolean = false + """ Dossier ID """ diff --git a/app/models/dossier.rb b/app/models/dossier.rb index e02866a3a..fce3f381f 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -374,7 +374,6 @@ class Dossier < ApplicationRecord before_save :build_default_champs, if: Proc.new { revision_id_was.nil? } before_save :update_search_terms - after_save :send_dossier_en_instruction after_save :send_web_hook after_create_commit :send_draft_notification_email @@ -676,10 +675,13 @@ class Dossier < ApplicationRecord update!(en_construction_at: Time.zone.now) if self.en_construction_at.nil? end - def after_passer_en_instruction(instructeur) + def after_passer_en_instruction(instructeur, disable_notification: false) instructeur.follow(self) update!(en_instruction_at: Time.zone.now) if self.en_instruction_at.nil? + if !procedure.declarative_accepte? && !disable_notification + NotificationMailer.send_en_instruction_notification(self).deliver_later + end log_dossier_operation(instructeur, :passer_en_instruction) end @@ -695,17 +697,19 @@ class Dossier < ApplicationRecord log_dossier_operation(instructeur, :repasser_en_construction) end - def after_repasser_en_instruction(instructeur) + def after_repasser_en_instruction(instructeur, disable_notification: false) self.archived = false self.en_instruction_at = Time.zone.now attestation&.destroy save! - DossierMailer.notify_revert_to_instruction(self).deliver_later + if !disable_notification + DossierMailer.notify_revert_to_instruction(self).deliver_later + end log_dossier_operation(instructeur, :repasser_en_instruction) end - def after_accepter(instructeur, motivation, justificatif = nil) + def after_accepter(instructeur, motivation, justificatif: nil, disable_notification: false) self.traitements.accepter(motivation: motivation, instructeur: instructeur) if justificatif @@ -718,7 +722,9 @@ class Dossier < ApplicationRecord save! remove_titres_identite! - NotificationMailer.send_accepte_notification(self).deliver_later + if !disable_notification + NotificationMailer.send_accepte_notification(self).deliver_later + end send_dossier_decision_to_experts(self) log_dossier_operation(instructeur, :accepter, self) end @@ -738,7 +744,7 @@ class Dossier < ApplicationRecord log_automatic_dossier_operation(:accepter, self) end - def after_refuser(instructeur, motivation, justificatif = nil) + def after_refuser(instructeur, motivation, justificatif: nil, disable_notification: false) self.traitements.refuser(motivation: motivation, instructeur: instructeur) if justificatif @@ -747,12 +753,14 @@ class Dossier < ApplicationRecord save! remove_titres_identite! - NotificationMailer.send_refuse_notification(self).deliver_later + if !disable_notification + NotificationMailer.send_refuse_notification(self).deliver_later + end send_dossier_decision_to_experts(self) log_dossier_operation(instructeur, :refuser, self) end - def after_classer_sans_suite(instructeur, motivation, justificatif = nil) + def after_classer_sans_suite(instructeur, motivation, justificatif: nil, disable_notification: false) self.traitements.classer_sans_suite(motivation: motivation, instructeur: instructeur) if justificatif @@ -761,7 +769,9 @@ class Dossier < ApplicationRecord save! remove_titres_identite! - NotificationMailer.send_sans_suite_notification(self).deliver_later + if !disable_notification + NotificationMailer.send_sans_suite_notification(self).deliver_later + end send_dossier_decision_to_experts(self) log_dossier_operation(instructeur, :classer_sans_suite, self) end @@ -968,12 +978,6 @@ class Dossier < ApplicationRecord end end - def send_dossier_en_instruction - if saved_change_to_state? && en_instruction? && !procedure.declarative_accepte? - NotificationMailer.send_en_instruction_notification(self).deliver_later - end - end - def send_draft_notification_email if brouillon? && !procedure.declarative? DossierMailer.notify_new_draft(self).deliver_later diff --git a/spec/controllers/api/v2/graphql_controller_spec.rb b/spec/controllers/api/v2/graphql_controller_spec.rb index aa0cb4f44..dffe42533 100644 --- a/spec/controllers/api/v2/graphql_controller_spec.rb +++ b/spec/controllers/api/v2/graphql_controller_spec.rb @@ -904,11 +904,13 @@ describe API::V2::GraphqlController do describe 'dossierPasserEnInstruction' do let(:dossier) { create(:dossier, :en_construction, :with_individual, procedure: procedure) } let(:instructeur_id) { instructeur.to_typed_id } + let(:disable_notification) { false } let(:query) do "mutation { dossierPasserEnInstruction(input: { dossierId: \"#{dossier.to_typed_id}\", - instructeurId: \"#{instructeur_id}\" + instructeurId: \"#{instructeur_id}\", + disableNotification: #{disable_notification} }) { dossier { id @@ -934,6 +936,9 @@ describe API::V2::GraphqlController do }, errors: nil }) + + perform_enqueued_jobs + expect(ActionMailer::Base.deliveries.size).to eq(4) end end @@ -960,6 +965,25 @@ describe API::V2::GraphqlController do }) end end + + context 'disable notification' do + let(:disable_notification) { true } + it "should passer en instruction dossier without notification" do + expect(gql_errors).to eq(nil) + + expect(gql_data).to eq(dossierPasserEnInstruction: { + dossier: { + id: dossier.to_typed_id, + state: "en_instruction", + motivation: nil + }, + errors: nil + }) + + perform_enqueued_jobs + expect(ActionMailer::Base.deliveries.size).to eq(3) + end + end end describe 'dossierClasserSansSuite' do diff --git a/spec/models/concern/tags_substitution_concern_spec.rb b/spec/models/concern/tags_substitution_concern_spec.rb index a8854c45c..8ab94ca3e 100644 --- a/spec/models/concern/tags_substitution_concern_spec.rb +++ b/spec/models/concern/tags_substitution_concern_spec.rb @@ -320,7 +320,7 @@ describe TagsSubstitutionConcern, type: :model do Timecop.freeze(Time.zone.local(2004, 5, 6)) dossier.passer_en_instruction!(instructeur) Timecop.freeze(Time.zone.local(2007, 8, 9)) - dossier.accepter!(instructeur, nil, nil) + dossier.accepter!(instructeur, nil) Timecop.return end diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 213cef8b0..8886cc206 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -239,7 +239,7 @@ describe Dossier do Timecop.freeze(date2) d.passer_en_instruction!(instructeur) Timecop.freeze(date3) - d.accepter!(instructeur, "Motivation", nil) + d.accepter!(instructeur, "Motivation") Timecop.return d end @@ -422,7 +422,7 @@ describe Dossier do let(:dossier) { create(:dossier, :en_instruction, :with_individual) } before do - dossier.accepter!(instructeur, nil, nil) + dossier.accepter!(instructeur, nil) dossier.reload end @@ -435,7 +435,7 @@ describe Dossier do let(:dossier) { create(:dossier, :en_instruction, :with_individual) } before do - dossier.refuser!(instructeur, nil, nil) + dossier.refuser!(instructeur, nil) dossier.reload end @@ -447,7 +447,7 @@ describe Dossier do let(:dossier) { create(:dossier, :en_instruction, :with_individual) } before do - dossier.classer_sans_suite!(instructeur, nil, nil) + dossier.classer_sans_suite!(instructeur, nil) dossier.reload end