mysociety/alaveteli

View on GitHub
app/models/user/email_alerts.rb

Summary

Maintainability
A
0 mins
Test Coverage
class User
  # Public: Advanced mechanisms to control a User's email alert preferences.
  class EmailAlerts
    # Public: Find a User by a token String and disable their email alerts.
    #
    # token - String token generated by the `verifier`.
    #
    # Returns a Boolean.
    def self.disable_by_token(token)
      id = verifier.verify(token)
      new(User.find(id)).disable
    rescue ActiveSupport::MessageVerifier::InvalidSignature
      false
    rescue ActiveRecord::RecordNotFound
      false
    end

    # Public: Generate a unique token for managing the User's email alerts.
    #
    # user - The User to generate a token for.
    #
    # Returns a String.
    def self.token(user)
      verifier.generate(user.id)
    end

    # A `MessageVerifier` to generate tokens specifically for managing email
    # alerts.
    #
    # The secret used is the class name, so tokens generated by another
    # `MessageVerifier` will not be valid when used with this class.
    #
    # Returns an `ActiveSupport::MessageVerifier`.
    def self.verifier
      Rails.application.message_verifier(to_s)
    end

    def initialize(user)
      @user = user
    end

    # Public: Disable email alerts for the User.
    #
    # Returns a Boolean.
    def disable
      user.update(receive_email_alerts: false)
    end

    private

    attr_reader :user
  end
end