Your IP : 18.119.132.241


Current Path : /var/www/admin_ftp_12/data/www/httpdocs/bitrix/modules/messageservice/lib/sender/sms/
Upload File :
Current File : /var/www/admin_ftp_12/data/www/httpdocs/bitrix/modules/messageservice/lib/sender/sms/dummyhttp.php

<?php
namespace Bitrix\MessageService\Sender\Sms;

use Bitrix\Main\Error;
use Bitrix\Main\Result;
use Bitrix\Main\Web\HttpClient;
use Bitrix\Main\Web\Json;
use Bitrix\MessageService\DTO;
use Bitrix\MessageService\MessageStatus;
use Bitrix\MessageService\Sender;

/**
 * Class DummyHttp. For testing purposes only. It performs HTTP request with message parameters to the configured address.
 */
class DummyHttp extends Sender\BaseConfigurable
{
	public const ID = 'dummy_http';

	public function getId()
	{
		return static::ID;
	}

	public function getName()
	{
		return 'Dummy HTTP SMS';
	}

	public function getShortName()
	{
		return $this->getName();
	}

	public function getFromList()
	{
		return [
			[
				'id' => 'test',
				'name' => 'test',
			]
		];
	}

	public function sendMessage(array $messageFields): Sender\Result\SendMessage
	{
		$messageFields['MESSAGE_BODY'] = $this->prepareMessageBodyForSend($messageFields['MESSAGE_BODY']);
		$result = new Sender\Result\SendMessage();
		$host = $this->getOption('remoteHost');
		if (!$host)
		{
			return $result->addError(new Error('Provider is not configured'));
		}
		$requestBody = Json::encode($messageFields);

		$result->setServiceRequest(new DTO\Request([
			'method' => HttpClient::HTTP_POST,
			'uri' => $host,
			'body' => $requestBody,
		]));
		$httpClient = new HttpClient();
		$queryResult = $httpClient->query(HttpClient::HTTP_POST, $host, $requestBody);
		if (!$queryResult)
		{
			$error = $httpClient->getError();
			$errorCode = array_key_first($error);
			$result->setServiceResponse(new DTO\Response([
				'error' => Sender\Util::getHttpClientErrorString($httpClient)
			]));
			return $result->addError(new Error($error[$errorCode], $errorCode));
		}

		$result->setServiceResponse(new DTO\Response([
			'statusCode' => $httpClient->getStatus(),
			'headers' => $httpClient->getHeaders()->toArray(),
			'body' => $httpClient->getResult(),
		]));
		$responseCode = $httpClient->getStatus();
		if ($responseCode !== 200)
		{
			return $result->addError(new Error("HTTP response code {$responseCode}", "HTTP_{$responseCode}"));
		}

		$responseBody = $httpClient->getResult();
		if ($responseBody == '')
		{
			return $result->addError(new Error("Empty response", "EMPTY_RESPONSE"));
		}

		try
		{
			$decoded = Json::decode($responseBody);
			$result->setExternalId($decoded['message_id']);
			$result->setAccepted();
		}
		catch (\Throwable $e)
		{
			$result->addError(new Error("JSON decode error", "JSON_ERROR"));
		}
		return $result;
	}

	public function canUse()
	{
		return true;
	}

	public function isRegistered()
	{
		return true;
	}

	public function register(array $fields)
	{
		$this->setOption('remoteHost', $fields['remoteHost']);

		return new Result();
	}

	public function getOwnerInfo()
	{
		// TODO: Implement getOwnerInfo() method.
	}

	public function getRemoteHost()
	{
		return $this->getOption('remoteHost');
	}

	public function getExternalManageUrl()
	{
		return '';
	}

	public function getMessageStatus(array $messageFields)
	{
		$result = new Sender\Result\MessageStatus();
		$result->setId($messageFields['ID']);
		$result->setExternalId($messageFields['ID']);
		$result->setStatusCode(\Bitrix\MessageService\MessageStatus::DELIVERED);

		return $result;
	}

	public static function resolveStatus($serviceStatus)
	{
		switch ($serviceStatus)
		{
			case 'read':
			case 'sent':
				return MessageStatus::SENT;
			case 'enqueued':
				return MessageStatus::QUEUED;
			case 'delayed':
				return MessageStatus::ACCEPTED;
			case 'delivered':
				return MessageStatus::DELIVERED;
			case 'undelivered':
				return MessageStatus::UNDELIVERED;
			case 'failed':
			case 'cancelled':
				return MessageStatus::FAILED;
		}

		return parent::resolveStatus($serviceStatus);
	}
}