From d1c540439e369bf8b78e1dd1962e7f4674163fbb Mon Sep 17 00:00:00 2001 From: Raphael Date: Tue, 24 Aug 2010 12:13:10 -0700 Subject: [PATCH] Moved friending out to a lib file, specs all pass --- app/controllers/application_controller.rb | 6 +- app/models/user.rb | 130 +------------------- lib/diaspora/user/friending.rb | 126 +++++++++++++++++++ spec/controllers/publics_controller_spec.rb | 3 +- spec/models/user/user_friending_spec.rb | 2 +- 5 files changed, 134 insertions(+), 133 deletions(-) create mode 100644 lib/diaspora/user/friending.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6e4a43e86..4e9654c72 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -16,9 +16,9 @@ class ApplicationController < ActionController::Base end def set_friends_and_status - if current_user - @groups = current_user.groups - end + @group = :all + @groups = current_user.groups + @friends = current_user.friends end def count_requests diff --git a/app/models/user.rb b/app/models/user.rb index 00da8ed15..0b3b4b06a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,6 +1,8 @@ +require 'lib/diaspora/user/friending.rb' + class User include MongoMapper::Document - + include Diaspora::UserModules::Friending devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable @@ -123,128 +125,6 @@ class User end end - ######### Friend Requesting ########### - def send_friend_request_to(friend_url, group_id) - raise "You are already friends with that person!" if self.friends.detect{ |x| x.receive_url == friend_url} - request = Request.instantiate(:to => friend_url, :from => self.person, :into => group_id) - if request.save - self.pending_requests << request - self.save - - group = self.group_by_id(group_id) - - group.requests << request - group.save - - request.push_to_url friend_url - end - request - end - - - def accept_friend_request(friend_request_id, group_id) - request = Request.find_by_id(friend_request_id) - pending_requests.delete(request) - - activate_friend(request.person, group_by_id(group_id)) - - request.reverse_for(self) - request - end - - def dispatch_friend_acceptance(request) - request.push_to_url(request.callback_url) - request.destroy unless request.callback_url.include? url - end - - def accept_and_respond(friend_request_id, group_id) - dispatch_friend_acceptance(accept_friend_request(friend_request_id, group_id)) - end - - def ignore_friend_request(friend_request_id) - request = Request.find_by_id(friend_request_id) - person = request.person - - person.user_refs -= 1 - - self.pending_requests.delete(request) - self.save - - (person.user_refs > 0 || person.owner.nil? == false) ? person.save : person.destroy - request.destroy - end - - def receive_friend_request(friend_request) - Rails.logger.info("receiving friend request #{friend_request.to_json}") - - if request_from_me?(friend_request) - group = self.group_by_id(friend_request.group_id) - activate_friend(friend_request.person, group) - - Rails.logger.info("#{self.real_name}'s friend request has been accepted") - - friend_request.destroy - else - - friend_request.person.user_refs += 1 - friend_request.person.save - self.pending_requests << friend_request - self.save - Rails.logger.info("#{self.real_name} has received a friend request") - friend_request.save - end - end - - def unfriend(bad_friend) - Rails.logger.info("#{self.real_name} is unfriending #{bad_friend.inspect}") - retraction = Retraction.for(self) - retraction.creator_signature = retraction.sign_with_key(encryption_key) - retraction.push_to_url(bad_friend.receive_url) - remove_friend(bad_friend) - end - - def remove_friend(bad_friend) - raise "Friend not deleted" unless self.friend_ids.delete( bad_friend.id ) - groups.each{|g| g.person_ids.delete( bad_friend.id )} - self.save - - self.raw_visible_posts.find_all_by_person_id( bad_friend.id ).each{|post| - self.visible_post_ids.delete( post.id ) - post.user_refs -= 1 - (post.user_refs > 0 || post.person.owner.nil? == false) ? post.save : post.destroy - } - self.save - - bad_friend.user_refs -= 1 - (bad_friend.user_refs > 0 || bad_friend.owner.nil? == false) ? bad_friend.save : bad_friend.destroy - end - - def unfriended_by(bad_friend) - Rails.logger.info("#{self.real_name} is being unfriended by #{bad_friend.inspect}") - remove_friend bad_friend - end - - def send_request(rel_hash, group) - if rel_hash[:friend] - self.send_friend_request_to(rel_hash[:friend], group) - else - raise "you can't do anything to that url" - end - end - - def activate_friend(person, group) - person.user_refs += 1 - group.people << person - friends << person - person.save - group.save - save - end - - def request_from_me?(request) - pending_requests.detect{|req| (req.callback_url == person.receive_url) && (req.destination_url == person.receive_url)} - end - ###### Receiving ####### def receive xml object = Diaspora::Parser.from_xml(xml) @@ -349,10 +229,6 @@ class User OpenSSL::PKey::RSA::generate 1024 end - def self.generate_key - OpenSSL::PKey::RSA::generate 1024 - end - def ensure_bson id id.class == String ? BSON::ObjectID(id) : id end diff --git a/lib/diaspora/user/friending.rb b/lib/diaspora/user/friending.rb new file mode 100644 index 000000000..e80ee5aa5 --- /dev/null +++ b/lib/diaspora/user/friending.rb @@ -0,0 +1,126 @@ +module Diaspora + module UserModules + module Friending + def send_friend_request_to(friend_url, group_id) + raise "You are already friends with that person!" if self.friends.detect{ |x| x.receive_url == friend_url} + request = Request.instantiate(:to => friend_url, :from => self.person, :into => group_id) + if request.save + self.pending_requests << request + self.save + + group = self.group_by_id(group_id) + + group.requests << request + group.save + + request.push_to_url friend_url + end + request + end + + + def accept_friend_request(friend_request_id, group_id) + request = Request.find_by_id(friend_request_id) + pending_requests.delete(request) + + activate_friend(request.person, group_by_id(group_id)) + + request.reverse_for(self) + request + end + + def dispatch_friend_acceptance(request) + request.push_to_url(request.callback_url) + request.destroy unless request.callback_url.include? url + end + + def accept_and_respond(friend_request_id, group_id) + dispatch_friend_acceptance(accept_friend_request(friend_request_id, group_id)) + end + + def ignore_friend_request(friend_request_id) + request = Request.find_by_id(friend_request_id) + person = request.person + + person.user_refs -= 1 + + self.pending_requests.delete(request) + self.save + + (person.user_refs > 0 || person.owner.nil? == false) ? person.save : person.destroy + request.destroy + end + + def receive_friend_request(friend_request) + Rails.logger.info("receiving friend request #{friend_request.to_json}") + + if request_from_me?(friend_request) + group = self.group_by_id(friend_request.group_id) + activate_friend(friend_request.person, group) + + Rails.logger.info("#{self.real_name}'s friend request has been accepted") + + friend_request.destroy + else + + friend_request.person.user_refs += 1 + friend_request.person.save + self.pending_requests << friend_request + self.save + Rails.logger.info("#{self.real_name} has received a friend request") + friend_request.save + end + end + + def unfriend(bad_friend) + Rails.logger.info("#{self.real_name} is unfriending #{bad_friend.inspect}") + retraction = Retraction.for(self) + retraction.creator_signature = retraction.sign_with_key(encryption_key) + retraction.push_to_url(bad_friend.receive_url) + remove_friend(bad_friend) + end + + def remove_friend(bad_friend) + raise "Friend not deleted" unless self.friend_ids.delete( bad_friend.id ) + groups.each{|g| g.person_ids.delete( bad_friend.id )} + self.save + + self.raw_visible_posts.find_all_by_person_id( bad_friend.id ).each{|post| + self.visible_post_ids.delete( post.id ) + post.user_refs -= 1 + (post.user_refs > 0 || post.person.owner.nil? == false) ? post.save : post.destroy + } + self.save + + bad_friend.user_refs -= 1 + (bad_friend.user_refs > 0 || bad_friend.owner.nil? == false) ? bad_friend.save : bad_friend.destroy + end + + def unfriended_by(bad_friend) + Rails.logger.info("#{self.real_name} is being unfriended by #{bad_friend.inspect}") + remove_friend bad_friend + end + + def send_request(rel_hash, group) + if rel_hash[:friend] + self.send_friend_request_to(rel_hash[:friend], group) + else + raise "you can't do anything to that url" + end + end + + def activate_friend(person, group) + person.user_refs += 1 + group.people << person + friends << person + person.save + group.save + save + end + + def request_from_me?(request) + pending_requests.detect{|req| (req.callback_url == person.receive_url) && (req.destination_url == person.receive_url)} + end + end + end +end diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index 8ef2a30c8..dfe1e461b 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -16,11 +16,10 @@ describe PublicsController do end it 'should accept a post from another node and save the information' do - pending person = Factory.create(:person) message = StatusMessage.new(:message => 'foo', :person => person) StatusMessage.all.count.should be 0 - post :receive, :id => @user.person.id, :xml => message.to_diaspora_xml(message) + post :receive, :id => @user.person.id, :xml => message.to_diaspora_xml StatusMessage.all.count.should be 1 end end diff --git a/spec/models/user/user_friending_spec.rb b/spec/models/user/user_friending_spec.rb index 2eff093bf..6bf4c1117 100644 --- a/spec/models/user/user_friending_spec.rb +++ b/spec/models/user/user_friending_spec.rb @@ -48,7 +48,7 @@ describe User do @user.save - @user.send_friend_request_to( friend.receive_url, @group.id ).should be nil + proc {@user.send_friend_request_to( friend.receive_url, @group.id )}.should raise_error end