<!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][10971] trunk: Only delete the "new_blog" activity when its author is removed from the Blog.</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/10971">10971</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/10971","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>imath</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-07-30 11:40:55 +0000 (Sat, 30 Jul 2016)</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'>Only delete the "new_blog" activity when its author is removed from the Blog.

Before this commit, as soon as any contributor was removed from the blog, the "new_blog" activity was also removed although the removed user was not the author of the activity.
It is no more the case. This activity will only be deleted if the user who created the blog is removed from it.
This commit also make sure this activity is not deleted twice as some duplicate code has been left when moving the activity code inside the `bp-blogs-activity.php` file during the 2.6 dev-cycle.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/7199">#7199</a> (trunk)</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpblogsbpblogsactivityphp">trunk/src/bp-blogs/bp-blogs-activity.php</a></li>
<li><a href="#trunksrcbpblogsbpblogsfunctionsphp">trunk/src/bp-blogs/bp-blogs-functions.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  2016-07-30 11:36:02 UTC (rev 10970)
+++ trunk/src/bp-blogs/bp-blogs-activity.php    2016-07-30 11:40:55 UTC (rev 10971)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -639,15 +639,25 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param int $blog_id Site ID.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function bp_blogs_delete_new_blog_activity_for_site( $blog_id ) {
-       bp_blogs_delete_activity( array(
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function bp_blogs_delete_new_blog_activity_for_site( $blog_id, $user_id = 0 ) {
+       $args = array(
</ins><span class="cx" style="display: block; padding: 0 10px">                 'item_id'   => $blog_id,
</span><span class="cx" style="display: block; padding: 0 10px">                'component' => buddypress()->blogs->id,
</span><span class="cx" style="display: block; padding: 0 10px">                'type'      => 'new_blog'
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ );
+
+       /**
+        * In the case a user is removed, make sure he is the author of the 'new_blog' activity
+        * when trying to delete it.
+        */
+       if ( ! empty( $user_id ) ) {
+               $args['user_id'] = $user_id;
+       }
+
+       bp_blogs_delete_activity( $args );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-add_action( 'bp_blogs_remove_blog',          'bp_blogs_delete_new_blog_activity_for_site' );
-add_action( 'bp_blogs_remove_blog_for_user', 'bp_blogs_delete_new_blog_activity_for_site' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+add_action( 'bp_blogs_remove_blog',          'bp_blogs_delete_new_blog_activity_for_site', 10, 1 );
+add_action( 'bp_blogs_remove_blog_for_user', 'bp_blogs_delete_new_blog_activity_for_site', 10, 2 );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px">  * Delete all 'blogs' activity items for a site when the site is deleted.
</span></span></pre></div>
<a id="trunksrcbpblogsbpblogsfunctionsphp"></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-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-blogs/bp-blogs-functions.php 2016-07-30 11:36:02 UTC (rev 10970)
+++ trunk/src/bp-blogs/bp-blogs-functions.php   2016-07-30 11:40:55 UTC (rev 10971)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -920,19 +920,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">        BP_Blogs_Blog::delete_blog_for_user( $blog_id, $user_id );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * Delete activity stream item only if the Activity component is active
-        *
-        * @see https://buddypress.trac.wordpress.org/ticket/6937
-        */
-       if ( bp_is_active( 'activity' ) ) {
-               bp_blogs_delete_activity( array(
-                       'item_id'   => $blog_id,
-                       'component' => buddypress()->blogs->id,
-                       'type'      => 'new_blog'
-               ) );
-       }
-
-       /**
</del><span class="cx" style="display: block; padding: 0 10px">          * Fires after a blog has been removed from the tracker for a specific user.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 1.0.0
</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 2016-07-30 11:36:02 UTC (rev 10970)
+++ trunk/tests/phpunit/testcases/blogs/functions.php   2016-07-30 11:40:55 UTC (rev 10971)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1016,6 +1016,100 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->set_current_user( $old_user );
</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_remove_blog
+        */
+       public function test_bp_blogs_remove_blog() {
+               if ( ! is_multisite() ) {
+                       return;
+               }
+
+               $reset_post = $_POST;
+               $old_user = get_current_user_id();
+
+               // Simulate a new "BuddyPress generated" blog
+               $_POST['blog_public'] = 1;
+
+               $u = $this->factory->user->create();
+               $this->set_current_user( $u );
+
+               // Create three sites.
+               $b = $this->factory->blog->create( array(
+                       'user_id' => $u
+               ) );
+
+               $activity = bp_activity_get( array(
+                       'filter' => array(
+                               'object'     => 'blogs',
+                               'action'     => 'new_blog',
+                               'primary_id' => $b,
+                       ),
+               ) );
+
+               $new_blog = array_map( 'intval', wp_list_pluck( $activity['activities'], 'item_id', 'id' ) );
+               $this->assertSame( $b, reset( $new_blog ) );
+
+               // Removing the blog should delete the activity and the blog association.
+               wpmu_delete_blog( $b );
+
+               $deleted = bp_activity_get( array(
+                       'in' => array_keys( $new_blog ),
+               ) );
+
+               $this->assertEmpty( $deleted['activities'] );
+               $this->assertEmpty( BP_Blogs_Blog::is_recorded( $b ) );
+
+               $_POST = $reset_post;
+               $this->set_current_user( $old_user );
+       }
+
+       /**
+        * @group bp_blogs_remove_blog_for_user
+        */
+       public function test_bp_blogs_remove_blog_for_user_is_contributor() {
+               if ( ! is_multisite() ) {
+                       return;
+               }
+
+               $reset_post = $_POST;
+               $old_user = get_current_user_id();
+
+               // Simulate a new "BuddyPress generated" blog
+               $_POST['blog_public'] = 1;
+
+               $u = $this->factory->user->create();
+               $this->set_current_user( $u );
+
+               // Create three sites.
+               $b = $this->factory->blog->create( array(
+                       'user_id' => $u
+               ) );
+
+               $u2 = $this->factory->user->create();
+               add_user_to_blog( $b, $u2, 'contributor' );
+
+               $u2_blogs = BP_Blogs_Blog::get_blog_ids_for_user( $u2 );
+               $this->assertContains( $b, $u2_blogs, 'The user should be associated to the blog as he is a contributor' );
+
+               remove_user_from_blog( $u2, $b );
+               $u2_blogs = BP_Blogs_Blog::get_blog_ids_for_user( $u2 );
+               $this->assertNotContains( $b, $u2_blogs, 'The user should not be associated anymore to the blog' );
+
+               $activity = bp_activity_get( array(
+                       'filter' => array(
+                               'object'     => 'blogs',
+                               'action'     => 'new_blog',
+                               'primary_id' => $b,
+                       ),
+               ) );
+
+               $new_blog = array_map( 'intval', wp_list_pluck( $activity['activities'], 'item_id', 'id' ) );
+               $this->assertSame( $b, reset( $new_blog ), 'The new_blog activity should not be deleted when a contributor is removed from the blog.' );
+
+               $_POST = $reset_post;
+               $this->set_current_user( $old_user );
+       }
+
</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>