From 5fdac38cb23e31d3904fb4100af93c4cfc7588c5 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Wed, 7 Aug 2019 15:52:38 +0200 Subject: [PATCH] Fix instructeur invitation --- .../admin/instructeurs_controller.rb | 28 +++++------ .../instructeurs/activate_controller.rb | 50 ------------------- app/controllers/users/activate_controller.rb | 49 ++++++++++++++++++ app/mailers/instructeur_mailer.rb | 10 ---- app/mailers/user_mailer.rb | 10 ++++ app/models/instructeur.rb | 6 --- app/models/user.rb | 4 ++ .../invite_instructeur.html.haml | 4 +- .../activate/new.html.haml | 4 +- config/routes.rb | 6 +-- .../admin/instructeurs_controller_spec.rb | 22 +------- .../activate_controller_spec.rb | 6 +-- 12 files changed, 86 insertions(+), 113 deletions(-) delete mode 100644 app/controllers/instructeurs/activate_controller.rb create mode 100644 app/controllers/users/activate_controller.rb rename app/views/{instructeur_mailer => user_mailer}/invite_instructeur.html.haml (60%) rename app/views/{instructeurs => users}/activate/new.html.haml (60%) rename spec/controllers/{instructeurs => users}/activate_controller_spec.rb (70%) diff --git a/app/controllers/admin/instructeurs_controller.rb b/app/controllers/admin/instructeurs_controller.rb index 78f661a10..37bf436e4 100644 --- a/app/controllers/admin/instructeurs_controller.rb +++ b/app/controllers/admin/instructeurs_controller.rb @@ -37,26 +37,24 @@ class Admin::InstructeursController < AdminController private def invite_instructeur(email) - password = SecureRandom.hex + user = User.find_by(email: email) - @instructeur = Instructeur.create( - email: email, - password: password, - password_confirmation: password, - administrateurs: [current_administrateur] - ) + if user.nil? + user = User.create( + email: email, + password: SecureRandom.hex, + confirmed_at: Time.zone.now + ) + end - if @instructeur.errors.messages.empty? - @instructeur.invite! + if user.errors.empty? + @instructeur = Instructeur.create(email: email, administrateurs: [current_administrateur]) + user.update!(instructeur: @instructeur) - if User.exists?(email: @instructeur.email) - InstructeurMailer.user_to_instructeur(@instructeur.email).deliver_later - else - User.create(email: email, password: password, confirmed_at: Time.zone.now) - end + user.invite! flash.notice = 'Instructeur ajouté' else - flash.alert = @instructeur.errors.full_messages + flash.alert = user.errors.full_messages end end diff --git a/app/controllers/instructeurs/activate_controller.rb b/app/controllers/instructeurs/activate_controller.rb deleted file mode 100644 index 332729828..000000000 --- a/app/controllers/instructeurs/activate_controller.rb +++ /dev/null @@ -1,50 +0,0 @@ -class Instructeurs::ActivateController < ApplicationController - include TrustedDeviceConcern - - def new - @instructeur = Instructeur.with_reset_password_token(params[:token]) - - if @instructeur - # the instructeur activates its account from an email - trust_device(Time.zone.now) - else - flash.alert = "Le lien de validation du compte instructeur a expiré, #{helpers.contact_link('contactez-nous', tags: 'lien expiré')} pour obtenir un nouveau lien." - redirect_to root_path - end - end - - def create - password = create_instructeur_params[:password] - instructeur = Instructeur.reset_password_by_token({ - password: password, - password_confirmation: password, - reset_password_token: create_instructeur_params[:reset_password_token] - }) - - if instructeur && instructeur.errors.empty? - sign_in(instructeur, scope: :instructeur) - try_to_authenticate(User, instructeur.email, password) - try_to_authenticate(Administrateur, instructeur.email, password) - flash.notice = "Mot de passe enregistré" - redirect_to instructeur_procedures_path - else - flash.alert = instructeur.errors.full_messages - redirect_to instructeur_activate_path(token: create_instructeur_params[:reset_password_token]) - end - end - - private - - def create_instructeur_params - params.require(:instructeur).permit(:reset_password_token, :password) - end - - def try_to_authenticate(klass, email, password) - resource = klass.find_for_database_authentication(email: email) - - if resource&.valid_password?(password) - sign_in resource - resource.force_sync_credentials - end - end -end diff --git a/app/controllers/users/activate_controller.rb b/app/controllers/users/activate_controller.rb new file mode 100644 index 000000000..c83cb026a --- /dev/null +++ b/app/controllers/users/activate_controller.rb @@ -0,0 +1,49 @@ +class Users::ActivateController < ApplicationController + include TrustedDeviceConcern + + def new + @user = User.with_reset_password_token(params[:token]) + + if @user + # the user activates its account from an email + trust_device(Time.zone.now) + else + flash.alert = "Le lien de validation du compte instructeur a expiré, #{helpers.contact_link('contactez-nous', tags: 'lien expiré')} pour obtenir un nouveau lien." + redirect_to root_path + end + end + + def create + password = create_user_params[:password] + user = User.reset_password_by_token({ + password: password, + password_confirmation: password, + reset_password_token: create_user_params[:reset_password_token] + }) + + if user && user.errors.empty? + sign_in(user, scope: :user) + try_to_authenticate(Administrateur, user.email, password) + flash.notice = "Mot de passe enregistré" + redirect_to instructeur_procedures_path + else + flash.alert = user.errors.full_messages + redirect_to users_activate_path(token: create_user_params[:reset_password_token]) + end + end + + private + + def create_user_params + params.require(:user).permit(:reset_password_token, :password) + end + + def try_to_authenticate(klass, email, password) + resource = klass.find_for_database_authentication(email: email) + + if resource&.valid_password?(password) + sign_in resource + resource.force_sync_credentials + end + end +end diff --git a/app/mailers/instructeur_mailer.rb b/app/mailers/instructeur_mailer.rb index 29d58efab..aa28622d2 100644 --- a/app/mailers/instructeur_mailer.rb +++ b/app/mailers/instructeur_mailer.rb @@ -2,16 +2,6 @@ class InstructeurMailer < ApplicationMailer layout 'mailers/layout' - def invite_instructeur(instructeur, reset_password_token) - @reset_password_token = reset_password_token - @instructeur = instructeur - subject = "Activez votre compte instructeur" - - mail(to: instructeur.email, - subject: subject, - reply_to: CONTACT_EMAIL) - end - def user_to_instructeur(email) @email = email subject = "Vous avez été nommé instructeur" diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index d0f7b91f6..d3ab63a11 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -16,4 +16,14 @@ class UserMailer < ApplicationMailer mail(to: requested_email, subject: @subject) end + + def invite_instructeur(user, reset_password_token) + @reset_password_token = reset_password_token + @user = user + subject = "Activez votre compte instructeur" + + mail(to: user.email, + subject: subject, + reply_to: CONTACT_EMAIL) + end end diff --git a/app/models/instructeur.rb b/app/models/instructeur.rb index ca6006cb2..b61fd3b2d 100644 --- a/app/models/instructeur.rb +++ b/app/models/instructeur.rb @@ -177,12 +177,6 @@ class Instructeur < ApplicationRecord Follow.where(instructeur: self, dossier: dossier).update_all(attributes) end - def invite! - reset_password_token = set_reset_password_token - - InstructeurMailer.invite_instructeur(self, reset_password_token).deliver_later - end - def feature_enabled?(feature) Flipflop.feature_set.feature(feature) features[feature.to_s] diff --git a/app/models/user.rb b/app/models/user.rb index 28a2960fe..7332dee3f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -40,6 +40,10 @@ class User < ApplicationRecord owns?(dossier) || invite?(dossier.id) end + def invite! + UserMailer.invite_instructeur(self, set_reset_password_token).deliver_later + end + private def link_invites! diff --git a/app/views/instructeur_mailer/invite_instructeur.html.haml b/app/views/user_mailer/invite_instructeur.html.haml similarity index 60% rename from app/views/instructeur_mailer/invite_instructeur.html.haml rename to app/views/user_mailer/invite_instructeur.html.haml index 6ad3ba292..da9ad89e3 100644 --- a/app/views/instructeur_mailer/invite_instructeur.html.haml +++ b/app/views/user_mailer/invite_instructeur.html.haml @@ -7,8 +7,8 @@ Vous venez d'être nommé instructeur sur demarches-simplifiees.fr. %p - Votre compte a été créé pour l'adresse email #{@instructeur.email}. Pour l’activer, je vous invite à cliquer sur le lien suivant :  - = link_to(instructeur_activate_url(token: @reset_password_token), instructeur_activate_url(token: @reset_password_token)) + Votre compte a été créé pour l'adresse email #{@user.email}. Pour l’activer, je vous invite à cliquer sur le lien suivant :  + = link_to(users_activate_url(token: @reset_password_token), users_activate_url(token: @reset_password_token)) %p Par ailleurs, nous vous invitons à prendre quelques minutes pour consulter notre tutoriel à destination des nouveaux instructeurs : diff --git a/app/views/instructeurs/activate/new.html.haml b/app/views/users/activate/new.html.haml similarity index 60% rename from app/views/instructeurs/activate/new.html.haml rename to app/views/users/activate/new.html.haml index a1962acfb..4089ceec0 100644 --- a/app/views/instructeurs/activate/new.html.haml +++ b/app/views/users/activate/new.html.haml @@ -1,7 +1,7 @@ .container - = form_for @instructeur, url: { controller: 'instructeurs/activate', action: :create }, html: { class: "form" } do |f| + = form_for @user, url: { controller: 'users/activate', action: :create }, html: { class: "form" } do |f| %br - %h1= @instructeur.email + %h1= @user.email = f.password_field :password, placeholder: 'Mot de passe' = f.hidden_field :reset_password_token, value: params[:token] = f.submit 'Définir le mot de passe', class: 'button large primary expand' diff --git a/config/routes.rb b/config/routes.rb index b386a8ebc..678746d53 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -152,11 +152,9 @@ Rails.application.routes.draw do get 'dossiers', to: redirect('/dossiers') get 'dossiers/:id/recapitulatif', to: redirect('/dossiers/%{id}') get 'dossiers/invites/:id', to: redirect(path: '/invites/%{id}') - end - namespace :instructeur do - get 'activate' => '/instructeurs/activate#new' - patch 'activate' => '/instructeurs/activate#create' + get 'activate' => '/users/activate#new' + patch 'activate' => '/users/activate#create' end namespace :admin do diff --git a/spec/controllers/admin/instructeurs_controller_spec.rb b/spec/controllers/admin/instructeurs_controller_spec.rb index ce908967e..dbb00621f 100644 --- a/spec/controllers/admin/instructeurs_controller_spec.rb +++ b/spec/controllers/admin/instructeurs_controller_spec.rb @@ -149,30 +149,10 @@ describe Admin::InstructeursController, type: :controller do context 'Email notification' do it 'Notification email is sent when instructeur is create' do - expect_any_instance_of(Instructeur).to receive(:invite!) + expect_any_instance_of(User).to receive(:invite!) subject end end - - context 'unified login' do - before do - subject - end - - it "creates associated user with same credentials" do - instructeur = controller.instance_variable_get(:@instructeur) - user = User.find_by(email: instructeur.email) - expect(user.valid_password?(instructeur.password)).to be(true) - end - - context 'invalid email' do - let(:email) { 'fail' } - - it "won't create associated user" do - expect(User.where(email: email).exists?).to be(false) - end - end - end end describe 'DELETE #destroy' do diff --git a/spec/controllers/instructeurs/activate_controller_spec.rb b/spec/controllers/users/activate_controller_spec.rb similarity index 70% rename from spec/controllers/instructeurs/activate_controller_spec.rb rename to spec/controllers/users/activate_controller_spec.rb index 3c973580c..917b560be 100644 --- a/spec/controllers/instructeurs/activate_controller_spec.rb +++ b/spec/controllers/users/activate_controller_spec.rb @@ -1,7 +1,7 @@ -describe Instructeurs::ActivateController, type: :controller do +describe Users::ActivateController, type: :controller do describe '#new' do - let(:instructeur) { create(:instructeur) } - let(:token) { instructeur.send(:set_reset_password_token) } + let(:user) { create(:user) } + let(:token) { user.send(:set_reset_password_token) } before { allow(controller).to receive(:trust_device) }