Skip to content

Commit c83c133

Browse files
committed
Space Membership Controller
1 parent 638bf07 commit c83c133

File tree

6 files changed

+362
-155
lines changed

6 files changed

+362
-155
lines changed

Events.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ public static function onBeforeRequest($event)
4444
// User: Session Controller
4545
['pattern' => 'api/v1/user/session/all/<id:\d+>', 'route' => 'rest/user/session/delete-from-user', 'verb' => 'DELETE'],
4646

47-
4847
// Space: Default Controller
4948
['pattern' => 'api/v1/space/', 'route' => '/rest/space/space/index', 'verb' => ['GET', 'HEAD']],
5049
['pattern' => 'api/v1/space/<id:\d+>', 'route' => '/rest/space/space/view', 'verb' => ['GET', 'HEAD']],
@@ -56,6 +55,12 @@ public static function onBeforeRequest($event)
5655
['pattern' => 'api/v1/space/<id:\d+>/archive', 'route' => '/rest/space/archive/archive', 'verb' => 'PATCH'],
5756
['pattern' => 'api/v1/space/<id:\d+>/unarchive', 'route' => '/rest/space/archive/unarchive', 'verb' => 'PATCH'],
5857

58+
// Space: Membership Controller
59+
['pattern' => 'api/v1/space/<spaceId:\d+>/membership', 'route' => '/rest/space/membership/index', 'verb' => 'GET'],
60+
['pattern' => 'api/v1/space/<spaceId:\d+>/membership/<userId:\d+>', 'route' => '/rest/space/membership/create', 'verb' => 'POST'],
61+
['pattern' => 'api/v1/space/<spaceId:\d+>/membership/<userId:\d+>/role', 'route' => '/rest/space/membership/role', 'verb' => ['PUT', 'PATCH']],
62+
['pattern' => 'api/v1/space/<spaceId:\d+>/membership/<userId:\d+>', 'route' => '/rest/space/membership/delete', 'verb' => 'DELETE'],
63+
5964
// Content
6065
['pattern' => 'api/v1/content/find-by-container/<id:\d+>', 'route' => 'rest/content/content/find-by-container', 'verb' => ['GET', 'HEAD']],
6166
['pattern' => 'api/v1/content/container', 'route' => 'rest/content/container/list', 'verb' => 'GET'],
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
/**
3+
* @link https://www.humhub.org/
4+
* @copyright Copyright (c) 2019 HumHub GmbH & Co. KG
5+
* @license https://www.humhub.com/licences
6+
*/
7+
8+
namespace humhub\modules\rest\controllers\space;
9+
10+
use Colors\RandomColor;
11+
use humhub\modules\rest\components\BaseController;
12+
use humhub\modules\rest\definitions\SpaceDefinitions;
13+
use humhub\modules\space\models\Membership;
14+
use humhub\modules\space\models\Space;
15+
use humhub\modules\space\modules\manage\models\AdvancedSettingsSpace;
16+
use humhub\modules\space\permissions\CreatePrivateSpace;
17+
use humhub\modules\space\permissions\CreatePublicSpace;
18+
use Yii;
19+
20+
/**
21+
* Class MembershipController
22+
*/
23+
class MembershipController extends BaseController
24+
{
25+
26+
27+
public function actionIndex($spaceId)
28+
{
29+
$space = Space::findOne(['id' => (int)$spaceId]);
30+
if ($space === null) {
31+
return $this->returnError(404, 'Space not found!');
32+
}
33+
if (!$space->isAdmin()) {
34+
return $this->returnError(400, 'You cannot administer this space!');
35+
}
36+
37+
$results = [];
38+
$query = Membership::find()->where(['space_id' => $space->id]);
39+
40+
$pagination = $this->handlePagination($query);
41+
foreach ($query->all() as $membership) {
42+
/** @var Membership $membership */
43+
$results[] = SpaceDefinitions::getSpaceMembership($membership);
44+
}
45+
return $this->returnPagination($query, $pagination, $results);
46+
}
47+
48+
public function actionCreate($spaceId, $userId)
49+
{
50+
$space = Space::findOne(['id' => (int)$spaceId]);
51+
if ($space === null) {
52+
return $this->returnError(404, 'Space not found!');
53+
}
54+
if (!$space->isAdmin()) {
55+
return $this->returnError(400, 'You cannot administer this space!');
56+
}
57+
58+
$space->addMember($userId, Yii::$app->request->get('canLeave', true), Yii::$app->request->get('silent', false));
59+
60+
return $this->returnSuccess('Member added!');
61+
}
62+
63+
public function actionDelete($spaceId, $userId)
64+
{
65+
$space = Space::findOne(['id' => (int)$spaceId]);
66+
if ($space === null) {
67+
return $this->returnError(404, 'Space not found!');
68+
}
69+
if (!$space->isAdmin()) {
70+
return $this->returnError(400, 'You cannot administer this space!');
71+
}
72+
73+
if ($space->removeMember($userId)) {
74+
return $this->returnSuccess('Member deleted');
75+
}
76+
return $this->returnError(404, 'Member NOT deleted!');
77+
78+
}
79+
80+
public function actionRole($spaceId, $userId)
81+
{
82+
$space = Space::findOne(['id' => (int)$spaceId]);
83+
if ($space === null) {
84+
return $this->returnError(404, 'Space not found!');
85+
}
86+
if (!$space->isAdmin()) {
87+
return $this->returnError(400, 'You cannot administer this space!');
88+
}
89+
90+
$membership = $space->getMembership($userId);
91+
if ($membership === null) {
92+
return $this->returnError(404, 'Membership not found!');
93+
}
94+
95+
$newRole = Yii::$app->request->get('role');
96+
if (!in_array($newRole, ['admin', 'moderator', 'member'])) {
97+
return $this->returnError(400, 'Invalid role given!');
98+
}
99+
100+
$membership->group_id = $newRole;
101+
$membership->save();
102+
103+
return $this->returnSuccess('Member updated!');
104+
}
105+
106+
107+
}

