• Модуль: rest
  • Путь к файлу: ~/bitrix/modules/rest/lib/api/user.php
  • Класс: BitrixRestApiUser
  • Вызов: User::userGet
static function userGet($query, $nav = 0, CRestServer $server)
{
	global $USER;

	static::checkAllowedFields();

	static $moduleAdminList = false;

	$query = array_change_key_case($query, CASE_UPPER);

	$sort = $query['SORT'];
	$order = $query['ORDER'];
	$adminMode = false;

	//getting resize preset before user data preparing
	$resizePresets = [
		"small"=>["width"=>150, "height" => 150],
		"medium"=>["width"=>300, "height" => 300],
		"large"=>["width"=>1000, "height" => 1000],
	];

	$presetName = $query["IMAGE_RESIZE"];
	$resize = ($presetName && $resizePresets[$presetName]
		? $resizePresets[$presetName]
		: false);

	if (isset($query['ADMIN_MODE']) && $query['ADMIN_MODE'])
	{
		if ($moduleAdminList === false && Loader::includeModule('socialnetwork'))
		{
			$moduleAdminList = BitrixSocialnetworkUser::getModuleAdminList(array(SITE_ID, false));
		}

		if (is_array($moduleAdminList))
		{
			$adminMode = (array_key_exists($USER->getID(), $moduleAdminList));
		}
	}

	$allowedUserFields = static::getAllowedUserFields($server->getAuthScope());
	$allowedUserFields[] = 'IS_ONLINE';
	$allowedUserFields[] = 'HAS_DEPARTAMENT';
	$allowedUserFields[] = 'NAME_SEARCH';
	$allowedUserFields[] = 'EXTERNAL_AUTH_ID';
	if ($server->getMethod() == "user.search")
	{
		$allowedUserFields[] = 'FIND';
		$allowedUserFields[] = 'UF_DEPARTMENT_NAME';
		$allowedUserFields[] = 'CONFIRM_CODE';
	}

	if (isset($query['FILTER']) && is_array($query['FILTER']))
	{
		/**
		 * The following code is a mistake
		 * but it must be here to save backward compatibility
		 */
		$query = array_change_key_case($query['FILTER'], CASE_UPPER);
	}

	$filter = self::prepareUserFilter(
		$query,
		$allowedUserFields,
		[
			'HAS_DEPARTAMENT',
			'NAME_SEARCH',
			'FIND'
		]
	);

	if (isset($filter['NAME_SEARCH']) || isset($filter['FIND']))
	{
		$nameSearch = isset($filter['NAME_SEARCH'])? $filter['NAME_SEARCH']: $filter['FIND'];
		unset($filter['NAME_SEARCH']);
		unset($filter['FIND']);

		$filter = array_merge($filter, BitrixMainUserUtils::getUserSearchFilter(Array(
			'FIND' => $nameSearch
		)));
	}
	else if ($server->getMethod() == "user.search")
	{
		$previousFilter = $filter;
		unset($filter['NAME']);
		unset($filter['LAST_NAME']);
		unset($filter['SECOND_NAME']);
		unset($filter['WORK_POSITION']);
		unset($filter['UF_DEPARTMENT_NAME']);

		$filter = array_merge($filter, BitrixMainUserUtils::getUserSearchFilter(Array(
			'NAME' => $previousFilter['NAME'],
			'LAST_NAME' => $previousFilter['LAST_NAME'],
			'SECOND_NAME' => $previousFilter['SECOND_NAME'],
			'WORK_POSITION' => $previousFilter['WORK_POSITION'],
			'UF_DEPARTMENT_NAME' => $previousFilter['UF_DEPARTMENT_NAME'],
		)));
	}

	if (
		!$adminMode
		&& Loader::includeModule("extranet")
	)
	{
		$filteredUserIDs = CExtranet::getMyGroupsUsersSimple(CExtranet::getExtranetSiteID());
		$filteredUserIDs[] = $USER->getID();

		if (CExtranet::isIntranetUser())
		{
			if (
				!isset($filter["ID"])
				|| !Loader::includeModule('socialnetwork')
				|| !CSocNetUser::IsCurrentUserModuleAdmin(CSite::getDefSite(), false)
			)
			{
				$filter[] = array(
					'LOGIC' => 'OR',
					'!UF_DEPARTMENT' => false,
					'ID' => $filteredUserIDs
				);
			}
		}
		else
		{
			$filter["ID"] = (isset($filter["ID"]) ? array_intersect((is_array($filter["ID"]) ? $filter["ID"] : array($filter["ID"])), $filteredUserIDs) : $filteredUserIDs);
		}
	}

	if (array_key_exists('HAS_DEPARTAMENT', $filter))
	{
		if ($filter['HAS_DEPARTAMENT'] === 'Y')
		{
			$filter[] = [
				'LOGIC' => 'AND',
				'!UF_DEPARTMENT' => false,
			];
		}

		unset($filter['HAS_DEPARTAMENT']);
	}

	$filter['=IS_REAL_USER'] = 'Y';

	$getListClassName = 'BitrixMainUserTable';
	if (Loader::includeModule('intranet'))
	{
		$getListClassName = 'BitrixIntranetUserTable';
	}
	$getListMethodName = 'getList';

	$navParams = self::getNavData($nav, true);

	$querySort = [];
	if ($sort && $order)
	{
		$querySort[$sort] = $order;
	}
	$allowedFields = static::getAllowedUserFields($server->getAuthScope());

	$dbRes = $getListClassName::$getListMethodName(
		[
			'order' => $querySort,
			'filter' => $filter,
			'select' => $allowedFields,
			'limit' => $navParams['limit'],
			'offset' => $navParams['offset'],
			'data_doubling' => false,
			'count_total' => $nav !== -1,
		]
	);

	$result = [];
	$files = [];

	while ($userInfo = $dbRes->fetch())
	{
		$result[] = self::getUserData($userInfo, $allowedFields);

		if ($userInfo['PERSONAL_PHOTO'] > 0)
		{
			$files[] = $userInfo['PERSONAL_PHOTO'];
		}
	}

	if (count($files) > 0)
	{
		$files = CRestUtil::getFile($files, $resize);

		foreach ($result as $key => $userInfo)
		{
			if ($userInfo['PERSONAL_PHOTO'] > 0)
			{
				$result[$key]['PERSONAL_PHOTO'] = $files[$userInfo['PERSONAL_PHOTO']];
			}
		}
	}

	if ($result)
	{
		$count = 0;
		if ($nav !== -1)
		{
			try
			{
				$count = $dbRes->getCount();
			}
			catch (ObjectPropertyException $exception)
			{
			}
		}

		return self::setNavData(
			$result,
			[
				'count' => $count,
				'offset' => $navParams['offset']
			]
		);
	}

	return $result;
}