From 469599a4a93165fcd18226fe1303ca137f6e6829 Mon Sep 17 00:00:00 2001 From: danielvincent Date: Fri, 2 Jul 2010 13:08:53 -0700 Subject: [PATCH] DG RS IZ; added post deletion propagation --- app/models/post.rb | 7 ++++++- app/models/retraction.rb | 18 ++++++++++++++++++ lib/common.rb | 8 ++++++-- lib/socket_render.rb | 3 --- spec/lib/common_spec.rb | 2 +- spec/lib/parser_spec.rb | 10 ++++++++++ spec/models/retraction_spec.rb | 23 +++++++++++++++++++++++ 7 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 app/models/retraction.rb create mode 100644 spec/models/retraction_spec.rb diff --git a/app/models/post.rb b/app/models/post.rb index a74f66cb6..d6d8e5600 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -21,7 +21,9 @@ class Post after_save :send_to_view after_save :notify_friends - + + before_destroy :propagate_delete + def self.stream Post.sort(:created_at.desc).all end @@ -41,6 +43,9 @@ class Post protected + def propagate_delete + Retraction.for(self).notify_friends + end def send_to_view WebSocket.update_clients(self) diff --git a/app/models/retraction.rb b/app/models/retraction.rb new file mode 100644 index 000000000..5cc5379f0 --- /dev/null +++ b/app/models/retraction.rb @@ -0,0 +1,18 @@ +class Retraction + include ROXML + include Diaspora::Webhooks + + def self.for(post) + result = self.new + result.post_id = post.id + result.person_id = post.person.id + result + end + + xml_accessor :post_id + xml_accessor :person_id + + attr_accessor :post_id + attr_accessor :person_id + +end diff --git a/lib/common.rb b/lib/common.rb index dcee9bec2..be199cdc0 100644 --- a/lib/common.rb +++ b/lib/common.rb @@ -18,7 +18,7 @@ module Diaspora body.children.each do |post| begin object = post.name.camelize.constantize.from_xml post.to_s - object.person = parse_owner_from_xml post.to_s #if object.is_a? Post + object.person = parse_owner_from_xml post.to_s if object.respond_to? :person objects << object rescue puts "Not a real type: #{object.to_s}" @@ -31,8 +31,12 @@ module Diaspora objects = parse_objects_from_xml(xml) objects.each do |p| + if p.is_a? Retraction + Post.delete( p.post_id ) #This line checks if the sender was in the database, among other things? - p.save if p.respond_to?(:person) && !(p.person.nil?) #WTF + elsif p.respond_to?(:person) && !(p.person.nil?) #WTF + p.save + end #p.save if p.respond_to?(:person) && !(p.person == nil) #WTF end end diff --git a/lib/socket_render.rb b/lib/socket_render.rb index eb88613b7..acdb01f71 100644 --- a/lib/socket_render.rb +++ b/lib/socket_render.rb @@ -27,9 +27,6 @@ module SocketRenderer end def self.view_for(object) - puts object.inspect - puts @view.type_partial(object) - @view.render @view.type_partial(object), :post => object end diff --git a/spec/lib/common_spec.rb b/spec/lib/common_spec.rb index 3af047a95..fbda649b2 100644 --- a/spec/lib/common_spec.rb +++ b/spec/lib/common_spec.rb @@ -35,7 +35,7 @@ describe Diaspora do end it "should send an owners post to their friends" do - q = Post.send (:class_variable_get, :@@queue) + q = Post.send(:class_variable_get, :@@queue) q.should_receive :process @post.save end diff --git a/spec/lib/parser_spec.rb b/spec/lib/parser_spec.rb index c1eb5cb19..0205049f4 100644 --- a/spec/lib/parser_spec.rb +++ b/spec/lib/parser_spec.rb @@ -97,7 +97,17 @@ describe "parser in application helper" do comment.person.should == friend comment.post.should == post end + + it 'should marshal retractions' do + friend = Factory.create(:friend) + message = Factory.create(:status_message, :person => friend) + retraction = Retraction.for(message) + request = Post.build_xml_for( [retraction] ) + StatusMessage.count.should == 1 + store_objects_from_xml( request ) + StatusMessage.count.should == 0 + end end end diff --git a/spec/models/retraction_spec.rb b/spec/models/retraction_spec.rb new file mode 100644 index 000000000..f3fe8a212 --- /dev/null +++ b/spec/models/retraction_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Retraction do + describe "posts" do + before do + @user = Factory.create(:user) + @post = Factory.create(:status_message, :person => @user) + end + + it 'should have a post id after serialization' do + retraction = Retraction.for(@post) + xml = retraction.to_xml.to_s + xml.include?(@post.id.to_s).should == true + end + + it 'should dispatch a message on delete' do + Factory.create(:friend) + Post.send(:class_variable_get, :@@queue).should_receive(:add_post_request) + @post.destroy + end + + end +end