105 lines
3.5 KiB
Ruby
105 lines
3.5 KiB
Ruby
module JamRuby
|
|
class FriendRequest < ActiveRecord::Base
|
|
include HtmlSanitize
|
|
html_sanitize strict: [:message]
|
|
|
|
self.primary_key = 'id'
|
|
|
|
STATUS = %w(accept block spam ignore)
|
|
|
|
belongs_to :user, :class_name => "JamRuby::User", :foreign_key => 'user_id'
|
|
belongs_to :friend, :class_name => "JamRuby::User", :foreign_key => 'friend_id'
|
|
|
|
validates :user_id, :presence => true
|
|
validates :friend_id, :presence => true
|
|
#validates :status, :inclusion => {:in => STATUS}
|
|
validates :message, no_profanity: true
|
|
|
|
validate :same_school_protection
|
|
|
|
def same_school_protection
|
|
if self.user_id && self.user.nil?
|
|
self.user = User.find(user_id)
|
|
end
|
|
if self.friend_id && self.friend.nil?
|
|
self.friend = User.find(friend_id)
|
|
end
|
|
|
|
if self.user && self.friend
|
|
if !self.user.is_platform_instructor && !self.friend.is_platform_instructor
|
|
if self.user.school_id != self.friend.school_id
|
|
errors.add(:friend, ValidationMessages::CAN_ONLY_CHAT_SAME_SCHOOL)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def to_s
|
|
"#{self.id} => #{self.user.to_s}:#{self.friend.to_s}"
|
|
end
|
|
|
|
def self.invited_path(invited_user, sender, message)
|
|
friend_request = self.save(nil, sender.id, invited_user.id, nil, message, supress_initial: true)
|
|
self.save(friend_request.id, sender.id, invited_user.id, 'accept', message, supress_initial: true)
|
|
end
|
|
|
|
def self.save(id, user_id, friend_id, status, message, supress_initial: false)
|
|
# new friend request
|
|
if id.nil?
|
|
friend_request = FriendRequest.new
|
|
friend_request = validate_friend_request(friend_request, user_id, friend_id)
|
|
friend_request.user_id = user_id
|
|
friend_request.friend_id = friend_id
|
|
friend_request.message = message
|
|
if friend_request.save
|
|
# send notification
|
|
Notification.send_friend_request(friend_request.id, user_id, friend_id) unless supress_initial
|
|
end
|
|
|
|
|
|
else
|
|
ActiveRecord::Base.transaction do
|
|
friend_request = FriendRequest.find(id)
|
|
friend_request.status = status
|
|
friend_request.save
|
|
|
|
duplicate_requests = FriendRequest.where("user_id = ? AND friend_id = ?", user_id, friend_id)
|
|
|
|
duplicate_requests.each do |req|
|
|
req.status = status
|
|
req.save
|
|
end
|
|
|
|
# create both records for this friendship
|
|
if friend_request.status == "accept"
|
|
if Friendship.save(friend_request.user_id, friend_request.friend_id)
|
|
# send notification
|
|
Notification.send_friend_request_accepted(friend_request.user_id, friend_request.friend_id)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return friend_request
|
|
end
|
|
|
|
private
|
|
def self.validate_friend_request(friend_request, user_id, friend_id)
|
|
friend_requests = FriendRequest.where("user_id='#{user_id}' AND friend_id='#{friend_id}'")
|
|
|
|
# check if there are any friend requests for this source/target user combo, and if
|
|
# any have been marked as spam or blocked, set the status of this friend request
|
|
# to match so it doesn't show up in the queue
|
|
unless friend_requests.nil? || friend_requests.size == 0
|
|
if friend_requests.exists?(:status => "spam")
|
|
friend_request.status = "spam"
|
|
|
|
elsif friend_requests.exists?(:status => "block")
|
|
friend_request.status = "block"
|
|
end
|
|
end
|
|
return friend_request
|
|
end
|
|
end
|
|
end
|