Fix instructeur invitation
This commit is contained in:
parent
efd793f266
commit
5fdac38cb2
12 changed files with 86 additions and 113 deletions
|
@ -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(
|
||||
if user.nil?
|
||||
user = User.create(
|
||||
email: email,
|
||||
password: password,
|
||||
password_confirmation: password,
|
||||
administrateurs: [current_administrateur]
|
||||
password: SecureRandom.hex,
|
||||
confirmed_at: Time.zone.now
|
||||
)
|
||||
|
||||
if @instructeur.errors.messages.empty?
|
||||
@instructeur.invite!
|
||||
|
||||
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
|
||||
|
||||
if user.errors.empty?
|
||||
@instructeur = Instructeur.create(email: email, administrateurs: [current_administrateur])
|
||||
user.update!(instructeur: @instructeur)
|
||||
|
||||
user.invite!
|
||||
flash.notice = 'Instructeur ajouté'
|
||||
else
|
||||
flash.alert = @instructeur.errors.full_messages
|
||||
flash.alert = user.errors.full_messages
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -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
|
49
app/controllers/users/activate_controller.rb
Normal file
49
app/controllers/users/activate_controller.rb
Normal file
|
@ -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
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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 :
|
|
@ -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'
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) }
|
||||
|
Loading…
Reference in a new issue