Merge pull request #6774 from betagouv/US/merge-with-same-email-fail
fix(profil_controller#update_email): changing email from current_user.email to current_user.email destroy current user. whoops ☠️'
This commit is contained in:
commit
a416a5ae33
5 changed files with 36 additions and 7 deletions
|
@ -14,9 +14,7 @@ module Users
|
||||||
|
|
||||||
def update_email
|
def update_email
|
||||||
requested_user = User.find_by(email: requested_email)
|
requested_user = User.find_by(email: requested_email)
|
||||||
|
if requested_user.present? && current_user.ask_for_merge(requested_user)
|
||||||
if requested_user.present?
|
|
||||||
current_user.ask_for_merge(requested_user)
|
|
||||||
current_user.update(unconfirmed_email: nil)
|
current_user.update(unconfirmed_email: nil)
|
||||||
|
|
||||||
flash.notice = t('devise.registrations.update_needs_confirmation')
|
flash.notice = t('devise.registrations.update_needs_confirmation')
|
||||||
|
|
|
@ -63,6 +63,8 @@ class User < ApplicationRecord
|
||||||
|
|
||||||
before_validation -> { sanitize_email(:email) }
|
before_validation -> { sanitize_email(:email) }
|
||||||
|
|
||||||
|
validate :does_not_merge_on_self, if: :requested_merge_into_id_changed?
|
||||||
|
|
||||||
def validate_password_complexity?
|
def validate_password_complexity?
|
||||||
administrateur?
|
administrateur?
|
||||||
end
|
end
|
||||||
|
@ -223,12 +225,21 @@ class User < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def ask_for_merge(requested_user)
|
def ask_for_merge(requested_user)
|
||||||
update(requested_merge_into: requested_user)
|
if update(requested_merge_into: requested_user)
|
||||||
UserMailer.ask_for_merge(self, requested_user.email).deliver_later
|
UserMailer.ask_for_merge(self, requested_user.email).deliver_later
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def does_not_merge_on_self
|
||||||
|
return if requested_merge_into_id != self.id
|
||||||
|
errors.add(:requested_merge_into, :same)
|
||||||
|
end
|
||||||
|
|
||||||
def link_invites!
|
def link_invites!
|
||||||
Invite.where(email: email).update_all(user_id: id)
|
Invite.where(email: email).update_all(user_id: id)
|
||||||
end
|
end
|
||||||
|
|
|
@ -244,9 +244,16 @@ en:
|
||||||
one: User
|
one: User
|
||||||
other: Users
|
other: Users
|
||||||
attributes:
|
attributes:
|
||||||
|
default_attributes: &default_attributes
|
||||||
|
password: 'password'
|
||||||
|
requested_merge_into: 'new email address'
|
||||||
user:
|
user:
|
||||||
siret: 'SIRET number'
|
siret: 'SIRET number'
|
||||||
password: 'password'
|
<< : *default_attributes
|
||||||
|
instructeur:
|
||||||
|
<< : *default_attributes
|
||||||
|
super_admin:
|
||||||
|
<< : *default_attributes
|
||||||
instructeur:
|
instructeur:
|
||||||
password: 'password'
|
password: 'password'
|
||||||
errors:
|
errors:
|
||||||
|
@ -268,6 +275,8 @@ en:
|
||||||
too_short: 'is too short'
|
too_short: 'is too short'
|
||||||
password_confirmation:
|
password_confirmation:
|
||||||
confirmation: ': The two passwords do not match'
|
confirmation: ': The two passwords do not match'
|
||||||
|
requested_merge_into:
|
||||||
|
same: "can't be the same as the old one"
|
||||||
invite:
|
invite:
|
||||||
attributes:
|
attributes:
|
||||||
email:
|
email:
|
||||||
|
|
|
@ -244,6 +244,7 @@ fr:
|
||||||
attributes:
|
attributes:
|
||||||
default_attributes: &default_attributes
|
default_attributes: &default_attributes
|
||||||
password: 'Le mot de passe'
|
password: 'Le mot de passe'
|
||||||
|
requested_merge_into: 'La nouvelle adresse email'
|
||||||
user:
|
user:
|
||||||
siret: 'Numéro SIRET'
|
siret: 'Numéro SIRET'
|
||||||
<< : *default_attributes
|
<< : *default_attributes
|
||||||
|
@ -273,6 +274,8 @@ fr:
|
||||||
not_strong: 'n’est pas assez complexe'
|
not_strong: 'n’est pas assez complexe'
|
||||||
password_confirmation:
|
password_confirmation:
|
||||||
confirmation: ': Les deux mots de passe ne correspondent pas'
|
confirmation: ': Les deux mots de passe ne correspondent pas'
|
||||||
|
requested_merge_into:
|
||||||
|
same: "ne peut être identique à l’ancienne"
|
||||||
invite:
|
invite:
|
||||||
attributes:
|
attributes:
|
||||||
email:
|
email:
|
||||||
|
|
|
@ -48,6 +48,14 @@ describe Users::ProfilController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'PATCH #update_email' do
|
describe 'PATCH #update_email' do
|
||||||
|
context 'when email is same as user' do
|
||||||
|
it 'fails' do
|
||||||
|
patch :update_email, params: { user: { email: user.email } }
|
||||||
|
expect(response).to have_http_status(302)
|
||||||
|
expect(flash[:alert]).to eq(["La nouvelle adresse email ne peut être identique à l’ancienne"])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when everything is fine' do
|
context 'when everything is fine' do
|
||||||
let(:previous_request) { create(:user) }
|
let(:previous_request) { create(:user) }
|
||||||
|
|
||||||
|
@ -69,7 +77,7 @@ describe Users::ProfilController, type: :controller do
|
||||||
before do
|
before do
|
||||||
user.update(unconfirmed_email: 'unconfirmed@mail.com')
|
user.update(unconfirmed_email: 'unconfirmed@mail.com')
|
||||||
|
|
||||||
expect_any_instance_of(User).to receive(:ask_for_merge).with(existing_user)
|
expect(UserMailer).to receive(:ask_for_merge).with(user, existing_user.email).and_return(double(deliver_later: true))
|
||||||
|
|
||||||
perform_enqueued_jobs do
|
perform_enqueued_jobs do
|
||||||
patch :update_email, params: { user: { email: existing_user.email } }
|
patch :update_email, params: { user: { email: existing_user.email } }
|
||||||
|
|
Loading…
Add table
Reference in a new issue