diff --git a/app/models/user.rb b/app/models/user.rb index d07bca481c2cadc6e16001efc17088273220893f..4e07abb2a099527fd6bfe122bd146b762ada5142 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -122,23 +122,15 @@ class User end def remove_friend(bad_friend) - puts "YEAHH!!" raise "Friend not deleted" unless self.friend_ids.delete( bad_friend.id ) groups.each{|g| g.person_ids.delete( bad_friend.id )} self.save - puts self.posts.find_all_by_person_id( bad_friend.id ).inspect self.posts.find_all_by_person_id( bad_friend.id ).each{|post| - puts "HEYYYYYYYY" - self.post_ids.delete( post.id ) - puts self.posts - post.user_refs =- 1 - - puts "ASODIJ" + post.user_refs -= 1 (post.user_refs > 0 || post.person.owner.nil? == false) ? post.save : post.destroy } - puts self.inspect self.save bad_friend.user_refs -= 1 @@ -200,7 +192,10 @@ class User elsif object.is_a?(Post) && object.verify_creator_signature == true Rails.logger.debug("Saving post: #{object}") + + object.user_refs += 1 object.save + self.posts << object self.save object.socket_to_uid(id) if (object.respond_to?(:socket_to_uid) && !self.owns?(object)) diff --git a/lib/diaspora/parser.rb b/lib/diaspora/parser.rb index 8835bd83bc57b96e22d255cb01fb81a339cf8dbb..650c4a4e49b280ebbe3a711fb5ec59ccf3820c1a 100644 --- a/lib/diaspora/parser.rb +++ b/lib/diaspora/parser.rb @@ -20,7 +20,15 @@ module Diaspora return unless body = doc.xpath("/XML/post").children.first begin - body.name.camelize.constantize.from_xml body.to_s + new_object = body.name.camelize.constantize.from_xml body.to_s + + if new_object.is_a? Post + existing_object = new_object.class.find_by_id(new_object.id) + existing_object ? (return existing_object) : (return new_object) + end + + new_object + rescue NameError => e if e.message.include? 'wrong constant name' Rails.logger.info "Not a real type: #{object.to_s}" diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 6e93e750c0d7ebe5e20868d91f2c6198afc5c535..fc1480ea7e606abd781e6cad84563c487f930a34 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -275,33 +275,96 @@ describe User do describe 'post refs' do before do @user2 = Factory.create(:user) + @user.activate_friend( @user2.person, @group) + + @user3 = Factory.create(:user) + @group3 = @user3.group(:name => 'heroes') + + + @user.posts.count.should == 0 end it 'should be removed on unfriending' do - @user.activate_friend( @user2.person, @group) + status_message = @user2.post :status_message, :message => "hi" + @user.receive status_message.to_diaspora_xml + @user.reload + + @user.posts.count.should == 1 + @user.unfriend(@user2.person) + + @user.reload @user.posts.count.should == 0 + + Post.count.should be 1 + end + it 'should be remove a post if the noone links to it' do status_message = @user2.post :status_message, :message => "hi" @user.receive status_message.to_diaspora_xml + @user.reload + @user.posts.count.should == 1 + + person = @user2.person + @user2.destroy + @user.unfriend(person) + + @user.reload + @user.posts.count.should == 0 + + Post.count.should be 0 + end + + it 'should keep track of user references for one person ' do + status_message = @user2.post :status_message, :message => "hi" + @user.receive status_message.to_diaspora_xml + @user.reload @user.posts.count.should == 1 + + status_message.reload + status_message.user_refs.should == 1 + + @user.unfriend(@user2.person) + status_message.reload @user.reload + @user.posts.count.should == 0 + + status_message.reload + status_message.user_refs.should == 0 + + Post.count.should be 1 + end + + it 'should not override userrefs on receive by another person' do + @user3 = Factory.create :user + @user3.activate_friend(@user2, @group3) + + status_message = @user2.post :status_message, :message => "hi" + @user.receive status_message.to_diaspora_xml + @user3.receive status_message.to_diaspora_xml + @user.reload + @user3.reload @user.posts.count.should == 1 + status_message.reload + status_message.user_refs.should == 2 + @user.unfriend(@user2.person) + status_message.reload - puts @user.inspect @user.reload - puts @user.inspect @user.posts.count.should == 0 + + status_message.reload + status_message.user_refs.should == 1 - puts Post.all.inspect Post.count.should be 1 end + end end