inject logger, do not catch exceptions that should lead to termination

This commit is contained in:
Daniel Seifert 2022-07-01 09:24:16 +02:00
parent 6854f12e13
commit c502926daf
Signed by: DanielS
GPG Key ID: 8A7C4C6ED1915C6F
18 changed files with 157 additions and 40 deletions

View File

@ -1,6 +1,7 @@
``` ```
$client = new Client('accesstoken'); $client = new Client('accesstoken');
$request = (new \D3\LinkmobilityClient\SMS\Request('me', 'message')) $client->setLogger($logger); // optional
->addRecipient(new Recipient('recipient')); $request = new D3\LinkmobilityClient\SMS\RequestFactory($message, $client)->getSmsRequest())
->addRecipient(new D3\LinkmobilityClient\ValueObject\Recipient('recipient', 'DE'));
$client->request($request) $client->request($request)
``` ```

View File

@ -21,7 +21,9 @@ use D3\LinkmobilityClient\Exceptions\ApiException;
use D3\LinkmobilityClient\Exceptions\ExceptionMessages; use D3\LinkmobilityClient\Exceptions\ExceptionMessages;
use D3\LinkmobilityClient\Request\RequestInterface; use D3\LinkmobilityClient\Request\RequestInterface;
use GuzzleHttp\Exception\GuzzleException; use GuzzleHttp\Exception\GuzzleException;
use InvalidArgumentException;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;
use RuntimeException; use RuntimeException;
class Client class Client
@ -30,6 +32,8 @@ class Client
public $apiUrl; public $apiUrl;
public $requestClient; public $requestClient;
private $logger;
public function __construct(string $accessToken, $apiUrl = false, $client = false) public function __construct(string $accessToken, $apiUrl = false, $client = false)
{ {
if ($apiUrl !== false && false === $apiUrl instanceof UrlInterface) { if ($apiUrl !== false && false === $apiUrl instanceof UrlInterface) {
@ -47,6 +51,7 @@ class Client
* @return Response\ResponseInterface * @return Response\ResponseInterface
* @throws ApiException * @throws ApiException
* @throws GuzzleException * @throws GuzzleException
* @throws InvalidArgumentException
*/ */
public function request(RequestInterface $request) : Response\ResponseInterface public function request(RequestInterface $request) : Response\ResponseInterface
{ {
@ -70,6 +75,8 @@ class Client
{ {
$options['headers']['Authorization'] = 'Bearer '.$this->accessToken; $options['headers']['Authorization'] = 'Bearer '.$this->accessToken;
if ($this->hasLogger()) $this->getLogger()->debug('request '.$url, $options);
$response = $this->requestClient->request( $response = $this->requestClient->request(
$method, $method,
$url, $url,
@ -77,11 +84,45 @@ class Client
); );
if ($response->getStatusCode() != 200) { if ($response->getStatusCode() != 200) {
throw new ApiException( $message = sprintf(ExceptionMessages::NOK_REQUEST_RETURN, [$url, $response->getStatusCode()]);
sprintf(ExceptionMessages::NOK_REQUEST_RETURN, [$url, $response->getStatusCode()]) if ($this->hasLogger()) $this->getLogger()->error($message);
); throw new ApiException($message);
}
if ($this->hasLogger()) {
$response->getBody()->rewind();
$this->getLogger()->debug('response', [$response->getBody()->getContents()]);
} }
return $response; return $response;
} }
/**
* @param mixed $logger
*
* @return Client
*/
public function setLogger(LoggerInterface $logger ) : Client
{
$this->logger = $logger;
return $this;
}
/**
* @return bool
*/
public function hasLogger() : bool
{
return $this->logger instanceof LoggerInterface;
}
/**
* @return LoggerInterface
*/
public function getLogger(): LoggerInterface
{
return $this->logger;
}
} }

View File

@ -17,6 +17,7 @@ declare(strict_types=1);
namespace D3\LinkmobilityClient\RecipientsList; namespace D3\LinkmobilityClient\RecipientsList;
use D3\LinkmobilityClient\Client;
use D3\LinkmobilityClient\Exceptions\ExceptionMessages; use D3\LinkmobilityClient\Exceptions\ExceptionMessages;
use D3\LinkmobilityClient\Exceptions\RecipientException; use D3\LinkmobilityClient\Exceptions\RecipientException;
use D3\LinkmobilityClient\ValueObject\Recipient; use D3\LinkmobilityClient\ValueObject\Recipient;
@ -27,11 +28,21 @@ use libphonenumber\PhoneNumberUtil;
class RecipientsList implements RecipientsListInterface, Iterator class RecipientsList implements RecipientsListInterface, Iterator
{ {
/**
* @var Client
*/
private $client;
/** /**
* @var array * @var array
*/ */
private $recipients = []; private $recipients = [];
public function __construct( Client $client )
{
$this->setClient($client);
}
public function add(Recipient $recipient) : RecipientsListInterface public function add(Recipient $recipient) : RecipientsListInterface
{ {
$phoneUtil = PhoneNumberUtil::getInstance(); $phoneUtil = PhoneNumberUtil::getInstance();
@ -54,9 +65,13 @@ class RecipientsList implements RecipientsListInterface, Iterator
$this->recipients[ md5( serialize( $recipient ) ) ] = $recipient; $this->recipients[ md5( serialize( $recipient ) ) ] = $recipient;
} catch (NumberParseException $e) { } catch (NumberParseException $e) {
// var_dump($e); if ($this->getClient()->hasLogger()) {
$this->getClient()->getLogger()->info($e->getMessage());
}
} catch (RecipientException $e) { } catch (RecipientException $e) {
// var_dump($e); if ($this->getClient()->hasLogger()) {
$this->getClient()->getLogger()->info($e->getMessage());
}
} }
return $this; return $this;
@ -119,4 +134,20 @@ class RecipientsList implements RecipientsListInterface, Iterator
{ {
return current($this->recipients) instanceof Recipient; return current($this->recipients) instanceof Recipient;
} }
/**
* @return Client
*/
public function getClient(): Client
{
return $this->client;
}
/**
* @param Client $client
*/
public function setClient( Client $client )
{
$this->client = $client;
}
} }

View File

@ -17,10 +17,13 @@ declare(strict_types=1);
namespace D3\LinkmobilityClient\RecipientsList; namespace D3\LinkmobilityClient\RecipientsList;
use D3\LinkmobilityClient\Client;
use D3\LinkmobilityClient\ValueObject\Recipient; use D3\LinkmobilityClient\ValueObject\Recipient;
interface RecipientsListInterface interface RecipientsListInterface
{ {
public function __construct(Client $client);
public function add(Recipient $recipient) : RecipientsListInterface; public function add(Recipient $recipient) : RecipientsListInterface;
public function clearRecipents() : RecipientsListInterface; public function clearRecipents() : RecipientsListInterface;

View File

@ -18,6 +18,7 @@ declare( strict_types = 1 );
namespace D3\LinkmobilityClient\Request; namespace D3\LinkmobilityClient\Request;
use Assert\Assert; use Assert\Assert;
use D3\LinkmobilityClient\Client;
use D3\LinkmobilityClient\RecipientsList\RecipientsList; use D3\LinkmobilityClient\RecipientsList\RecipientsList;
use D3\LinkmobilityClient\RecipientsList\RecipientsListInterface; use D3\LinkmobilityClient\RecipientsList\RecipientsListInterface;
use D3\LinkmobilityClient\Response\ResponseInterface; use D3\LinkmobilityClient\Response\ResponseInterface;
@ -36,6 +37,11 @@ abstract class Request implements RequestInterface
*/ */
private $message; private $message;
/**
* @var Client
*/
private $client;
/** /**
* @var string * @var string
*/ */
@ -109,10 +115,11 @@ abstract class Request implements RequestInterface
/** /**
* @param SmsMessageAbstract $message * @param SmsMessageAbstract $message
*/ */
public function __construct(SmsMessageInterface $message) public function __construct(SmsMessageInterface $message, Client $client)
{ {
$this->recipientsList = new RecipientsList(); $this->recipientsList = new RecipientsList($client);
$this->setMessage( $message ); $this->setMessage( $message );
$this->setClient($client);
return $this; return $this;
} }
@ -495,4 +502,20 @@ abstract class Request implements RequestInterface
$FQClassName = $this->getResponseClass(); $FQClassName = $this->getResponseClass();
return new $FQClassName($rawResponse); return new $FQClassName($rawResponse);
} }
/**
* @return Client
*/
public function getClient(): Client
{
return $this->client;
}
/**
* @param Client $client
*/
public function setClient( Client $client )
{
$this->client = $client;
}
} }

