retrospring/app/models/user.rb

115 lines
3.4 KiB
Ruby
Raw Normal View History

2014-08-01 12:07:16 +02:00
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
2014-08-01 15:27:08 +02:00
:recoverable, :rememberable, :trackable,
:validatable, :authentication_keys => [:login]
2014-11-30 19:43:22 +01:00
2014-08-01 15:27:08 +02:00
# attr_accessor :login
2014-11-30 19:43:22 +01:00
2014-10-28 06:36:38 +01:00
has_many :questions, dependent: :destroy
has_many :answers, dependent: :destroy
has_many :comments, dependent: :destroy
2014-11-10 23:45:36 +01:00
has_many :inboxes, dependent: :destroy
2014-11-30 14:43:35 +01:00
has_many :active_relationships, class_name: 'Relationship',
foreign_key: 'source_id',
dependent: :destroy
has_many :passive_relationships, class_name: 'Relationship',
foreign_key: 'target_id',
dependent: :destroy
has_many :friends, through: :active_relationships, source: :target
has_many :followers, through: :passive_relationships, source: :source
2014-11-30 20:31:22 +01:00
has_many :smiles
2014-12-12 21:42:34 +01:00
has_many :services
2014-12-14 14:34:51 +01:00
has_many :notifications, foreign_key: :recipient_id
2014-11-30 14:43:35 +01:00
2014-08-01 15:27:08 +02:00
SCREEN_NAME_REGEX = /\A[a-zA-Z0-9_]{1,16}\z/
WEBSITE_REGEX = /https?:\/\/([A-Za-z.\-]+)\/?(?:.*)/i
2014-11-30 19:43:22 +01:00
2014-08-01 15:27:08 +02:00
validates :screen_name, presence: true, format: { with: SCREEN_NAME_REGEX }, uniqueness: { case_sensitive: false }
2014-12-12 18:52:56 +01:00
validates :display_name, length: { maximum: 50 }
2014-12-01 23:17:16 +01:00
# validates :website, format: { with: WEBSITE_REGEX }
2014-08-01 15:27:08 +02:00
def login=(login)
@login = login
end
def login
@login || self.screen_name || self.email
end
2014-11-30 19:43:22 +01:00
2014-08-01 15:27:08 +02:00
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["lower(screen_name) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end
2014-11-30 15:39:13 +01:00
# @return [Array] the users' timeline
def timeline
Answer.where("user_id in (?) OR user_id = ?", friend_ids, id).order(:created_at).reverse_order
end
# follows an user.
def follow(target_user)
2014-12-14 14:58:29 +01:00
relationship = active_relationships.create(target: target_user)
Notification.notify target_user, relationship
# increment counts
increment! :friend_count
target_user.increment! :follower_count
end
2014-11-30 15:39:13 +01:00
# unfollows an user
def unfollow(target_user)
active_relationships.find_by(target: target_user).destroy
# decrement counts
decrement! :friend_count
target_user.decrement! :follower_count
end
2014-11-30 20:31:22 +01:00
# @return [Boolean] true if +self+ is following +target_user+
def following?(target_user)
friends.include? target_user
end
2014-11-30 19:43:22 +01:00
# smiles an answer
# @param answer [Answer] the answer to smile
def smile(answer)
Smile.create(user: self, answer: answer)
increment! :smiled_count
answer.increment! :smile_count
end
# unsmile an answer
# @param answer [Answer] the answer to unsmile
def unsmile(answer)
Smile.find_by(user: self, answer: answer).destroy
decrement! :smiled_count
answer.decrement! :smile_count
end
2014-11-30 20:31:22 +01:00
def smiled?(answer)
# TODO: you know what to do here, nilsding
answer.smiles.each { |s| return true if s.user_id == self.id }
false
end
def display_website
website.match(/https?:\/\/([A-Za-z.\-]+)\/?(?:.*)/i)[1]
rescue NoMethodError
website
end
2014-12-05 14:11:08 +01:00
def comment(answer, content)
2014-12-07 14:29:35 +01:00
Comment.create!(user: self, answer: answer, content: content)
2014-12-05 14:11:08 +01:00
increment! :commented_count
answer.increment! :comment_count
end
2014-08-01 12:07:16 +02:00
end