diff options
author | Joas Schilling <coding@schilljs.com> | 2017-07-11 15:22:03 +0300 |
---|---|---|
committer | Joas Schilling <coding@schilljs.com> | 2017-07-17 12:05:51 +0300 |
commit | 451bd8e82b5a9644862367dc5952e87a1802496f (patch) | |
tree | d410fd95709eb9c9a4056e10b83a35fc007fa173 | |
parent | 96f762e92d313a37628938ac0e280d3b09f73742 (diff) |
Endpoint to remove a user from a room
Signed-off-by: Joas Schilling <coding@schilljs.com>
-rw-r--r-- | appinfo/routes.php | 9 | ||||
-rw-r--r-- | lib/Controller/RoomController.php | 45 |
2 files changed, 52 insertions, 2 deletions
diff --git a/appinfo/routes.php b/appinfo/routes.php index 40b96225f..794dfdf5d 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -140,6 +140,15 @@ return [ ], ], [ + 'name' => 'Room#removeParticipantFromRoom', + 'url' => '/api/{apiVersion}/room/{token}/participants', + 'verb' => 'DELETE', + 'requirements' => [ + 'apiVersion' => 'v1', + 'token' => '^[a-z0-9]{4,30}$', + ], + ], + [ 'name' => 'Room#removeSelfFromRoom', 'url' => '/api/{apiVersion}/room/{token}/participants/self', 'verb' => 'DELETE', diff --git a/lib/Controller/RoomController.php b/lib/Controller/RoomController.php index 45403111f..dbaae8bdf 100644 --- a/lib/Controller/RoomController.php +++ b/lib/Controller/RoomController.php @@ -425,6 +425,47 @@ class RoomController extends OCSController { * @NoAdminRequired * * @param string $token + * @param string $participant + * @return DataResponse + */ + public function removeParticipantFromRoom($token, $participant) { + try { + $room = $this->manager->getRoomForParticipantByToken($token, $this->userId); + $currentParticipant = $room->getParticipant($this->userId); + } catch (RoomNotFoundException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } catch (\RuntimeException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + if (!in_array($currentParticipant->getParticipantType(), [Participant::OWNER, Participant::MODERATOR], true)) { + return new DataResponse([], Http::STATUS_FORBIDDEN); + } + + if ($room->getType() === Room::ONE_TO_ONE_CALL) { + $room->deleteRoom(); + return new DataResponse([]); + } + + try { + $targetParticipant = $room->getParticipant($participant); + } catch (\RuntimeException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + if ($targetParticipant->getParticipantType() === Participant::OWNER) { + return new DataResponse([], Http::STATUS_FORBIDDEN); + } + + $targetUser = $this->userManager->get($participant); + $room->removeUser($targetUser); + return new DataResponse([]); + } + + /** + * @NoAdminRequired + * + * @param string $token * @return DataResponse */ public function removeSelfFromRoom($token) { @@ -526,7 +567,7 @@ class RoomController extends OCSController { } if (!in_array($targetParticipant->getParticipantType(), [Participant::OWNER, Participant::MODERATOR], true)) { - return new DataResponse([''], Http::STATUS_PRECONDITION_FAILED); + return new DataResponse([], Http::STATUS_PRECONDITION_FAILED); } $room->setParticipantType($participant, Participant::MODERATOR); @@ -562,7 +603,7 @@ class RoomController extends OCSController { } if ($targetParticipant->getParticipantType() !== Participant::MODERATOR) { - return new DataResponse([''], Http::STATUS_PRECONDITION_FAILED); + return new DataResponse([], Http::STATUS_PRECONDITION_FAILED); } $room->setParticipantType($participant, Participant::USER); |