diff --git a/app/controllers/verification/email_controller.rb b/app/controllers/verification/email_controller.rb new file mode 100644 index 000000000..ebcbf68ab --- /dev/null +++ b/app/controllers/verification/email_controller.rb @@ -0,0 +1,31 @@ +class Verification::EmailController < ApplicationController + before_action :authenticate_user! + before_action :set_verified_user + skip_authorization_check + + def show + if Email.find(current_user, params[:email_verification_token]) + current_user.update(verified_at: Time.now) + redirect_to account_path, notice: t('verification.email.show.flash.success') + else + redirect_to verified_user_path, alert: t('verification.email.show.alert.failure') + end + end + + def create + @email = Email.new(@verified_user) + if @email.save + current_user.reload + Mailer.email_verification(current_user, @email.recipient, @email.encrypted_token).deliver_now + redirect_to account_path, notice: t('verification.email.create.flash.success', email: @verified_user.email) + else + redirect_to verified_user_path, alert: t('verification.email.create.alert.failure') + end + end + + private + + def set_verified_user + @verified_user = VerifiedUser.by_user(current_user).by_email(params[:recipient]).first + end +end \ No newline at end of file diff --git a/app/mailers/mailer.rb b/app/mailers/mailer.rb index 04160022e..a3db690a8 100644 --- a/app/mailers/mailer.rb +++ b/app/mailers/mailer.rb @@ -14,4 +14,11 @@ class Mailer < ApplicationMailer mail(to: @recipient.email, subject: t('mailer.reply.subject')) end + def email_verification(user, recipient, token) + @user = user + @recipient = recipient + @token = token + mail(to: @recipient, subject: "Verifica tu email") + end + end diff --git a/app/models/email.rb b/app/models/email.rb new file mode 100644 index 000000000..e5e15c49f --- /dev/null +++ b/app/models/email.rb @@ -0,0 +1,34 @@ +class Email + include ActiveModel::Model + + attr_accessor :verified_user, :recipient, :plain_token, :encrypted_token + + validates :verified_user, presence: true + validates :recipient, presence: true + + def initialize(verified_user) + @verified_user = verified_user + @recipient = @verified_user.try(:email) + end + + def save + return false unless valid? + + generate_token + user = User.where(document_number: verified_user.document_number).first + user.update(email_verification_token: @plain_token) + end + + def generate_token + @plain_token, @encrypted_token = Devise.token_generator.generate(User, :email_verification_token) + end + + def self.find(user, token) + self.valid_token?(user, token) + end + + def self.valid_token?(user, token) + Devise.token_generator.digest(User, :email_verification_token, user.email_verification_token) == token + end + +end diff --git a/app/views/mailer/email_verification.html.erb b/app/views/mailer/email_verification.html.erb new file mode 100644 index 000000000..ce5e1a783 --- /dev/null +++ b/app/views/mailer/email_verification.html.erb @@ -0,0 +1 @@ +

<%= link_to "Confirma tu email", email_url(email_verification_token: @token) %>

diff --git a/app/views/verification/email/_form.html.erb b/app/views/verification/email/_form.html.erb new file mode 100644 index 000000000..94039e5e2 --- /dev/null +++ b/app/views/verification/email/_form.html.erb @@ -0,0 +1,4 @@ +<%= form_for Email.new(verified_user), url: email_path, method: :post do |f| %> + <%= hidden_field_tag :recipient, verified_user.email %> + <%= f.submit t('verification.email.form.submit_button') %> +<% end %> \ No newline at end of file