userManager = $userManager; $this->groupManager = $groupManager; $this->roomService = $roomService; $this->restrictionService = $restrictionService; $this->roomShareService = $roomShareService; $this->circleHelper = $circleHelper; } public function getRestriction(string $uid): Restriction { $user = $this->userManager->get($uid); $groupIds = $this->groupManager->getUserGroupIds($user); return $this->restrictionService->findByGroupIds($groupIds); } public function isAllowedToCreateRoom(string $uid): bool { $restriction = $this->getRestriction($uid); if ($restriction->getMaxRooms() < 0) { return true; } $numberOfCreatedRooms = count($this->roomService->findByUserId($uid)); return $restriction->getMaxRooms() > $numberOfCreatedRooms; } public function isUser(Room $room, ?string $uid): bool { return $this->hasPermission($room, $uid, function (RoomShare $share) { return $share->hasUserPermission(); }); } public function isModerator(Room $room, ?string $uid): bool { if ($room->everyoneIsModerator) { return true; } return $this->hasPermission($room, $uid, function (RoomShare $share) { return $share->hasModeratorPermission(); }); } public function isAdmin(Room $room, ?string $uid): bool { return $this->hasPermission($room, $uid, function (RoomShare $share) { return $share->hasAdminPermission(); }); } private function hasPermission(Room $room, ?string $uid, Closure $hasPermission): bool { if ($uid === null) { return false; } if ($uid === $room->userId) { return true; } $shares = $this->roomShareService->findAll($room->id); /** @var RoomShare $share */ foreach ($shares as $share) { if (!$hasPermission($share)) { continue; } if ($share->getShareType() === RoomShare::SHARE_TYPE_USER) { if ($share->getShareWith() === $uid) { return true; } } elseif ($share->getShareType() === RoomShare::SHARE_TYPE_GROUP) { if ($this->groupManager->isInGroup($uid, $share->getShareWith())) { return true; } } elseif ($share->getShareType() === RoomShare::SHARE_TYPE_CIRCLE) { if ($this->circleHelper->isInCircle($uid, $share->getShareWith())) { return true; } } } return false; } }