diff --git a/app/controllers/new_user/dossiers_controller.rb b/app/controllers/new_user/dossiers_controller.rb index 060bae041..3a008190d 100644 --- a/app/controllers/new_user/dossiers_controller.rb +++ b/app/controllers/new_user/dossiers_controller.rb @@ -4,8 +4,8 @@ module NewUser helper_method :new_demarche_url - before_action :ensure_ownership!, except: [:index, :show, :demande, :modifier, :update, :recherche] - before_action :ensure_ownership_or_invitation!, only: [:show, :demande, :modifier, :update] + before_action :ensure_ownership!, except: [:index, :show, :demande, :messagerie, :modifier, :update, :recherche] + before_action :ensure_ownership_or_invitation!, only: [:show, :demande, :messagerie, :modifier, :update, :create_commentaire] before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update] before_action :forbid_invite_submission!, only: [:update] @@ -38,6 +38,11 @@ module NewUser @dossier = dossier end + def messagerie + @dossier = dossier + @commentaire = Commentaire.new + end + def attestation send_data(dossier.attestation.pdf.read, filename: 'attestation.pdf', type: 'application/pdf') end @@ -122,6 +127,18 @@ module NewUser @dossier = current_user.dossiers.includes(:procedure).find(params[:id]) end + def create_commentaire + @commentaire = CommentaireService.create(current_user, dossier, commentaire_params) + + if @commentaire.save + flash.notice = "Message envoyé" + redirect_to messagerie_dossier_path(dossier) + else + flash.now.alert = @commentaire.errors.full_messages + render :messagerie + end + end + def ask_deletion dossier = current_user.dossiers.includes(:user, procedure: :administrateur).find(params[:id]) @@ -223,6 +240,10 @@ module NewUser params.require(:dossier).permit(:autorisation_donnees) end + def commentaire_params + params.require(:commentaire).permit(:body, :file) + end + def passage_en_construction? dossier.brouillon? && !draft? end diff --git a/app/views/new_user/dossiers/messagerie.html.haml b/app/views/new_user/dossiers/messagerie.html.haml new file mode 100644 index 000000000..26d4fb8b6 --- /dev/null +++ b/app/views/new_user/dossiers/messagerie.html.haml @@ -0,0 +1,6 @@ +- content_for(:title, "Messagerie · Dossier nº #{@dossier.id} (#{@dossier.procedure.libelle})") + +#dossier-show + = render partial: 'new_user/dossiers/show/header', locals: { dossier: @dossier } + + = render partial: "shared/dossiers/messagerie", locals: { dossier: @dossier, user_email: current_user.email, messagerie_seen_at: nil, new_commentaire: @commentaire, form_url: commentaire_dossier_path(@dossier) } diff --git a/app/views/new_user/dossiers/show/_header.html.haml b/app/views/new_user/dossiers/show/_header.html.haml index bc9d94dd7..52ae776c2 100644 --- a/app/views/new_user/dossiers/show/_header.html.haml +++ b/app/views/new_user/dossiers/show/_header.html.haml @@ -10,3 +10,4 @@ %ul.tabs = active_tab_item('Résumé', dossier_path(dossier)) = active_tab_item('Demande', demande_dossier_path(dossier)) + = active_tab_item('Messagerie', messagerie_dossier_path(dossier)) diff --git a/config/routes.rb b/config/routes.rb index 7f34ca76e..fc6b800e4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -279,6 +279,8 @@ Rails.application.routes.draw do patch 'modifier', to: 'dossiers#update' get 'merci' get 'demande' + get 'messagerie' + post 'commentaire' => 'dossiers#create_commentaire' post 'ask_deletion' get 'attestation' end diff --git a/spec/controllers/new_user/dossiers_controller_spec.rb b/spec/controllers/new_user/dossiers_controller_spec.rb index 33cfd3566..36a7b2eea 100644 --- a/spec/controllers/new_user/dossiers_controller_spec.rb +++ b/spec/controllers/new_user/dossiers_controller_spec.rb @@ -523,6 +523,48 @@ describe NewUser::DossiersController, type: :controller do it { is_expected.to render_template(:demande) } end + describe "#create_commentaire" do + let(:dossier) { create(:dossier, :en_construction, user: user) } + let(:saved_commentaire) { dossier.commentaires.first } + let(:body) { "avant\napres" } + let(:file) { Rack::Test::UploadedFile.new("./spec/support/files/piece_justificative_0.pdf", 'application/pdf') } + let(:scan_result) { true } + + subject { + post :create_commentaire, params: { + id: dossier.id, + commentaire: { + body: body, + file: file + } + } + } + + before do + sign_in(user) + allow(ClamavService).to receive(:safe_file?).and_return(scan_result) + end + + it "creates a commentaire" do + expect { subject }.to change(Commentaire, :count).by(1) + + expect(response).to redirect_to(messagerie_dossier_path(dossier)) + expect(flash.notice).to be_present + end + + context "when the commentaire creation fails" do + let(:scan_result) { false } + + it "renders the messagerie page with the invalid commentaire" do + expect { subject }.not_to change(Commentaire, :count) + + expect(response).to render_template :messagerie + expect(flash.alert).to be_present + expect(assigns(:commentaire).body).to eq("

avant\n
apres

") + end + end + end + describe '#ask_deletion' do before { sign_in(user) } diff --git a/spec/features/new_user/dossier_details_spec.rb b/spec/features/new_user/dossier_details_spec.rb index 4fc026e95..d6644e634 100644 --- a/spec/features/new_user/dossier_details_spec.rb +++ b/spec/features/new_user/dossier_details_spec.rb @@ -33,6 +33,27 @@ describe 'Dossier details:' do expect(page).to have_content('Nouveau texte') end + context 'with messages' do + let!(:commentaire) { create(:commentaire, dossier: dossier, email: 'instructeur@exemple.fr', body: 'Message envoyé à l’usager') } + let(:message_body) { 'Message envoyé à l’instructeur' } + + scenario 'the user can send a message' do + visit_dossier dossier + click_on 'Messagerie' + + expect(page).to have_current_path(messagerie_dossier_path(dossier)) + expect(page).to have_content(commentaire.body) + + fill_in 'commentaire_body', with: message_body + click_on 'Envoyer' + + expect(page).to have_current_path(messagerie_dossier_path(dossier)) + expect(page).to have_content('Message envoyé') + expect(page).to have_content(commentaire.body) + expect(page).to have_content(message_body) + end + end + private def visit_dossier(dossier)