diff --git a/app/models/comment.rb b/app/models/comment.rb index 35f5ace2f..98b0300fc 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -3,12 +3,12 @@ class Comment include ROXML include Diaspora::Webhooks + xml_accessor :text xml_accessor :person, :as => Person xml_accessor :post_id key :text, String - key :target, String timestamps! key :post_id, ObjectId @@ -17,11 +17,25 @@ class Comment key :person_id, ObjectId belongs_to :person, :class_name => "Person" - + after_save :send_friends_comments_on_my_posts + after_save :send_to_view + def ==(other) (self.message == other.message) && (self.person.email == other.person.email) end - -end - + + + protected + + def send_friends_comments_on_my_posts + if (User.first.mine?(self.post) && self.person.is_a?(Friend)) + self.push_to(self.post.friends_with_permissions) + end + end + + + def send_to_view + WebSocket.update_clients(self) + end +end \ No newline at end of file diff --git a/app/views/comments/_comment.html.haml b/app/views/comments/_comment.html.haml index eb97c4123..6ae6e41a4 100644 --- a/app/views/comments/_comment.html.haml +++ b/app/views/comments/_comment.html.haml @@ -1,6 +1,6 @@ -%li.comment{:id => comment.id} +%li.comment{:id => post.id} %span.from - = link_to_person comment.person - = auto_link comment.text + = link_to_person post.person + = auto_link post.text %div.time - = "#{time_ago_in_words(comment.updated_at)} ago" + = "#{time_ago_in_words(post.updated_at)} ago" diff --git a/app/views/comments/_comments.html.haml b/app/views/comments/_comments.html.haml index 89237d1d7..9bcef1291 100644 --- a/app/views/comments/_comments.html.haml +++ b/app/views/comments/_comments.html.haml @@ -1,7 +1,7 @@ %div.comments - %ul.comment_set + %ul.comment_set{:id => post.id} - for comment in post.comments - = render "comments/comment", :comment => comment + = render 'comments/comment', :post => comment %li.comment - = render "comments/new_comment", :post => post + = render 'comments/new_comment', :post => post diff --git a/app/views/js/_websocket_js.haml b/app/views/js/_websocket_js.haml index 00d130029..bd7818824 100644 --- a/app/views/js/_websocket_js.haml +++ b/app/views/js/_websocket_js.haml @@ -11,7 +11,20 @@ ws.onmessage = function(evt) { var obj = jQuery.parseJSON(evt.data); debug("got a " + obj['class']); - if((location.href.indexOf(obj['class']) != -1 ) || (location.pathname == '/')) { + + + function onPageOne() { + var c = document.location.search.charAt(document.location.search.length-1); + return ((c =='') || (c== '1')) + } + + + if (obj['class']=="comments"){ + var post_id = obj['post_id'] + $('#'+ obj['post_id'] + ' .comment_set li:last' ).before( + $(obj['html']).fadeIn("fast", function(){}) + ) + }else if(((location.href.indexOf(obj['class']) != -1 ) || (location.pathname == '/')) && onPageOne()) { $("#stream").prepend( $(obj['html']).fadeIn("fast", function(){ $("#stream label:first").inFieldLabels(); @@ -24,4 +37,4 @@ ws.onopen = function() { ws.send(location.pathname); debug("connected..."); - };}); \ No newline at end of file + };}); diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 94b5b87dc..0f604ef70 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -12,8 +12,8 @@ /= javascript_include_tag"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" = javascript_include_tag 'jquery142', 'rails', 'view', 'publisher' = javascript_include_tag 'tiny_mce/tiny_mce.js','jquery.infieldlabel' - = render "js/google_a_js" - = render "js/websocket_js" + = render 'js/google_a_js' + = render 'js/websocket_js' = csrf_meta_tag = yield(:head) diff --git a/lib/common.rb b/lib/common.rb index 16d84f2d6..76c2cccc0 100644 --- a/lib/common.rb +++ b/lib/common.rb @@ -69,10 +69,12 @@ module Diaspora def push_to(recipients) - recipients.map!{|x| x = x.url + "receive/"} - xml = self.class.build_xml_for([self]) - @@queue.add_post_request( recipients, xml ) - @@queue.process + unless recipients.empty? + recipients.map!{|x| x = x.url + "receive/"} + xml = self.class.build_xml_for([self]) + @@queue.add_post_request( recipients, xml ) + @@queue.process + end end diff --git a/lib/socket_render.rb b/lib/socket_render.rb index 0f3c8dd8b..eb88613b7 100644 --- a/lib/socket_render.rb +++ b/lib/socket_render.rb @@ -22,11 +22,22 @@ module SocketRenderer puts e.message raise e end - {:class =>object.class.to_s.underscore.pluralize, :html => v} + + {:class =>object.class.to_s.underscore.pluralize, :html => v, :post_id => obj_id(object)} end def self.view_for(object) + puts object.inspect + puts @view.type_partial(object) + @view.render @view.type_partial(object), :post => object end + def self.obj_id(object) + if object.is_a? Post + object.id + else + object.post.id + end + end end diff --git a/spec/lib/common_spec.rb b/spec/lib/common_spec.rb index 8a37fc20a..61e7fa3cc 100644 --- a/spec/lib/common_spec.rb +++ b/spec/lib/common_spec.rb @@ -8,6 +8,7 @@ describe Diaspora do describe Webhooks do before do @user = Factory.create(:user, :email => "bob@aol.com") + @friend = Factory.create(:friend) end describe "header" do @@ -53,9 +54,7 @@ describe Diaspora do Factory.create(:friend, :url => "http://www.alice.com/") Factory.create(:friend, :url => "http://www.jane.com/") - @post.friends_with_permissions.should include("http://www.bob.com/receive/") - @post.friends_with_permissions.should include("http://www.alice.com/receive/") - @post.friends_with_permissions.should include("http://www.jane.com/receive/") + @post.friends_with_permissions.should == Friend.all end it "should send an owners post to their friends" do @@ -73,7 +72,7 @@ describe Diaspora do it "should ensure one url is created for every friend" do 5.times {Factory.create(:friend)} - @post.friends_with_permissions.size.should == 5 + @post.friends_with_permissions.size.should == 6 end it "should build an xml object containing multiple Post types" do diff --git a/spec/helpers/parser_spec.rb b/spec/lib/parser_spec.rb similarity index 93% rename from spec/helpers/parser_spec.rb rename to spec/lib/parser_spec.rb index fc9e0e885..a9e3e7e45 100644 --- a/spec/helpers/parser_spec.rb +++ b/spec/lib/parser_spec.rb @@ -103,20 +103,6 @@ describe "parser in application helper" do comment.post.should == post end - - - - it 'should parse a person out of a post' do - @user.comment "foo", :on => @status_messages.first - xml = Comment.build_xml_for([Comment.first]) - puts xml - objs = parse_objects_from_xml(xml) - - puts objs.inspect - - - - end end end diff --git a/spec/models/comments_spec.rb b/spec/models/comments_spec.rb index 00f8c1240..b5ebaf23c 100644 --- a/spec/models/comments_spec.rb +++ b/spec/models/comments_spec.rb @@ -15,21 +15,47 @@ describe Comment do it "should be able to comment on a friend's status" do friend = Factory.create :friend - status = Factory.create(:status_message, :person => @friend) + status = Factory.create(:status_message, :person => friend) @user.comment "sup dog", :on => status StatusMessage.first.comments.first.text.should == "sup dog" StatusMessage.first.comments.first.person.should == @user end - - - it 'should be able to send a post owner any new comments a user adds' do - friend = Factory.create(:friend) - status = Factory.create(:status_message, :person => friend) - - Comment.send(:class_variable_get, :@@queue).should_receive(:add_post_request) - @user.comment "yo", :on => status + it 'should not send out comments when we have no friends' do + status = Factory.create(:status_message, :person => @user) + Comment.send(:class_variable_get, :@@queue).should_not_receive(:add_post_request) + @user.comment "sup dog", :on => status end + describe 'comment propagation' do + before do + @friend = Factory.create(:friend) + @friend_two = Factory.create(:friend) + @friend_status = Factory.create(:status_message, :person => @friend) + @user_status = Factory.create(:status_message, :person => @user) + end + + it "should send a user's comment on a friend's post to that friend" do + Comment.send(:class_variable_get, :@@queue).should_receive(:add_post_request) + @user.comment "yo", :on => @friend_status + end + + it 'should send a user comment on his own post to lots of friends' do + allowed_urls = @user_status.friends_with_permissions.map!{|x| x = x.url + "receive/"} + Comment.send(:class_variable_get, :@@queue).should_receive(:add_post_request).with(allowed_urls, anything ) + @user.comment "yo", :on => @user_status + end + + it 'should send a comment a friend made on your post to all friends' do + Comment.send(:class_variable_get, :@@queue).should_receive(:add_post_request) + com = Comment.create(:person => @friend, :text => "balls", :post => @user_status) + end + + it 'should not send a comment a friend made on a friend post to anyone' do + Comment.send(:class_variable_get, :@@queue).should_not_receive(:add_post_request) + com = Comment.create(:person => @friend, :text => "balls", :post => @friend_status) + end + + end end -end +end \ No newline at end of file