diff --git a/src/FederationServer/Classes/Enums/Method.php b/src/FederationServer/Classes/Enums/Method.php index bf2910b..8f08ab8 100644 --- a/src/FederationServer/Classes/Enums/Method.php +++ b/src/FederationServer/Classes/Enums/Method.php @@ -9,6 +9,7 @@ use FederationServer\Methods\Operators\DeleteOperator; use FederationServer\Methods\Operators\EnableOperator; use FederationServer\Methods\Operators\GetOperator; + use FederationServer\Methods\Operators\ListOperators; use FederationServer\Methods\Operators\ManageBlacklistPermission; use FederationServer\Methods\Operators\ManageClientPermission; use FederationServer\Methods\Operators\ManageOperatorsPermission; @@ -40,8 +41,7 @@ switch($this) { case self::LIST_OPERATORS: - // This method does not have a dedicated handler, it is handled by the main request handler - // in FederationServer::handleRequest() + ListOperators::handleRequest(); break; case self::GET_OPERATOR: GetOperator::handleRequest(); diff --git a/src/FederationServer/Classes/Managers/OperatorManager.php b/src/FederationServer/Classes/Managers/OperatorManager.php index ca2a513..5da279b 100644 --- a/src/FederationServer/Classes/Managers/OperatorManager.php +++ b/src/FederationServer/Classes/Managers/OperatorManager.php @@ -317,4 +317,42 @@ throw new DatabaseOperationException(sprintf("Failed to set client status for operator with UUID '%s'", $uuid), 0, $e); } } + + /** + * Retrieve a list of operators with pagination support. + * + * @param int $limit The maximum number of operators to retrieve. + * @param int $page The page number for pagination. + * @return OperatorRecord[] An array of OperatorRecord objects representing the operators. + * @throws DatabaseOperationException If there is an error during the database operation. + */ + public static function getOperators(int $limit=100, int $page=1): array + { + if($limit < 1 || $page < 1) + { + throw new InvalidArgumentException('Limit and page must be greater than 0.'); + } + + $offset = ($page - 1) * $limit; + + try + { + $stmt = DatabaseConnection::getConnection()->prepare("SELECT * FROM operators LIMIT :limit OFFSET :offset"); + $stmt->bindParam(':limit', $limit, PDO::PARAM_INT); + $stmt->bindParam(':offset', $offset, PDO::PARAM_INT); + $stmt->execute(); + + $operators = []; + while($data = $stmt->fetch()) + { + $operators[] = new OperatorRecord($data); + } + + return $operators; + } + catch (PDOException $e) + { + throw new DatabaseOperationException('Failed to retrieve operators', 0, $e); + } + } } \ No newline at end of file diff --git a/src/FederationServer/Methods/Operators/ListOperators.php b/src/FederationServer/Methods/Operators/ListOperators.php new file mode 100644 index 0000000..95e2a3e --- /dev/null +++ b/src/FederationServer/Methods/Operators/ListOperators.php @@ -0,0 +1,50 @@ +canManageOperators()) + { + throw new RequestException('Unauthorized: Insufficient permissions to list operators', 403); + } + + $limit = (int) (FederationServer::getParameter('limit') ?? 100); + $page = (int) (FederationServer::getParameter('page') ?? 1); + + if($limit < 1) + { + $limit = 100; + } + + if($page < 1) + { + $page = 1; + } + + try + { + $operators = OperatorManager::getOperators($limit, $page); + } + catch (DatabaseOperationException $e) + { + throw new RequestException('Internal Server Error: Unable to retrieve operators', 500, $e); + } + + $result = array_map(fn($op) => $op->toArray(), $operators); + self::successResponse($result); + } + } +