View File

@ -17,6 +17,9 @@ declare(strict_types=1);
namespace D3\LinkmobilityClient\Request; namespace D3\LinkmobilityClient\Request;
use D3\LinkmobilityClient\Client;
use D3\LinkmobilityClient\ValueObject\SmsMessageInterface;
use InvalidArgumentException;
use Psr\Http\Message\ResponseInterface as PsrResponseInterface; use Psr\Http\Message\ResponseInterface as PsrResponseInterface;
use D3\LinkmobilityClient\Response\ResponseInterface as LMResponseInterface; use D3\LinkmobilityClient\Response\ResponseInterface as LMResponseInterface;
@ -41,6 +44,8 @@ interface RequestInterface
const SENDERADDRESSTYPE_ALPHANUMERIC = 'alphanumeric'; const SENDERADDRESSTYPE_ALPHANUMERIC = 'alphanumeric';
const SENDERADDRESSTYPE_SHORTCODE = 'shortcode'; const SENDERADDRESSTYPE_SHORTCODE = 'shortcode';
public function __construct(SmsMessageInterface $message, Client $client);
public function setMethod(string $method); public function setMethod(string $method);
/** /**
@ -89,6 +94,8 @@ interface RequestInterface
* Must validate the input of the request * Must validate the input of the request
* This is called before sending the request * This is called before sending the request
* Must throw an exception if the validation fails * Must throw an exception if the validation fails
*
* @throws InvalidArgumentException
*/ */
public function validate(); public function validate();
} }

