diff --git a/application/applicationextension.inc.php b/application/applicationextension.inc.php index 015e80ce8..0c0ee5b9a 100644 --- a/application/applicationextension.inc.php +++ b/application/applicationextension.inc.php @@ -817,6 +817,10 @@ class RestResult * Result: the requested operation cannot be performed because it can cause data (integrity) loss */ const UNSAFE = 12; + /** + * Result: the request page number is not valid. It must be an integer greater than 0 + */ + const INVALID_PAGE = 13; /** * Result: the operation could not be performed, see the message for troubleshooting */ @@ -1079,10 +1083,13 @@ class RestUtils * * @param string $sClass Name of the class * @param mixed $key Either search criteria (substructure), or an object or an OQL string. + * @param int $iLimit The limit of results to return + * @param int $iOffset The offset of results to return + * * @return DBObjectSet The search result set * @throws Exception If the input structure is not valid */ - public static function GetObjectSetFromKey($sClass, $key) + public static function GetObjectSetFromKey($sClass, $key, $iLimit = 0, $iOffset = 0) { if (is_object($key)) { @@ -1117,7 +1124,7 @@ class RestUtils { throw new Exception("Wrong format for key"); } - $oObjectSet = new DBObjectSet($oSearch); + $oObjectSet = new DBObjectSet($oSearch, array(), array(), null, $iLimit, $iOffset); return $oObjectSet; } diff --git a/core/restservices.class.inc.php b/core/restservices.class.inc.php index 916dd5f72..2ec01292c 100644 --- a/core/restservices.class.inc.php +++ b/core/restservices.class.inc.php @@ -436,8 +436,10 @@ class CoreServices implements iRestServiceProvider $key = RestUtils::GetMandatoryParam($aParams, 'key'); $aShowFields = RestUtils::GetFieldList($sClass, $aParams, 'output_fields'); $bExtendedOutput = (RestUtils::GetOptionalParam($aParams, 'output_fields', '*') == '*+'); + $iLimit = (int)RestUtils::GetOptionalParam($aParams, 'limit', 0); + $iPage = (int)RestUtils::GetOptionalParam($aParams, 'page', 1); - $oObjectSet = RestUtils::GetObjectSetFromKey($sClass, $key); + $oObjectSet = RestUtils::GetObjectSetFromKey($sClass, $key, $iLimit, self::getOffsetFromLimitAndPage($iLimit, $iPage)); $sTargetClass = $oObjectSet->GetFilter()->GetClass(); if (UserRights::IsActionAllowed($sTargetClass, UR_ACTION_READ) != UR_ALLOWED_YES) @@ -450,6 +452,11 @@ class CoreServices implements iRestServiceProvider $oResult->code = RestResult::UNAUTHORIZED; $oResult->message = "The current user does not have enough permissions for exporting data of class $sTargetClass"; } + elseif ($iPage < 1) + { + $oResult->code = RestResult::INVALID_PAGE; + $oResult->message = "The request page number is not valid. It must be an integer greater than 0"; + } else { while ($oObject = $oObjectSet->Fetch()) @@ -774,4 +781,15 @@ class CoreServices implements iRestServiceProvider $oResult->message = $sRes; } } + + /** + * @param int $iLimit + * @param int $iPage + * + * @return int Offset for a given page number + */ + protected static function getOffsetFromLimitAndPage($iLimit, $iPage) + { + return $iLimit * max(0, $iPage - 1); + } }