Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/messageservice/lib/Providers/Edna/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/messageservice/lib/Providers/Edna/Registrar.php

<?php

namespace Bitrix\MessageService\Providers\Edna;

use Bitrix\Main\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Result;
use Bitrix\MessageService\Providers\Constants\InternalOption;
use Bitrix\MessageService\Providers\Edna\EdnaRu;
use Bitrix\MessageService\Providers;
use Bitrix\MessageService\Providers\Edna;
use Bitrix\MessageService\Sender\Traits\RussianProvider;

abstract class Registrar extends Providers\Base\Registrar implements Providers\SupportChecker
{

	use RussianProvider { RussianProvider::isSupported as isRussianRegion; }

	protected EdnaRu $utils;
	protected string $channelType = '';

	abstract protected function getCallbackTypeList(): array;

	public function __construct(string $providerId, Providers\OptionManager $optionManager, EdnaRu $utils)
	{
		parent::__construct($providerId, $optionManager);

		$this->utils = $utils;
	}

	public function isRegistered(): bool
	{
		return
			!is_null($this->optionManager->getOption(InternalOption::API_KEY))
			&& !is_null($this->optionManager->getOption(InternalOption::SENDER_ID));
	}

	public function register(array $fields): Result
	{
		if (isset($fields['subject_id']))
		{
			$fields[InternalOption::SENDER_ID] = $fields['subject_id'];
		}

		if (!isset($fields[InternalOption::API_KEY], $fields[InternalOption::SENDER_ID]))
		{
			return (new Result())->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_EDNARU_EMPTY_REQUIRED_FIELDS')));
		}
		$this->optionManager->setOption(InternalOption::API_KEY, (string)$fields[InternalOption::API_KEY]);

		$subjectIdList = [];
		foreach (explode(';', (string)$fields[InternalOption::SENDER_ID]) as $senderId)
		{
			$senderId = trim($senderId);
			if ($senderId !== '')
			{
				$subjectIdList[] = (int)$senderId;
			}
		}
		if (!$this->utils->checkActiveChannelBySubjectIdList($subjectIdList, $this->channelType))
		{
			$this->optionManager->clearOptions();

			return (new Result())->addError(new Error(Loc::getMessage('MESSAGESERVICE_EDNARU_INACTIVE_CHANNEL_ERROR')));
		}

		foreach ($subjectIdList as $subjectId)
		{
			$setCallbackResult = $this->utils->setCallback(
				$this->getCallbackUrl(),
				$this->getCallbackTypeList(),
				$subjectId
			);
			if (!$setCallbackResult->isSuccess())
			{
				$this->optionManager->clearOptions();

				$errorData = $setCallbackResult->getData();

				if (isset($errorData['detail']))
				{
					return (new Result())->addError(new Error($errorData['detail']));
				}

				return $setCallbackResult;
			}
		}

		$this->optionManager->setOption(InternalOption::SENDER_ID, $subjectIdList);
		$this->optionManager->setOption(InternalOption::MIGRATED_TO_STANDART_SETTING_NAMES, 'Y');

		return new Result();
	}

	/**
	 * @return array{api_key: string, sender_id: array}
	 */
	public function getOwnerInfo(): array
	{
		return [
			InternalOption::API_KEY => $this->optionManager->getOption(InternalOption::API_KEY),
			InternalOption::SENDER_ID => $this->optionManager->getOption(InternalOption::SENDER_ID),
		];
	}

	public function isSupported(): bool
	{
		return self::isRussianRegion();
	}

	public function canUse(): bool
	{
		return ($this->isRegistered() && $this->isConfirmed());
	}

	public function getExternalManageUrl(): string
	{
		if (RegionHelper::isInternational())
		{
			return 'https://app.edna.io/';
		}

		return 'https://app.edna.ru/';
	}

	public function resetCallback(): Result
	{
		\Bitrix\MessageService\Providers\Edna\WhatsApp\Utils::cleanTemplatesCache();

		if (!$this->isRegistered())
		{
			return (new Result())->addError(new Error('It is impossible to reinstall the callback url because the provider is not registered'));
		}

		$fields = $this->getOwnerInfo();

		$subjectIdList = [];
		foreach (explode(';', (string)$fields[InternalOption::SENDER_ID][0]) as $senderId)
		{
			$senderId = trim($senderId);
			if ($senderId !== '')
			{
				$subjectIdList[] = (int)$senderId;
			}
		}

		if (!$this->utils->checkActiveChannelBySubjectIdList($subjectIdList, $this->channelType))
		{
			return (new Result())->addError(new Error(Loc::getMessage('MESSAGESERVICE_EDNARU_INACTIVE_CHANNEL_ERROR')));
		}

		foreach ($subjectIdList as $subjectId)
		{
			$setCallbackResult = $this->utils->setCallback(
				$this->getCallbackUrl(),
				$this->getCallbackTypeList(),
				$subjectId
			);
			if (!$setCallbackResult->isSuccess())
			{
				$errorData = $setCallbackResult->getData();

				if (isset($errorData['detail']))
				{
					return (new Result())->addError(new Error($errorData['detail']));
				}

				return $setCallbackResult;
			}
		}

		return new Result();
	}
}