controllers/space/SpaceController.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ public function actionView($id)
4747

4848
public function actionCreate()
4949
{
50-
if (! Yii::$app->user->permissionmanager->can(new CreatePublicSpace) && ! Yii::$app->user->permissionmanager->can(new CreatePrivateSpace)) {
50+
if (!Yii::$app->user->permissionmanager->can(new CreatePublicSpace) && !Yii::$app->user->permissionmanager->can(new CreatePrivateSpace)) {
5151
return $this->returnError(401, 'You are not allowed to create spaces!');
5252
}
5353

54+
/** @var Space $module */
5455
$module = Yii::$app->getModule('space');
5556

5657
$space = new Space();
@@ -62,7 +63,7 @@ public function actionCreate()
6263
$space->load(Yii::$app->request->getBodyParams(), '');
6364
$space->validate();
6465

65-
if($space->hasErrors()) {
66+
if ($space->hasErrors()) {
6667
return $this->returnError(422, 'Validation failed', [
6768
'space' => $space->getErrors(),
6869
]);
@@ -84,15 +85,15 @@ public function actionUpdate($id)
8485
return $this->returnError(404, 'Space not found!');
8586
}
8687

87-
if (! $space->isAdmin()) {
88+
if (!$space->isAdmin()) {
8889
return $this->returnError(401, 'You are not allowed to manage this space!');
8990
}
9091

9192
$space->scenario = 'edit';
9293
$space->load(Yii::$app->request->getBodyParams(), '');
9394
$space->validate();
9495

95-
if($space->hasErrors()) {
96+
if ($space->hasErrors()) {
9697
return $this->returnError(422, 'Validation failed', [
9798
'space' => $space->getErrors(),
9899
]);
@@ -113,7 +114,7 @@ public function actionDelete($id)
113114
return $this->returnError(404, 'Space not found!');
114115
}
115116

116-
if (! $space->canDelete()) {
117+
if (!$space->canDelete()) {
117118
return $this->returnError(401, 'You are not allowed to delete this space!');
118119
}
119120

definitions/SpaceDefinitions.php

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace humhub\modules\rest\definitions;
99

10+
use humhub\modules\space\models\Membership;
1011
use humhub\modules\space\models\Space;
1112
use yii\helpers\Url;
1213

@@ -41,17 +42,24 @@ public static function getSpace(Space $space)
4142
'status' => $space->status,
4243
'tags' => $space->tags,
4344
'owner' => UserDefinitions::getUserShort($space->ownerUser),
44-
'members' => static::getMembers($space),
4545
];
4646
}
4747

48-
public static function getMembers(Space $space)
48+
public static function getSpaceMembership(Membership $membership)
4949
{
50-
$members = [];
51-
foreach ($space->getMembershipUser()->all() as $member) {
52-
$members[] = UserDefinitions::getUserShort($member);
53-
}
54-
return $members;
50+
return [
51+
'user' => UserDefinitions::getUserShort($membership->user),
52+
'role' => $membership->group_id,
53+
'status' => $membership->status,
54+
'can_cancel_membership' => $membership->can_cancel_membership,
55+
'send_notifications' => $membership->send_notifications,
56+
'show_at_dashboard' => $membership->show_at_dashboard,
57+
'originator_user' => ($membership->originator !== null) ? UserDefinitions::getUserShort($membership->originator) : null,
58+
'member_since' => $membership->created_at,
59+
'request_message' => $membership->request_message,
60+
'updated_at' => $membership->updated_at,
61+
'last_visit' => $membership->last_visit,
62+
];
5563
}
5664

5765
}

0 commit comments

Comments
 (0)