enwords/enwords

View on GitHub
app/models/user.rb

Summary

Maintainability
A
55 mins
Test Coverage
class User < ApplicationRecord
  has_many :authentications, class_name: 'UserAuthentication'
  has_many :word_statuses, dependent: :delete_all
  has_many :words, through: :word_statuses
  has_many :articles, dependent: :delete_all
  has_many :grammar_eng_user_irregular_verbs, class_name: 'Grammar::Eng::UserIrregularVerb'
  has_many :grammar_eng_user_phrasal_verbs, class_name: 'Grammar::Eng::UserPhrasalVerb'
  has_many :grammar_eng_user_idioms, class_name: 'Grammar::Eng::UserIdiom'
  has_many :subscriptions
  has_many :payments

  has_one :training
  has_one :skyeng_setting
  has_one :telegram_chat

  devise :omniauthable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  enum role: %i[user vip admin]
  enum native_language: Rails.configuration.languages['enums'], _prefix: :native
  enum learning_language: Rails.configuration.languages['enums'], _prefix: :learning

  store_accessor :additional_info,
                 :proficiency_levels,
                 :sign_up_params,
                 :skyeng_words_count

  after_create :create_test_article
  after_create :set_default_learning_words
  after_create :set_default_settings

  def self.testee
    find_by!(email: 'testee@qqq.qqq')
  end

  def update_with_password(params, *options)
    current_password = params.delete(:current_password)

    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank?
    end

    result = if params[:password].blank? || valid_password?(current_password)
               update_attributes(params, *options)
             else
               assign_attributes(params, *options)
               valid?
               errors.add(:current_password, current_password.blank? ? :blank : :invalid)
               false
             end
    clean_up_passwords
    result
  end

  def proficiency_level
    proficiency_levels.try(:[], learning_language) || 0
  end

  def set_default_learning_words
    Word::UpdateState.run(ids: [680, 833, 843, 902, 909], to_state: 'learning', user: self)
  end

  def create_test_article
    return unless Rails.env.production?

    Article.find(34).dup.update(user_id: id)
  end

  def set_default_settings
    self.proficiency_levels = {}
    proficiency_levels[learning_language] = 40
    self.sentences_number = 3
    self.audio_enable = true
    self.diversity_enable = true if learning_language == 'eng'
    save!
  end

  def premium?
    return true

    subscriptions.status_active.exists?
  end
end