jdrago999/distribot-ui

View on GitHub
app/models/user.rb

Summary

Maintainability
A
0 mins
Test Coverage

class User < RedisModel
  attr_accessor :id, :email, :password_digest

  require 'bcrypt'
  include BCrypt
  before_create :assign_id
  before_create :hash_password
  validate :email_is_not_taken
  validate :email_is_valid
  validates :password, presence: true, on: :create


  def to_hash
    raw = {
      email: self.email,
      password_digest: password_digest
    }
  end

  def password
    @password ||= Password.new(password_digest)
  end

  def password=(new_password)
    @password = new_password
    self.password_digest = Password.create(@password)
  end

  def authenticate(given_password)
    password == given_password
  end

  protected

  def serialize
    return self.to_hash.to_json
  end

  def create
    run_callbacks :create do
      self.store
      true
    end
  end

  def store
    redis.multi do
      # Insert into redis:
      redis.set("distribot.#{table}.by.id:#{self.id}", self.serialize)
      # Save our email address-to-token:
      redis.set("distribot.#{table}.by.email:#{self.email}", self.id)
    end
  end

  private

  def hash_password
#    self.password_digest = @password
  end

  def assign_id
    self.id ||= SecureRandom.uuid
  end

  def email_is_valid
    if self.email.to_s.blank?
      self.errors.add :email, "can't be blank"
    end
    unless self.email.to_s =~ %r{^.+?@.+?\..+$}
      self.errors.add :email, 'invalid'
    end
  end

  def email_is_not_taken
    # Make sure that no user exists with the email address:
    other_user = User.find_by(email: self.email)
    if other_user && other_user.id != self.id
      self.errors.add :email, 'already taken'
    end
  end

end