109 lines
3.9 KiB
Ruby
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
|