diff --git a/app/controllers/users/confirmations_controller.rb b/app/controllers/users/confirmations_controller.rb index 45f9dddf5..71cd3a13d 100644 --- a/app/controllers/users/confirmations_controller.rb +++ b/app/controllers/users/confirmations_controller.rb @@ -1,4 +1,17 @@ class Users::ConfirmationsController < Devise::ConfirmationsController + # POST /resource/confirmation + def create + self.resource = resource_class.send_confirmation_instructions(resource_params) + yield resource if block_given? + + if successfully_sent?(resource) + Mailer.already_confirmed(resource).deliver_later unless resource.confirmation_required? + respond_with({}, location: after_resending_confirmation_instructions_path_for(resource_name)) + else + respond_with(resource) + end + end + # new action, PATCH does not exist in the default Devise::ConfirmationsController # PATCH /resource/confirmation def update diff --git a/app/mailers/mailer.rb b/app/mailers/mailer.rb index b0c0d3541..1f6707e29 100644 --- a/app/mailers/mailer.rb +++ b/app/mailers/mailer.rb @@ -144,6 +144,15 @@ class Mailer < ApplicationMailer mail(to: @email_to, subject: t("mailers.machine_learning_success.subject")) end + def already_confirmed(user) + @email_to = user.email + @user = user + + with_user(@user) do + mail(to: @email_to, subject: t("mailers.already_confirmed.subject")) + end + end + private def with_user(user, &block) diff --git a/app/views/mailer/already_confirmed.html.erb b/app/views/mailer/already_confirmed.html.erb new file mode 100644 index 000000000..f517b8408 --- /dev/null +++ b/app/views/mailer/already_confirmed.html.erb @@ -0,0 +1,17 @@ + + +

+ <%= t("mailers.already_confirmed.subject") %> +

+ +

+ <%= t("mailers.already_confirmed.info") %> +

+ +

+ <%= t("mailers.already_confirmed.new_password") %> +

+

+ <%= link_to t("devise_views.shared.links.new_password"), new_password_url(@user), style: "color: #2895F1; text-decoration:none;" %> +

+ diff --git a/config/locales/en/mailers.yml b/config/locales/en/mailers.yml index f70669073..e3601ef90 100644 --- a/config/locales/en/mailers.yml +++ b/config/locales/en/mailers.yml @@ -2,6 +2,10 @@ en: mailers: title: "Open Government" no_reply: "This message was sent from an email address that does not accept replies." + already_confirmed: + info: "We've received a request to send you instructions to confirm your account. However, your account is already confirmed, so there's no need to do so again." + new_password: "If you've forgotten your password, you can reset it at the following link:" + subject: Your account is already confirmed comment: hi: Hi new_comment_by: There is a new comment from %{commenter} diff --git a/config/locales/es/mailers.yml b/config/locales/es/mailers.yml index 0cc21c5b5..ada78196f 100644 --- a/config/locales/es/mailers.yml +++ b/config/locales/es/mailers.yml @@ -2,6 +2,10 @@ es: mailers: title: "Gobierno abierto" no_reply: "Este mensaje se ha enviado desde una dirección de correo electrónico que no admite respuestas." + already_confirmed: + info: "Hemos recibido una solicitud para enviarte instrucciones para confirmar tu cuenta. Sin embargo, tu cuenta ya está confirmada, por lo que no es necesario volver a hacerlo." + new_password: "Si has olvidado tu contraseña, puedes restablecerla en el siguiente enlace:" + subject: Tu cuenta ya está confirmada comment: hi: Hola new_comment_by: Hay un nuevo comentario de %{commenter} en diff --git a/spec/system/users_auth_spec.rb b/spec/system/users_auth_spec.rb index 08be0a55d..a1e4e7be0 100644 --- a/spec/system/users_auth_spec.rb +++ b/spec/system/users_auth_spec.rb @@ -585,7 +585,8 @@ describe "Users" do end scenario "Re-send confirmation instructions" do - create(:user, email: "manuela@consul.dev") + create(:user, email: "manuela@consul.dev", confirmed_at: nil) + ActionMailer::Base.deliveries.clear visit "/" click_link "Sign in" @@ -596,9 +597,13 @@ describe "Users" do expect(page).to have_content "If your email address exists in our database, in a few minutes you will "\ "receive an email with instructions on how to confirm your email address." + expect(ActionMailer::Base.deliveries.count).to eq(1) + expect(ActionMailer::Base.deliveries.first.to).to eq(["manuela@consul.dev"]) + expect(ActionMailer::Base.deliveries.first.subject).to eq("Confirmation instructions") end scenario "Re-send confirmation instructions with unexisting email" do + ActionMailer::Base.deliveries.clear visit "/" click_link "Sign in" click_link "Haven't received instructions to activate your account?" @@ -608,6 +613,25 @@ describe "Users" do expect(page).to have_content "If your email address exists in our database, in a few minutes you will "\ "receive an email with instructions on how to confirm your email address." + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + + scenario "Re-send confirmation instructions with already verified email" do + ActionMailer::Base.deliveries.clear + + create(:user, email: "manuela@consul.dev") + + visit new_user_session_path + click_link "Haven't received instructions to activate your account?" + + fill_in "user_email", with: "manuela@consul.dev" + click_button "Re-send instructions" + + expect(page).to have_content "If your email address exists in our database, in a few minutes you will "\ + "receive an email with instructions on how to confirm your email address." + expect(ActionMailer::Base.deliveries.count).to eq(1) + expect(ActionMailer::Base.deliveries.first.to).to eq(["manuela@consul.dev"]) + expect(ActionMailer::Base.deliveries.first.subject).to eq("Your account is already confirmed") end scenario "Sign in, admin with password expired" do