diaspora/lib/diaspora/user/connecting.rb

109 lines
3.9 KiB
Ruby

# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
module Diaspora
module UserModules
module Connecting
def send_contact_request_to(desired_contact, aspect)
contact = Contact.new(:person => desired_contact,
:user => self,
:pending => true)
contact.aspects << aspect
if contact.save!
request = contact.dispatch_request
request
else
nil
end
end
def accept_contact_request(request, aspect)
activate_contact(request.sender, aspect)
request.destroy
request.reverse_for(self)
end
def dispatch_contact_acceptance(request, requester)
push_to_people request, [requester]
request.destroy unless request.sender.owner
end
def accept_and_respond(contact_request_id, aspect_id)
request = Request.to(self.person).find!(contact_request_id)
requester = request.sender
reversed_request = accept_contact_request(request, aspects.where(:id => aspect_id).first )
dispatch_contact_acceptance reversed_request, requester
end
def ignore_contact_request(contact_request_id)
request = Request.to(self.person).find!(contact_request_id)
request.destroy
end
def receive_contact_request(contact_request)
#response from a contact request you sent
if original_contact = self.contact_for(contact_request.sender)
receive_request_acceptance(contact_request, original_contact)
#this is a new contact request
elsif contact_request.sender != self.person
if contact_request.save!
Rails.logger.info("event=contact_request status=received_new_request from=#{contact_request.sender.diaspora_handle} to=#{self.diaspora_handle}")
self.mail(Jobs::MailRequestReceived, self.id, contact_request.sender.id)
end
else
Rails.logger.info "event=contact_request status=abort from=#{contact_request.sender.diaspora_handle} to=#{self.diaspora_handle} reason=self-love"
return nil
end
contact_request
end
def receive_request_acceptance(received_request, contact)
contact.pending = false
contact.save
Rails.logger.info("event=contact_request status=received_acceptance from=#{received_request.sender.diaspora_handle} to=#{self.diaspora_handle}")
received_request.destroy
self.save
self.mail(Jobs::MailRequestAcceptance, self.id, received_request.sender.id)
end
def disconnect(bad_contact)
Rails.logger.info("event=disconnect user=#{diaspora_handle} target=#{bad_contact.diaspora_handle}")
retraction = Retraction.for(self)
push_to_people retraction, [bad_contact]
remove_contact(bad_contact)
end
def remove_contact(bad_person)
contact = contact_for(bad_person)
posts = raw_visible_posts.where(:person_id => bad_person.id)
visibilities = PostVisibility.joins(:post, :aspect).where(
:posts => {:person_id => bad_person.id},
:aspects => {:user_id => self.id}
)
visibility_ids = visibilities.map{|v| v.id}
PostVisibility.where(:id => visibility_ids).delete_all
posts.each do |post|
post.decrement_user_refs
end
raise "Contact not deleted" unless contact.destroy
end
def disconnected_by(bad_contact)
Rails.logger.info("event=disconnected_by user=#{diaspora_handle} target=#{bad_contact.diaspora_handle}")
remove_contact bad_contact
end
def activate_contact(person, aspect)
new_contact = Contact.create!(:user => self,
:person => person,
:aspects => [aspect],
:pending => false)
end
end
end
end