Skip to content

Commit 5b6123e

Browse files
Merge pull request #110 from buddypress/feature/9163
Admin cannot be demoted or removed from a group when he's the only one left
2 parents 075ab70 + 8722895 commit 5b6123e

File tree

4 files changed

+124
-31
lines changed

4 files changed

+124
-31
lines changed

features/group-member.feature

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,39 @@ Feature: Manage BuddyPress Group Members
1818
Then STDOUT should be a number
1919
And save STDOUT as {MEMBER_ID}
2020

21+
When I run `wp user create randon randon@example.com --porcelain`
22+
Then STDOUT should be a number
23+
And save STDOUT as {RANDON_MEMBER_ID}
24+
25+
When I run `wp user create anothermod anothermod@example.com --porcelain`
26+
Then STDOUT should be a number
27+
And save STDOUT as {ANOTHER_MEMBER_ID}
28+
2129
When I run `wp bp group create --name="Totally Cool Group" --creator-id={CREATOR_ID} --porcelain`
2230
Then STDOUT should be a number
2331
And save STDOUT as {GROUP_ID}
2432

25-
When I run `wp bp group member create --group-id={GROUP_ID} --user-id={MEMBER_ID}`
33+
When I run `wp bp group meta add {GROUP_ID} invite_status 'public'`
34+
Then STDOUT should not be empty
35+
36+
When I run `wp bp group member add --group-id={GROUP_ID} --user-id={MEMBER_ID}`
2637
Then STDOUT should contain:
2738
"""
2839
Success: Added user #{MEMBER_ID} to group #{GROUP_ID} as member.
2940
"""
3041

42+
When I run `wp bp group member create --group-id={GROUP_ID} --user-id={ANOTHER_MEMBER_ID}`
43+
Then STDOUT should contain:
44+
"""
45+
Success: Added user #{ANOTHER_MEMBER_ID} to group #{GROUP_ID} as member.
46+
"""
47+
3148
When I run `wp bp group member list {GROUP_ID} --fields=id`
3249
Then STDOUT should be a table containing rows:
33-
| id |
34-
| {CREATOR_ID} |
35-
| {MEMBER_ID} |
50+
| id |
51+
| {CREATOR_ID} |
52+
| {MEMBER_ID} |
53+
| {ANOTHER_MEMBER_ID} |
3654

3755
When I run `wp bp group member promote --group-id={GROUP_ID} --user-id={MEMBER_ID} --role=mod`
3856
Then STDOUT should contain:
@@ -45,6 +63,13 @@ Feature: Manage BuddyPress Group Members
4563
| id |
4664
| {MEMBER_ID} |
4765

66+
When I try `wp bp group member demote --group-id={GROUP_ID} --user-id={RANDON_MEMBER_ID}`
67+
Then the return code should be 1
68+
Then STDERR should be:
69+
"""
70+
Error: User is not a member of the group.
71+
"""
72+
4873
When I run `wp bp group member demote --group-id={GROUP_ID} --user-id={MEMBER_ID}`
4974
Then STDOUT should contain:
5075
"""
@@ -54,18 +79,36 @@ Feature: Manage BuddyPress Group Members
5479
When I try `wp bp group member list {GROUP_ID} --fields=user_id --role=mod`
5580
Then the return code should be 1
5681

57-
When I run `wp bp group member ban --group-id={GROUP_ID} --user-id={MEMBER_ID}`
82+
When I run `wp bp group member promote --group-id={GROUP_ID} --user-id={MEMBER_ID} --role=admin`
83+
Then STDOUT should contain:
84+
"""
85+
Success: Member promoted to new role successfully.
86+
"""
87+
88+
When I run `wp bp group member promote --group-id={GROUP_ID} --user-id={ANOTHER_MEMBER_ID} --role=admin`
89+
Then STDOUT should contain:
90+
"""
91+
Success: Member promoted to new role successfully.
92+
"""
93+
94+
When I run `wp bp group member demote --group-id={GROUP_ID} --user-id={ANOTHER_MEMBER_ID}`
95+
Then STDOUT should contain:
96+
"""
97+
Success: User demoted to the "member" status.
98+
"""
99+
100+
When I run `wp bp group member ban --group-id={GROUP_ID} --user-id={ANOTHER_MEMBER_ID}`
58101
Then STDOUT should contain:
59102
"""
60103
Success: Member banned from the group.
61104
"""
62105

63106
When I run `wp bp group member list {GROUP_ID} --fields=user_id --role=banned`
64107
Then STDOUT should be a table containing rows:
65-
| user_id |
66-
| {MEMBER_ID} |
108+
| user_id |
109+
| {ANOTHER_MEMBER_ID} |
67110

68-
When I run `wp bp group member unban --group-id={GROUP_ID} --user-id={MEMBER_ID}`
111+
When I run `wp bp group member unban --group-id={GROUP_ID} --user-id={ANOTHER_MEMBER_ID}`
69112
Then STDOUT should contain:
70113
"""
71114
Success: Member unbanned from the group.
@@ -74,8 +117,8 @@ Feature: Manage BuddyPress Group Members
74117
When I try `wp bp group member list {GROUP_ID} --fields=user_id --role=banned`
75118
Then the return code should be 1
76119

