<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][10252] trunk: Blogs: don't duplicate activity comments during post/activity sync</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/10252">10252</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/10252","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>djpaul</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-10-11 22:14:29 +0000 (Sun, 11 Oct 2015)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Blogs: don't duplicate activity comments during post/activity sync

When JS is disabled, when you post an activity comment to a blog post
activity item, two activity comments will be created. This happens
because we are updating the activity item three times, and updating the
post comment twice.

This change unhooks some of the actions during activity->blog sync to
prevent these unnecessary updates and the duplicated activity comment.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/6494">#6494</a>

Props imath, r-a-y</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpblogsbpblogsactivityphp">trunk/src/bp-blogs/bp-blogs-activity.php</a></li>
<li><a href="#trunktestsphpunittestcasesblogsfunctionsphp">trunk/tests/phpunit/testcases/blogs/functions.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpblogsbpblogsactivityphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-blogs/bp-blogs-activity.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-blogs/bp-blogs-activity.php  2015-10-11 18:35:10 UTC (rev 10251)
+++ trunk/src/bp-blogs/bp-blogs-activity.php    2015-10-11 22:14:29 UTC (rev 10252)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -604,8 +604,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">        //       doesn't change on the frontend until the next page refresh.
</span><span class="cx" style="display: block; padding: 0 10px">        $resave_activity = new BP_Activity_Activity( $comment_id );
</span><span class="cx" style="display: block; padding: 0 10px">        $resave_activity->primary_link = get_comment_link( $post_comment_id );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * Now that the activity id exists and the post comment was created, we don't need to update
+        * the content of the comment as there are no chances it has evolved.
+        */
+       remove_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         $resave_activity->save();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        // add the edit activity comment hook back
+       add_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         // multisite again!
</span><span class="cx" style="display: block; padding: 0 10px">        restore_current_blog();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunktestsphpunittestcasesblogsfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/testcases/blogs/functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/testcases/blogs/functions.php 2015-10-11 18:35:10 UTC (rev 10251)
+++ trunk/tests/phpunit/testcases/blogs/functions.php   2015-10-11 22:14:29 UTC (rev 10252)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -711,6 +711,78 @@
</span><span class="cx" style="display: block; padding: 0 10px">                remove_filter( 'bp_is_blog_public', '__return_zero' );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * @group bp_blogs_record_comment
+        * @group unique
+        */
+       public function test_bp_blogs_record_comment_no_duplicate_activity_comments() {
+               // save the current user and override logged-in user
+               $old_user = get_current_user_id();
+               $u = $this->factory->user->create();
+               $this->set_current_user( $u );
+               $userdata = get_userdata( $u );
+               $this->activity_saved_comment_count = 0;
+               $this->comment_saved_count = 0;
+
+               // let's use activity comments instead of single "new_blog_comment" activity items
+               add_filter( 'bp_disable_blogforum_comments', '__return_false' );
+               add_action( 'bp_activity_add', array( $this, 'count_activity_comment_saved' ) );
+               add_action( 'wp_insert_comment', array( $this, 'count_post_comment_saved' ) );
+               add_action( 'edit_comment', array( $this, 'count_post_comment_saved' ) );
+
+               // create the blog post
+               $post_id = $this->factory->post->create( array(
+                       'post_status' => 'publish',
+                       'post_type'   => 'post',
+                       'post_title'  => 'Test Duplicate activity comments',
+               ) );
+
+               // grab the activity ID for the activity comment
+               $a1 = bp_activity_get_activity_id( array(
+                       'type'      => 'new_blog_post',
+                       'component' => buddypress()->blogs->id,
+                       'filter'    => array(
+                               'item_id' => get_current_blog_id(),
+                               'secondary_item_id' => $post_id
+                       ),
+               ) );
+
+               $a2 = bp_activity_new_comment( array(
+                       'content'     => 'activity comment should be unique',
+                       'user_id'     => $u,
+                       'activity_id' => $a1,
+               ) );
+
+               $activities = bp_activity_get( array(
+                       'type'             => 'activity_comment',
+                       'display_comments' => 'stream',
+                       'search_terms'     => 'activity comment should be unique',
+               ) );
+
+               $this->assertTrue( count( $activities['activities'] ) === 1, 'An activity comment should be unique' );
+
+               $this->assertTrue( 2 === $this->activity_saved_comment_count, 'An activity comment should be saved only twice' );
+               $this->assertTrue( 1 === $this->comment_saved_count, 'A comment should be saved only once' );
+
+               // reset
+               remove_filter( 'bp_disable_blogforum_comments', '__return_false' );
+               remove_action( 'bp_activity_add', array( $this, 'count_activity_comment_saved' ) );
+               remove_action( 'wp_insert_comment', array( $this, 'count_post_comment_saved' ) );
+               remove_action( 'edit_comment', array( $this, 'count_post_comment_saved' ) );
+
+               $this->activity_saved_comment_count = 0;
+               $this->comment_saved_count = 0;
+               $this->set_current_user( $old_user );
+       }
+
+       public function count_activity_comment_saved() {
+               $this->activity_saved_comment_count += 1;
+       }
+
+       public function count_post_comment_saved() {
+               $this->comment_saved_count += 1;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         protected function activity_exists_for_post( $post_id ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $a = bp_activity_get( array(
</span><span class="cx" style="display: block; padding: 0 10px">                        'component' => buddypress()->blogs->id,
</span></span></pre>
</div>
</div>

</body>
</html>