class GraphqlDevise::Model::WithEmailUpdater

Public Class Methods

new(resource, attributes) click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 6
def initialize(resource, attributes)
  @attributes = attributes.with_indifferent_access
  @resource   = resource
end

Public Instance Methods

call() click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 11
def call
  check_deprecated_attributes

  resource_attributes = @attributes.except(:schema_url, :confirmation_success_url, :confirmation_url)
  return @resource.update(resource_attributes) unless requires_reconfirmation?(resource_attributes)

  @resource.assign_attributes(resource_attributes)

  if @resource.email == email_in_database
    return @resource.save
  elsif required_reconfirm_attributes?
    return false unless @resource.valid?

    store_unconfirmed_email
    saved = @resource.save
    send_confirmation_instructions(saved)

    saved
  else
    raise(
      GraphqlDevise::Error,
      'Method `update_with_email` requires attribute `confirmation_url` for email reconfirmation to work'
    )
  end
end

Private Instance Methods

check_deprecated_attributes() click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 39
      def check_deprecated_attributes
        if [@attributes[:schema_url], @attributes[:confirmation_success_url]].any?(&:present?)
          ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc, caller)
            Providing `schema_url` and `confirmation_success_url` to `update_with_email` is deprecated and will be
            removed in a future version of this gem.

            Now you must only provide `confirmation_url` and the email will contain the new format of the confirmation
            url that needs to be used with the new `confirmRegistrationWithToken` on the client application.
          DEPRECATION
        end
      end
confirmation_method_params() click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 80
def confirmation_method_params
  if @attributes[:schema_url].present?
    {
      redirect_url: @attributes[:confirmation_success_url] || DeviseTokenAuth.default_confirm_success_url,
      schema_url:   @attributes[:schema_url]
    }
  else
    { redirect_url: @attributes[:confirmation_url] || DeviseTokenAuth.default_confirm_success_url }
  end
end
email_in_database() click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 72
def email_in_database
  if Devise.activerecord51?
    @resource.email_in_database
  else
    @resource.email_was
  end
end
required_reconfirm_attributes?() click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 51
def required_reconfirm_attributes?
  if @attributes[:schema_url].present?
    [@attributes[:confirmation_success_url], DeviseTokenAuth.default_confirm_success_url].any?(&:present?)
  else
    [@attributes[:confirmation_url], DeviseTokenAuth.default_confirm_success_url].any?(&:present?)
  end
end
requires_reconfirmation?(resource_attributes) click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 59
def requires_reconfirmation?(resource_attributes)
  resource_attributes.key?(:email) &&
    @resource.devise_modules.include?(:confirmable) &&
    @resource.respond_to?(:unconfirmed_email=)
end
send_confirmation_instructions(saved) click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 91
def send_confirmation_instructions(saved)
  return unless saved

  @resource.send_confirmation_instructions(
    confirmation_method_params.merge(template_path: ['graphql_devise/mailer'])
  )
end
store_unconfirmed_email() click to toggle source
# File lib/graphql_devise/model/with_email_updater.rb, line 65
def store_unconfirmed_email
  @resource.unconfirmed_email  = @resource.email
  @resource.confirmation_token = nil
  @resource.email              = email_in_database
  @resource.send(:generate_confirmation_token)
end