View File

@ -27,6 +27,8 @@ abstract class Response implements ResponseInterface
public function __construct(\Psr\Http\Message\ResponseInterface $rawResponse) public function __construct(\Psr\Http\Message\ResponseInterface $rawResponse)
{ {
$this->rawResponse = $rawResponse; $this->rawResponse = $rawResponse;
$this->rawResponse->getBody()->rewind();
$this->content = json_decode($this->rawResponse->getBody()->getContents(), true); $this->content = json_decode($this->rawResponse->getBody()->getContents(), true);
} }

View File

@ -20,7 +20,7 @@ namespace D3\LinkmobilityClient\SMS;
use Assert\Assert; use Assert\Assert;
use D3\LinkmobilityClient\Request\Request; use D3\LinkmobilityClient\Request\Request;
use D3\LinkmobilityClient\ValueObject\SmsBinaryMessage; use D3\LinkmobilityClient\ValueObject\SmsBinaryMessage;
use D3\LinkmobilityClient\ValueObject\SmsMessage; use InvalidArgumentException;
class BinaryRequest extends Request implements SmsRequestInterface class BinaryRequest extends Request implements SmsRequestInterface
{ {
@ -42,6 +42,9 @@ class BinaryRequest extends Request implements SmsRequestInterface
); );
} }
/**
* @throws InvalidArgumentException
*/
public function validate() public function validate()
{ {
parent::validate(); parent::validate();

View File

@ -17,7 +17,9 @@ declare( strict_types = 1 );
namespace D3\LinkmobilityClient\SMS; namespace D3\LinkmobilityClient\SMS;
use D3\LinkmobilityClient\Client;
use D3\LinkmobilityClient\ValueObject\SmsBinaryMessage; use D3\LinkmobilityClient\ValueObject\SmsBinaryMessage;
use D3\LinkmobilityClient\ValueObject\SmsMessageInterface;
use D3\LinkmobilityClient\ValueObject\SmsTextMessage; use D3\LinkmobilityClient\ValueObject\SmsTextMessage;
use Phlib\SmsLength\SmsLength; use Phlib\SmsLength\SmsLength;
@ -34,24 +36,26 @@ class RequestFactory
const GSM_UCS2 = 'ucs-2'; const GSM_UCS2 = 'ucs-2';
private $message; private $message;
private $client;
public function __construct($message) public function __construct($message, Client $client)
{ {
$this->message = $message; $this->message = $message;
$this->client = $client;
} }
/** /**
* @return SmsRequestInterface * @return SmsRequestInterface
*/ */
public function getRequest() : SmsRequestInterface public function getSmsRequest() : SmsRequestInterface
{ {
$smsLength = new SmsLength($this->message); $smsLength = new SmsLength($this->message);
if ($smsLength->getEncoding() === self::GSM_7BIT) { if ($smsLength->getEncoding() === self::GSM_7BIT) {
$message = new SmsTextMessage($this->message); $message = new SmsTextMessage($this->message);
return new TextRequest($message); return new TextRequest($message, $this->client);
} }
$message = new SmsBinaryMessage($this->message); $message = new SmsBinaryMessage($this->message);
return new BinaryRequest($message); return new BinaryRequest($message, $this->client);
} }
} }

View File

@ -17,11 +17,9 @@ declare( strict_types = 1 );
namespace D3\LinkmobilityClient\SMS; namespace D3\LinkmobilityClient\SMS;
use D3\LinkmobilityClient\ValueObject\SmsMessage;
interface RequestFactoryInterface interface RequestFactoryInterface
{ {
public function __construct(SmsMessage $message); public function __construct($message);
public function getRequest() : SmsRequestInterface; public function getRequest() : SmsRequestInterface;
} }

View File

@ -15,9 +15,4 @@
namespace D3\LinkmobilityClient\SMS; namespace D3\LinkmobilityClient\SMS;
use D3\LinkmobilityClient\ValueObject\SmsMessageInterface; interface SmsRequestInterface {}
interface SmsRequestInterface
{
public function __construct(SmsMessageInterface $message);
}

View File