77-
When I run `wp bp group member remove --group-id={GROUP_ID} --user-id={MEMBER_ID}`
120+
When I run `wp bp group member remove --group-id={GROUP_ID} --user-id={ANOTHER_MEMBER_ID}`
78121
Then STDOUT should contain:
79122
"""
80-
Success: Member #{MEMBER_ID} removed from the group #{GROUP_ID}.
123+
Success: Member #{ANOTHER_MEMBER_ID} removed from the group #{GROUP_ID}.
81124
"""

features/group.feature

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ Feature: Manage BuddyPress Groups
2828

2929
When I try `wp bp group get i-do-not-exist`
3030
Then the return code should be 1
31+
Then STDERR should be:
32+
"""
33+
Error: No group found by that slug or ID.
34+
"""
3135

3236
When I run `wp bp group update {GROUP_ID} --description=foo`
3337
Then STDOUT should not be empty
@@ -46,17 +50,27 @@ Feature: Manage BuddyPress Groups
4650

4751
When I try `wp bp group get {GROUP_ID}`
4852
Then the return code should be 1
53+
Then STDERR should be:
54+
"""
55+
Error: No group found by that slug or ID.
56+
"""
4957

5058
Scenario: Group list
5159

5260
When I run `wp bp group create --name="ZZZ Group 1" --slug=group1 --porcelain`
5361
Then STDOUT should be a number
5462
And save STDOUT as {GROUP_ONE_ID}
5563

64+
When I run `wp bp group meta add {GROUP_ONE_ID} invite_status 'public'`
65+
Then STDOUT should not be empty
66+
5667
When I run `wp bp group create --name="AAA Group 2" --slug=group2 --porcelain`
5768
Then STDOUT should be a number
5869
And save STDOUT as {GROUP_TWO_ID}
5970

71+
When I run `wp bp group meta add {GROUP_TWO_ID} invite_status 'public'`
72+
Then STDOUT should not be empty
73+
6074
When I run `wp bp group list --fields=id,name,slug`
6175
Then STDOUT should be a table containing rows:
6276
| id | name | slug |
@@ -82,7 +96,7 @@ Feature: Manage BuddyPress Groups
8296
When I try `wp bp group list --fields=id --user-id={MEMBER_ID}`
8397
Then the return code should be 1
8498

85-
When I run `wp bp group member create --group-id={GROUP_ONE_ID} --user-id={MEMBER_ID}`
99+
When I run `wp bp group member add --group-id={GROUP_ONE_ID} --user-id={MEMBER_ID}`
86100
Then the return code should be 0
87101

88102
When I run `wp bp group list --fields=id --user-id={MEMBER_ID}`

src/group-member.php

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ public function create( $args, $assoc_args ) {
7979
}
8080

8181
if ( 'member' !== $role ) {
82-
groups_promote_member( $user->ID, $group_id, $role );
82+
$group_member = new \BP_Groups_Member( $user->ID, $group_id );
83+
$group_member->promote( $role );
8384
}
8485

