From 451bd8e82b5a9644862367dc5952e87a1802496f Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 11 Jul 2017 14:22:03 +0200 Subject: Endpoint to remove a user from a room Signed-off-by: Joas Schilling --- appinfo/routes.php | 9 ++++++++ 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 @@ -139,6 +139,15 @@ return [ 'token' => '^[a-z0-9]{4,30}$', ], ], + [ + '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', 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 @@ -421,6 +421,47 @@ class RoomController extends OCSController { return new DataResponse([]); } + /** + * @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 * @@ -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); -- cgit v1.2.3