app/models/user.rb in bullet_train-1.0.1 vs app/models/user.rb in bullet_train-1.0.2

- old
+ new

@@ -1,43 +1,7 @@ class User < ApplicationRecord - # 🚫 DEFAULT BULLET TRAIN USER FUNCTIONALITY - # Typically you should avoid adding your own functionality in this section to avoid merge conflicts in the future. - # (If you specifically want to change Bullet Train's default behavior, that's OK and you can do that here.) - - if two_factor_authentication_enabled? - devise :two_factor_authenticatable, :two_factor_backupable, :omniauthable, - :registerable, :recoverable, :rememberable, :trackable, :validatable, - otp_secret_encryption_key: ENV["TWO_FACTOR_ENCRYPTION_KEY"] - else - devise :omniauthable, :database_authenticatable, :registerable, - :recoverable, :rememberable, :trackable, :validatable - end - - # teams - has_many :memberships, dependent: :destroy - has_many :scaffolding_absolutely_abstract_creative_concepts_collaborators, through: :memberships - has_many :teams, through: :memberships - belongs_to :current_team, class_name: "Team", optional: true - accepts_nested_attributes_for :current_team - - # oauth providers - has_many :oauth_stripe_accounts, class_name: "Oauth::StripeAccount" if stripe_enabled? - - # platform functionality. - belongs_to :platform_agent_of, class_name: "Platform::Application", optional: true - - # validations - validate :real_emails_only - validates :time_zone, inclusion: {in: ActiveSupport::TimeZone.all.map(&:name)}, allow_nil: true - - # callbacks - after_update :set_teams_time_zone - - # ✅ YOUR APPLICATION'S USER FUNCTIONALITY - # This is the place where you should implement your own features on top of Bullet Train's user functionality. There - # are a bunch of Super Scaffolding hooks here by default to try and help keep generated code logically organized. - + include Users::Core # 🚅 add concerns above. # 🚅 add belongs_to associations above. # 🚅 add has_many associations above. @@ -53,139 +17,6 @@ # 🚅 add callbacks above. # 🚅 add delegations above. # 🚅 add methods above. - - # 🚫 DEFAULT BULLET TRAIN USER FUNCTIONALITY - # We put these at the bottom of this file to keep them out of the way. You should define your own methods above here. - - # TODO we need to update this to some sort of invalid email address or something - # people know to ignore. it would be a security problem to have this pointing - # at anybody's real email address. - def email_is_oauth_placeholder? - !!email.match(/noreply\+.*@bullettrain.co/) - end - - def label_string - name - end - - def name - full_name.present? ? full_name : email - end - - def full_name - [first_name_was, last_name_was].select(&:present?).join(" ") - end - - def details_provided? - first_name.present? && last_name.present? && current_team.name.present? - end - - def send_welcome_email - UserMailer.welcome(self).deliver_later - end - - def create_default_team - # This creates a `Membership`, because `User` `has_many :teams, through: :memberships` - # TODO The team name should take into account the user's current locale. - default_team = teams.create(name: "Your Team", time_zone: time_zone) - memberships.find_by(team: default_team).update role_ids: [Role.admin.id] - update(current_team: default_team) - end - - def real_emails_only - if ENV["REALEMAIL_API_KEY"] && !Rails.env.test? - uri = URI("https://realemail.expeditedaddons.com") - - # Change the input parameters here - uri.query = URI.encode_www_form({ - api_key: ENV["REAL_EMAIL_KEY"], - email: email, - fix_typos: false - }) - - # Results are returned as a JSON object - result = JSON.parse(Net::HTTP.get_response(uri).body) - - if result["syntax_error"] - errors.add(:email, "is not a valid email address") - elsif result["domain_error"] || (result.key?("mx_records_found") && !result["mx_records_found"]) - errors.add(:email, "can't actually receive emails") - elsif result["is_disposable"] - errors.add(:email, "is a disposable email address") - end - end - end - - def multiple_teams? - teams.count > 1 - end - - def one_team? - !multiple_teams? - end - - def formatted_email_address - if details_provided? - "\"#{first_name} #{last_name}\" <#{email}>" - else - email - end - end - - def administrating_team_ids - parent_ids_for(Role.admin, :memberships, :team) - end - - def parent_ids_for(role, through, parent) - parent_id_column = "#{parent}_id" - key = "#{role.key}_#{through}_#{parent_id_column}s" - return ability_cache[key] if ability_cache && ability_cache[key] - role = nil if role.default? - value = send(through).with_role(role).distinct.pluck(parent_id_column) - current_cache = ability_cache || {} - current_cache[key] = value - update_column :ability_cache, current_cache - value - end - - def invalidate_ability_cache - update_column(:ability_cache, {}) - end - - def otp_qr_code - issuer = I18n.t("application.name") - label = "#{issuer}:#{email}" - RQRCode::QRCode.new(otp_provisioning_uri(label, issuer: issuer)) - end - - def scaffolding_absolutely_abstract_creative_concepts_collaborators - Scaffolding::AbsolutelyAbstract::CreativeConcepts::Collaborator.joins(:membership).where(membership: {user_id: id}) - end - - def admin_scaffolding_absolutely_abstract_creative_concepts_ids - scaffolding_absolutely_abstract_creative_concepts_collaborators.admins.pluck(:creative_concept_id) - end - - def editor_scaffolding_absolutely_abstract_creative_concepts_ids - scaffolding_absolutely_abstract_creative_concepts_collaborators.editors.pluck(:creative_concept_id) - end - - def viewer_scaffolding_absolutely_abstract_creative_concepts_ids - scaffolding_absolutely_abstract_creative_concepts_collaborators.viewers.pluck(:creative_concept_id) - end - - def developer? - return false unless ENV["DEVELOPER_EMAILS"] - # we use email_was so they can't try setting their email to the email of an admin. - return false unless email_was - ENV["DEVELOPER_EMAILS"].split(",").include?(email_was) - end - - def set_teams_time_zone - teams.where(time_zone: nil).each do |team| - team.update(time_zone: time_zone) if team.users.count == 1 - end - end end