mirror of
https://github.com/nullthoughts/laravel-data-sync.git
synced 2026-02-13 15:52:56 +00:00
237 lines
5.7 KiB
PHP
237 lines
5.7 KiB
PHP
<?php
|
|
/**
|
|
* Nexmo Client Library for PHP
|
|
*
|
|
* @copyright Copyright (c) 2016 Nexmo, Inc. (http://nexmo.com)
|
|
* @license https://github.com/Nexmo/nexmo-php/blob/master/LICENSE.txt MIT License
|
|
*/
|
|
|
|
namespace Nexmo\Message;
|
|
|
|
use Nexmo\Entity\JsonResponseTrait;
|
|
use Nexmo\Entity\Psr7Trait;
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
|
|
class InboundMessage implements MessageInterface, \ArrayAccess
|
|
{
|
|
use Psr7Trait;
|
|
use JsonResponseTrait;
|
|
use CollectionTrait;
|
|
|
|
protected $id;
|
|
|
|
/**
|
|
* InboundMessage constructor.
|
|
* @param string|ServerRequestInterface $idOrRequest Message ID, or inbound HTTP request.
|
|
*/
|
|
public function __construct($idOrRequest)
|
|
{
|
|
if($idOrRequest instanceof ServerRequestInterface){
|
|
$this->setRequest($idOrRequest);
|
|
return;
|
|
}
|
|
|
|
if(is_string($idOrRequest)){
|
|
$this->id = $idOrRequest;
|
|
return;
|
|
}
|
|
|
|
throw new \RuntimeException(sprintf(
|
|
'`%s` must be constructed with a server request or a message id',
|
|
self::class
|
|
));
|
|
}
|
|
|
|
public static function createFromGlobals()
|
|
{
|
|
$serverRequest = \Zend\Diactoros\ServerRequestFactory::fromGlobals();
|
|
return new self($serverRequest);
|
|
}
|
|
|
|
/**
|
|
* Create a matching reply to the inbound message. Currently only supports text replies.
|
|
*
|
|
* @param string $body
|
|
* @return Text
|
|
*/
|
|
public function createReply($body)
|
|
{
|
|
return new Text($this->getFrom(), $this->getTo(), $body);
|
|
}
|
|
|
|
public function getRequestData($sent = true)
|
|
{
|
|
$request = $this->getRequest();
|
|
|
|
if(is_null($request)){
|
|
return [];
|
|
}
|
|
|
|
if(!($request instanceof ServerRequestInterface)){
|
|
throw new \RuntimeException('inbound message request should only ever be `' . ServerRequestInterface::class . '`');
|
|
}
|
|
|
|
// Check our incoming content type
|
|
$isApplicationJson = false;
|
|
$contentTypes = $request->getHeader('Content-Type');
|
|
// We only respect application/json if it's the first entry without any preference weighting
|
|
// as that's what Nexmo send
|
|
if (count($contentTypes) && $contentTypes[0] === 'application/json') {
|
|
$isApplicationJson = true;
|
|
}
|
|
|
|
switch($request->getMethod()){
|
|
case 'POST':
|
|
$params = $isApplicationJson ? json_decode((string)$request->getBody(), true) : $request->getParsedBody();
|
|
break;
|
|
case 'GET':
|
|
$params = $request->getQueryParams();
|
|
break;
|
|
default:
|
|
$params = [];
|
|
break;
|
|
}
|
|
|
|
return $params;
|
|
}
|
|
|
|
public function getFrom()
|
|
{
|
|
if($this->getRequest()){
|
|
return $this['msisdn'];
|
|
} else {
|
|
return $this['from'];
|
|
}
|
|
}
|
|
|
|
public function getTo()
|
|
{
|
|
return $this['to'];
|
|
}
|
|
|
|
public function getMessageId()
|
|
{
|
|
if(isset($this->id)){
|
|
return $this->id;
|
|
}
|
|
|
|
return $this['messageId'];
|
|
}
|
|
|
|
public function isValid()
|
|
{
|
|
return (bool) $this->getMessageId();
|
|
}
|
|
|
|
public function getBody()
|
|
{
|
|
if($this->getRequest()){
|
|
return $this['text'];
|
|
} else {
|
|
return $this['body'];
|
|
}
|
|
}
|
|
|
|
public function getType()
|
|
{
|
|
return $this['type'];
|
|
}
|
|
|
|
public function getAccountId()
|
|
{
|
|
return $this['account-id'];
|
|
}
|
|
|
|
public function getNetwork()
|
|
{
|
|
return $this['network'];
|
|
}
|
|
|
|
/**
|
|
* Allow the object to access the data from the API response, a sent API request, or the user set data that the
|
|
* request will be created from - in that order.
|
|
*
|
|
* @param mixed $offset
|
|
* @return bool
|
|
* @throws \Exception
|
|
*/
|
|
public function offsetExists($offset)
|
|
{
|
|
$response = $this->getResponseData();
|
|
|
|
if(isset($this->index)){
|
|
$response = $response['items'][$this->index];
|
|
}
|
|
|
|
$request = $this->getRequestData();
|
|
$dirty = $this->getRequestData(false);
|
|
return isset($response[$offset]) || isset($request[$offset]) || isset($dirty[$offset]);
|
|
}
|
|
|
|
/**
|
|
* Allow the object to access the data from the API response, a sent API request, or the user set data that the
|
|
* request will be created from - in that order.
|
|
*
|
|
* @param mixed $offset
|
|
* @return mixed
|
|
* @throws \Exception
|
|
*/
|
|
public function offsetGet($offset)
|
|
{
|
|
$response = $this->getResponseData();
|
|
|
|
if(isset($this->index)){
|
|
$response = $response['items'][$this->index];
|
|
}
|
|
|
|
$request = $this->getRequestData();
|
|
$dirty = $this->getRequestData(false);
|
|
|
|
if(isset($response[$offset])){
|
|
return $response[$offset];
|
|
}
|
|
|
|
if(isset($request[$offset])){
|
|
return $request[$offset];
|
|
}
|
|
|
|
if(isset($dirty[$offset])){
|
|
return $dirty[$offset];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* All properties are read only.
|
|
*
|
|
* @param mixed $offset
|
|
* @param mixed $value
|
|
*/
|
|
public function offsetSet($offset, $value)
|
|
{
|
|
throw $this->getReadOnlyException($offset);
|
|
}
|
|
|
|
/**
|
|
* All properties are read only.
|
|
*
|
|
* @param mixed $offset
|
|
*/
|
|
public function offsetUnset($offset)
|
|
{
|
|
throw $this->getReadOnlyException($offset);
|
|
}
|
|
|
|
/**
|
|
* All properties are read only.
|
|
*
|
|
* @param $offset
|
|
* @return \RuntimeException
|
|
*/
|
|
protected function getReadOnlyException($offset)
|
|
{
|
|
return new \RuntimeException(sprintf(
|
|
'can not modify `%s` using array access',
|
|
$offset
|
|
));
|
|
}
|
|
} |