diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index b93a9f059eac06929112d0f07877370c7eaee56f..5d0fc35feb6eb1bc644aa1e7e522d941478bdf25 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -15,7 +15,7 @@ class PeopleController < ApplicationController end def destroy - current_user.unfriend(params[:id]) + current_user.unfriend(current_user.friends.first(params[:id])) flash[:notice] = "unfriended person." redirect_to people_url end diff --git a/app/models/person.rb b/app/models/person.rb index d703c047930cdfde2a1f94df773368706dd878b1..cf4899a1ece12d21df31e46f7f0be13cef8a4bc4 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -27,7 +27,6 @@ class Person timestamps! before_validation :clean_url - before_create :check_for_owner validates_presence_of :email, :url, :profile, :serialized_key validates_format_of :url, :with => /^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix @@ -124,9 +123,6 @@ class Person private - def check_for_owner - self.user_refs += 1 unless self.owner_id.nil? - end def remove_all_traces self.posts.delete_all end diff --git a/app/models/user.rb b/app/models/user.rb index 2eac6a008374aad77bebc001eae045a889090c62..54872ce3ae24f064f7b71e49dfcbad5f24ee2f56 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -60,12 +60,7 @@ class User request = Request.where(:id => friend_request_id).first n = pending_requests.delete(request) - friends << request.person - save - - group = self.groups.first(:id => group_id) - group.people << request.person - group.save + activate_friend(request.person, groups.first(:id => group_id)) request.reverse self @@ -102,26 +97,22 @@ class User end end - def unfriend(friend_id) - Rails.logger.info("#{self.real_name} is unfriending #{bad_friend.inspect}" - bad_friend = Person.first(:_id => friend_id) + def unfriend(bad_friend) + Rails.logger.info("#{self.real_name} is unfriending #{bad_friend.inspect}") Retraction.for(self).push_to_url(bad_friend.receive_url) - remove_friend friend_id + remove_friend(bad_friend) end - def remove_friend friend_id - bad_friend = Person.first(:_id => friend_id) - - self.friend_ids.delete( friend_id ) + def remove_friend(bad_friend) + raise "Friend not deleted" unless self.friend_ids.delete( bad_friend.id ) 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 friend_id - Rails.logger.info("#{self.real_name} is being unfriended by #{bad_friend.inspect}" - remove_friend friend_id + 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) @@ -133,8 +124,10 @@ class User end def activate_friend(person, group) + person.user_refs += 1 group.people << person friends << person + person.save group.save save end @@ -149,7 +142,7 @@ class User Rails.logger.debug("Receiving object:\n#{object.inspect}") if object.is_a? Retraction - (object.type == 'Person' )? (unfriended_by object.post_id) : (object.perform self.id) + (object.type == 'Person' )? (unfriended_by friends.first(object.post_id)) : (object.perform self.id) elsif object.is_a? Request person = Diaspora::Parser.get_or_create_person_object_from_xml( xml ) person.serialized_key ||= object.exported_key diff --git a/spec/models/person_spec.rb b/spec/models/person_spec.rb index 41046b932f1db36d5af310c1abb98ceaad4743c7..c062d396b65222007c77b7acd38e779902ae5585 100644 --- a/spec/models/person_spec.rb +++ b/spec/models/person_spec.rb @@ -2,7 +2,11 @@ require File.dirname(__FILE__) + '/../spec_helper' describe Person do before do + @user = Factory.create(:user) + @user2 = Factory.create(:user) @person = Factory.create(:person) + @group = @user.group(:name => "Dudes") + @group2 = @user2.group(:name => "Abscence of Babes") end @@ -33,8 +37,6 @@ describe Person do end it 'should delete all of user except comments upon user deletion' do - Factory.create(:user) - f = Factory.create(:person) Factory.create(:status_message, :person => f) @@ -57,45 +59,39 @@ describe Person do describe "unfriending" do it 'should delete an orphaned friend' do - user = Factory.create(:user) - user.save + request = @user.send_friend_request_to @person.receive_url, @group.id - user.friends << @person - @person.user_refs += 1 - @person.save - + @user.activate_friend(@person, @group) + @user.reload + + Person.all.count.should == 3 + @user.friends.count.should == 1 + @user.unfriend(@person) + @user.reload + @user.friends.count.should == 0 Person.all.count.should == 2 - user.friends.count.should == 1 - user.unfriend(@person.id) - user.friends.count.should == 0 - Person.all.count.should == 1 end it 'should not delete an un-orphaned friend' do - user_one = Factory.create(:user) - user_two = Factory.create(:user) - - user_one.save - user_two.save + request = @user.send_friend_request_to @person.receive_url, @group.id + request2 = @user2.send_friend_request_to @person.receive_url, @group2.id + @user.activate_friend(@person, @group) + @user2.activate_friend(@person, @group2) - user_one.friends << @person - user_two.friends << @person - user_one.save - user_two.save - - @person.user_refs += 2 - @person.save - + @user.reload + @user2.reload + Person.all.count.should == 3 - user_one.friends.count.should == 1 - user_two.friends.count.should == 1 - - user_one.unfriend(@person.id) - - user_one.friends.count.should == 0 - user_two.friends.count.should == 1 + @user.friends.count.should == 1 + @user2.friends.count.should == 1 + + @user.unfriend(@person) + @user.reload + @user2.reload + @user.friends.count.should == 0 + @user2.friends.count.should == 1 Person.all.count.should == 3 end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 48c70d7578ee4fc85c0e7b759f03cbba5e7774b8..389ec83b56958d38230497fc5653ce3ebb524f62 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -235,43 +235,36 @@ describe User do describe 'unfriending' do before do - @user = Factory.create :user @user2 = Factory.create :user - - @user.friends << @user2.person - @user.person.user_refs += 1 - @user2.friends << @user.person - - @user2.person.user_refs += 1 - - @user2.person.save - @user.person.save + @group2 = @user2.group(:name => "Gross people") + + request = @user.send_friend_request_to( @user2.receive_url, @group.id) + request.reverse @user2 + @user2.activate_friend(@user.person, @group2) + @user.receive request.to_diaspora_xml end it 'should unfriend the other user on the same seed' do - person = @user2.person - person.url = @user.person.url - person.save - + @user.reload + @user2.reload + @user.friends.count.should == 1 @user2.friends.count.should == 1 - @user.person.user_refs.should == 2 + @user.person.user_refs.should == 1 - @user2.person.user_refs.should == 2 + @user2.person.user_refs.should == 1 - @user2.unfriend @user.person.id + @user2.unfriend @user.person @user2.friends.count.should be 0 @user.person.reload - @user.person.user_refs.should == 1 + @user.person.user_refs.should == 0 - @user.unfriended_by @user2.person.id + @user.unfriended_by @user2.person @user2.person.reload - @user2.person.user_refs.should == 1 + @user2.person.user_refs.should == 0 end - - end end