• Модуль: voximplant
  • Путь к файлу: ~/bitrix/modules/voximplant/lib/rest/helper.php
  • Класс: BitrixVoximplantRestHelper
  • Вызов: Helper::attachRecordWithUrl
static function attachRecordWithUrl($callId, $recordUrl, $fileName = '')
{
	$result = new Result();

	$statisticRecord = StatisticTable::getByCallId($callId);
	if (!$statisticRecord)
	{
		$result->addError(new Error("Call is not found in the statistic table. Looks like it is not finished yet."));
		return $result;
	}

	$urlPath = parse_url($recordUrl, PHP_URL_PATH);
	if ($fileName !== '')
	{
		$tempPath = CFile::GetTempName('', bx_basename($fileName));
	}
	else if ($urlPath && $urlPath !== '')
	{
		$tempPath = CFile::GetTempName('', bx_basename($urlPath));
	}
	else
	{
		$tempPath = CFile::GetTempName('', bx_basename($recordUrl));
	}

	try
	{
		IODirectory::createDirectory(IOPath::getDirectory($tempPath));
		if (IODirectory::isDirectoryExists(IOPath::getDirectory($tempPath)) === false)
		{
			return $result->addError(new Error('Could not create temporary directory', 'INTERNAL_ERROR'));
		}

		$file = new IOFile($tempPath);
		$handler = $file->open("w+");
	}
	catch(Exception $exception)
	{
		$result->addError(new Error($exception->getMessage(), 'INTERNAL_ERROR'));

		return $result;
	}

	$httpClient = HttpClientFactory::create([
		"disableSslVerification" => true
	]);

	$httpClient->setOutputStream($handler);
	$queryResult = $httpClient->query('GET', $recordUrl);
	$httpClient->getResult();
	$file->close();

	if ($queryResult === false)
	{
		$httpClientErrors = $httpClient->getError();
		if (!empty($httpClientErrors))
		{
			foreach ($httpClientErrors as $code => $message)
			{
				return $result->addError(new Error($code . ": " . $message, 'SERVER_NOT_AVAILABLE'));
			}
		}
	}

	if ($httpClient->getStatus() !== 200)
	{
		return $result->addError(new Error('Server returns HTTP error code ' . $httpClient->getStatus()));
	}

	//check for http errors once more
	$httpClientErrors = $httpClient->getError();
	if (!empty($httpClientErrors))
	{
		foreach ($httpClientErrors as $code => $message)
		{
			return $result->addError(new Error($code . ": " . $message, 'SERVER_NOT_AVAILABLE'));
		}
	}

	$fileArray = CFile::MakeFileArray($tempPath);

	$isCorrectFileResult = SecurityRecordFile::isCorrectFromArray($fileArray);
	if (!$isCorrectFileResult->isSuccess())
	{
		return $result->addErrors($isCorrectFileResult->getErrors());
	}

	$saveResult = static::saveFile($statisticRecord['CALL_START_DATE']->format("Y-m"), $fileName, $fileArray, $statisticRecord['PORTAL_USER_ID']);
	if (!$saveResult->isSuccess())
	{
		$result->addErrors($saveResult->getErrors());
		return $result;
	}
	$saveResultData = $saveResult->getData();
	$file = $saveResultData['FILE'];

	if ($statisticRecord['CALL_WEBDAV_ID'])
	{
		Application::getInstance()->addBackgroundJob(
			[__CLASS__, 'deleteFile'],
			[$statisticRecord['CALL_WEBDAV_ID'], $statisticRecord['PORTAL_USER_ID']]
		);
	}

	$attachResult = static::attachFile($callId, $file, $recordUrl);
	if (!$attachResult->isSuccess())
	{
		$result->addErrors($attachResult->getErrors());
		return $result;
	}

	$result->setData([
		'FILE_ID' => $file->getId()
	]);

	return $result;
}