@ -19,8 +19,8 @@ namespace D3\LinkmobilityClient\SMS;
use Assert\Assert; use Assert\Assert;
use D3\LinkmobilityClient\Request\Request; use D3\LinkmobilityClient\Request\Request;
use D3\LinkmobilityClient\ValueObject\SmsMessageInterface;
use D3\LinkmobilityClient\ValueObject\SmsTextMessage; use D3\LinkmobilityClient\ValueObject\SmsTextMessage;
use InvalidArgumentException;
class TextRequest extends Request implements SmsRequestInterface class TextRequest extends Request implements SmsRequestInterface
{ {
@ -32,6 +32,9 @@ class TextRequest extends Request implements SmsRequestInterface
return '/rest/smsmessaging/text'; return '/rest/smsmessaging/text';
} }
/**
* @throws InvalidArgumentException
*/
public function validate() public function validate()
{ {
parent::validate(); parent::validate();

View File

@ -16,17 +16,20 @@ class Recipient extends StringValueObject
*/ */
private $countryCode; private $countryCode;
/**
* @param string $number
* @param string $iso2CountryCode
*
* @throws NumberParseException
*/
public function __construct(string $number, string $iso2CountryCode) public function __construct(string $number, string $iso2CountryCode)
{ {
Assert::that($iso2CountryCode)->string()->length(2); Assert::that($iso2CountryCode)->string()->length(2);
$phoneUtil = PhoneNumberUtil::getInstance(); $phoneUtil = PhoneNumberUtil::getInstance();
try {
$phoneNumber = $phoneUtil->parse($number, strtoupper($iso2CountryCode)); $phoneNumber = $phoneUtil->parse($number, strtoupper($iso2CountryCode));
$number = ltrim($phoneUtil->format($phoneNumber, PhoneNumberFormat::E164), '+'); $number = ltrim($phoneUtil->format($phoneNumber, PhoneNumberFormat::E164), '+');
} catch ( NumberParseException $e) {
var_dump($e);
}
parent::__construct($number); parent::__construct($number);
$this->countryCode = $iso2CountryCode; $this->countryCode = $iso2CountryCode;

View File

@ -18,21 +18,19 @@ class Sender extends StringValueObject
* @param string $iso2CountryCode * @param string $iso2CountryCode
* *
* @throws RecipientException * @throws RecipientException
* @throws NumberParseException
*/ */
public function __construct(string $number, string $iso2CountryCode) public function __construct(string $number, string $iso2CountryCode)
{ {
Assert::that($iso2CountryCode)->string()->length(2); Assert::that($iso2CountryCode)->string()->length(2);
$phoneUtil = PhoneNumberUtil::getInstance(); $phoneUtil = PhoneNumberUtil::getInstance();
try {
$phoneNumber = $phoneUtil->parse( $number, strtoupper($iso2CountryCode) );
$number = $phoneUtil->format( $phoneNumber, PhoneNumberFormat::E164 );
if (false === $phoneUtil->isValidNumber($phoneNumber)) { $phoneNumber = $phoneUtil->parse( $number, strtoupper($iso2CountryCode) );
throw new RecipientException( ExceptionMessages::INVALID_SENDER ); $number = $phoneUtil->format( $phoneNumber, PhoneNumberFormat::E164 );
}
} catch ( NumberParseException $e) { if (false === $phoneUtil->isValidNumber($phoneNumber)) {
var_dump($e); throw new RecipientException( ExceptionMessages::INVALID_SENDER );
} }
parent::__construct( $number); parent::__construct( $number);

View File

@ -19,6 +19,9 @@ class SmsBinaryMessage extends SmsMessageAbstract
$smsLength->validate(); $smsLength->validate();
} }
/**
* @return array|false|string
*/
public function getMessageContent() public function getMessageContent()
{ {
return str_split( return str_split(

View File

@ -26,7 +26,7 @@ abstract class SmsMessageAbstract extends StringValueObject implements SmsMessag
return $smsLength->getSize(); return $smsLength->getSize();
} }
public function getMessageContent() public function getMessageContent() : string
{ {
return (string) $this->value; return (string) $this->value;
} }

View File

@ -21,5 +21,5 @@ interface SmsMessageInterface
public function length() : int; public function length() : int;
public function getMessageContent(); public function getMessageContent() : string;
} }

View File

@ -4,12 +4,14 @@ declare(strict_types=1);
namespace D3\LinkmobilityClient\ValueObject; namespace D3\LinkmobilityClient\ValueObject;
use InvalidArgumentException;
use Phlib\SmsLength\SmsLength; use Phlib\SmsLength\SmsLength;
class SmsTextMessage extends SmsMessageAbstract class SmsTextMessage extends SmsMessageAbstract
{ {
/** /**
* @param string $message * @param string $message
* @throws InvalidArgumentException
*/ */
public function __construct(string $message) public function __construct(string $message)
{ {