Files

117 lines
2.6 KiB
Ruby

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable, :recoverable, :rememberable,
:trackable, :validatable, :omniauthable
before_create :set_name, :generate_auth_key
after_create :set_avatar
has_many :comments
has_many :likes
has_many :favorites
has_many :share_instances
has_many :auth_tokens
has_many :follow_relations
has_many :stars, through: :follow_relations, source: :star, primary_key: :user_id ,foreign_key: :user_id
has_many :timeline_sources
has_one :avatar
has_one :identity
acts_as_paranoid
def self.json_attrs
[:id, :email, :name]
end
def followers
user_ids = FollowRelation.where(star_id: self.id).pluck(:user_id)
User.where(id: user_ids)
end
def followers_ids
FollowRelation.where(star_id: self.id).pluck(:user_id)
end
def active_auth_token
if auth_tokens.empty?
generate_auth_key
end
auth_tokens.first.value
end
def avatar_url
avatar.try(:file).try(:url) || external_avatar
end
def self.find_for_oauth(auth, signed_in_resource = nil)
identity = Identity.find_for_oauth(auth)
user = signed_in_resource ? signed_in_resource : identity.user
if user.nil?
email_is_verified = auth.info.email && (auth.info.verified || auth.info.verified_email)
email = auth.info.email if email_is_verified
user = User.where(:email => email).first if email
if user.nil?
name = auth.info.nickname || auth.extra.raw_info.name
avatar = auth.info.image
user = create_user_from_oauth(auth.uid, auth.provider, name, nil, avatar)
end
end
if identity.user != user
identity.user = user
identity.save!
end
user
end
def email_verified?
true
end
def self.create_user_from_oauth(uid, provider, name, email, avatar)
user = User.new(
name: name || uid,
email: email ? email : "#{uid}-#{provider}@librme.com",
password: Devise.friendly_token[0, 20]
)
user.create_avatar file: URI.parse(avatar) if avatar.present?
user.save!
user
end
private
def set_name
unless self.name
email_name = email.split('@')[0]
self.name = email_name
end
end
def ensure_authentication_token
if auth_keys.empty?
generate_auth_key
end
end
def generate_auth_key
AuthToken.generate_token_for self
end
def set_avatar
# UserAvatarWorker.perform_async(self.id) unless self.external_avatar
end
end