8586
WP_CLI::success(
@@ -117,12 +118,20 @@ public function create( $args, $assoc_args ) {
117118
* @alias trash
118119
*/
119120
public function delete( $args, $assoc_args ) {
120-
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
121-
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
122-
$member = new \BP_Groups_Member( $user->ID, $group_id );
121+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
122+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
123+
$group_member = new \BP_Groups_Member( $user->ID, $group_id );
124+
125+
// Check if the user is the only admin of the group.
126+
if ( (bool) $group_member->is_admin ) {
127+
$group_admins = groups_get_group_admins( $group_id );
128+
if ( 1 === count( $group_admins ) ) {
129+
WP_CLI::error( 'Cannot remove the only admin of the group.' );
130+
}
131+
}
123132

124133
// True on success.
125-
if ( $member->remove() ) {
134+
if ( $group_member->remove() ) {
126135
WP_CLI::success( sprintf( 'Member #%d removed from the group #%d.', $user->ID, $group_id ) );
127136
} else {
128137
WP_CLI::error( 'Could not remove member from the group.' );
@@ -217,6 +226,10 @@ public function list_( $args, $assoc_args ) {
217226

218227
$members = $members_query['members'];
219228

229+
if ( empty( $members ) ) {
230+
WP_CLI::error( 'No group members found.' );
231+
}
232+
220233
// Make 'role' human-readable.
221234
foreach ( $members as &$member ) {
222235
$role = 'member';
@@ -229,10 +242,6 @@ public function list_( $args, $assoc_args ) {
229242
$member->role = $role;
230243
}
231244

232-
if ( empty( $members ) ) {
233-
WP_CLI::error( 'No group members found.' );
234-
}
235-
236245
if ( empty( $assoc_args['fields'] ) ) {
237246
$assoc_args['fields'] = [
238247
'id',
@@ -277,11 +286,11 @@ public function list_( $args, $assoc_args ) {
277286
* Success: Member promoted to new role successfully.
278287
*/
279288
public function promote( $args, $assoc_args ) {
280-
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
281-
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
282-
$member = new \BP_Groups_Member( $user->ID, $group_id );
289+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
290+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
291+
$group_member = new \BP_Groups_Member( $user->ID, $group_id );
283292

284-
if ( $member->promote( $assoc_args['role'] ) ) {
293+
if ( $group_member->promote( $assoc_args['role'] ) ) {
285294
WP_CLI::success( 'Member promoted to new role successfully.' );
286295
} else {
287296
WP_CLI::error( 'Could not promote the member.' );
@@ -301,20 +310,38 @@ public function promote( $args, $assoc_args ) {
301310
*
302311
* ## EXAMPLES
303312
*
304-
* # Demote a user to the "member" status.
313+
* # Demote a user to the "member" status using numeric IDs.
305314
* $ wp bp group member demote --group-id=3 --user-id=10
306315
* Success: User demoted to the "member" status.
307316
*
308-
* # Demote a user to the "member" status.
317+
* # Demote a user to the "member" status using slugs.
309318
* $ wp bp group member demote --group-id=foo --user-id=admin
310319
* Success: User demoted to the "member" status.
320+
*
321+
* # Demote a user not part of the group.
322+
* $ wp bp group member demote --group-id=foo --user-id=admin
323+
* Error: User is not a member of the group.
311324
*/
312325
public function demote( $args, $assoc_args ) {
313326
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
314327
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
315-
$member = new \BP_Groups_Member( $user->ID, $group_id );
316328

317-
if ( $member->demote() ) {
329+
// Check if the user is a member of the group.
330+
if ( ! groups_is_user_member( $user->ID, $group_id ) ) {
331+
WP_CLI::error( 'User is not a member of the group.' );
332+
}
333+
334+
$group_member = new \BP_Groups_Member( $user->ID, $group_id );
335+
336+
// Check if the user is the only admin of the group.
337+
if ( (bool) $group_member->is_admin ) {
338+
$group_admins = groups_get_group_admins( $group_id );
339+
if ( 1 === count( $group_admins ) ) {
340+
WP_CLI::error( 'Cannot demote the only admin of the group.' );
341+
}
342+
}
343+
344+
if ( $group_member->demote() ) {
318345
WP_CLI::success( 'User demoted to the "member" status.' );
319346
} else {
320347
WP_CLI::error( 'Could not demote the member.' );
@@ -345,9 +372,15 @@ public function demote( $args, $assoc_args ) {
345372
public function ban( $args, $assoc_args ) {
346373
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
347374
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
348-
$member = new \BP_Groups_Member( $user->ID, $group_id );
349375

350-
if ( $member->ban() ) {
376+
// Check if the user is a member of the group.
377+
if ( ! groups_is_user_member( $user->ID, $group_id ) ) {
378+
WP_CLI::error( 'User is not a member of the group.' );
379+
}
380+
381+
$group_member = new \BP_Groups_Member( $user->ID, $group_id );
382+
383+
if ( $group_member->ban() ) {
351384
WP_CLI::success( 'Member banned from the group.' );
352385
} else {
353386
WP_CLI::error( 'Could not ban the member.' );

src/group.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,12 @@ public function create( $args, $assoc_args ) {
129129
]
130130
);
131131

132-
// Auto-generate some stuff.
132+
// Auto-generate slug.
133133
if ( empty( $r['slug'] ) ) {
134134
$r['slug'] = groups_check_slug( sanitize_title( $r['name'] ) );
135135
}
136136

137+
// Auto-generate description.
137138
if ( empty( $r['description'] ) ) {
138139
$r['description'] = sprintf( 'Description for group "%s"', $r['name'] );
139140
}
@@ -364,7 +365,9 @@ function ( $group_id ) {
364365
*
365366
* ## EXAMPLES
366367
*
368+
* # Update a group.
367369
* $ wp bp group update 35 --description="What a cool group!" --name="Group of Cool People"
370+
* Success: Group updated.
368371
*/
369372
public function update( $args, $assoc_args ) {
370373
parent::_update(

0 commit comments

Comments
 (0)