<?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\Numbers; use Nexmo\Application\Application; use Nexmo\Entity\EntityInterface; use Nexmo\Entity\JsonResponseTrait; use Nexmo\Entity\JsonSerializableInterface; use Nexmo\Entity\JsonSerializableTrait; use Nexmo\Entity\JsonUnserializableInterface; use Nexmo\Entity\NoRequestResponseTrait; class Number implements EntityInterface, JsonSerializableInterface, JsonUnserializableInterface { use JsonSerializableTrait; use NoRequestResponseTrait; use JsonResponseTrait; const TYPE_MOBILE = 'mobile-lvn'; const TYPE_FIXED = 'landline'; const FEATURE_VOICE = 'VOICE'; const FEATURE_SMS = 'SMS'; const WEBHOOK_MESSAGE = 'moHttpUrl'; const WEBHOOK_VOICE_STATUS = 'voiceStatusCallbackUrl'; const ENDPOINT_SIP = 'sip'; const ENDPOINT_TEL = 'tel'; const ENDPOINT_VXML = 'vxml'; const ENDPOINT_APP = 'app'; protected $data = []; public function __construct($number = null, $country = null) { $this->data['msisdn'] = $number; $this->data['country'] = $country; } public function getId() { return $this->fromData('msisdn'); } public function getMsisdn() { return $this->getId(); } public function getNumber() { return $this->getId(); } public function getCountry() { return $this->fromData('country'); } public function getType() { return $this->fromData('type'); } public function hasFeature($feature) { if(!isset($this->data['features'])){ return false; } return in_array($feature, $this->data['features']); } public function getFeatures() { return $this->fromData('features'); } public function setWebhook($type, $url) { if(!in_array($type, [self::WEBHOOK_MESSAGE, self::WEBHOOK_VOICE_STATUS])){ throw new \InvalidArgumentException("invalid webhook type `$type`"); } $this->data[$type] = $url; return $this; } public function getWebhook($type) { return $this->fromData($type); } public function hasWebhook($type) { return isset($this->data[$type]); } public function setVoiceDestination($endpoint, $type = null) { if(is_null($type)){ $type = $this->autoType($endpoint); } if(self::ENDPOINT_APP == $type AND !($endpoint instanceof Application)){ $endpoint = new Application($endpoint); } $this->data['voiceCallbackValue'] = $endpoint; $this->data['voiceCallbackType'] = $type; return $this; } protected function autoType($endpoint) { if($endpoint instanceof Application){ return self::ENDPOINT_APP; } if(false !== strpos($endpoint, '@')){ return self::ENDPOINT_SIP; } if(0 === strpos(strtolower($endpoint), 'http')){ return self::ENDPOINT_VXML; } if(preg_match('#[a-z]+#', $endpoint)){ return self::ENDPOINT_APP; } return self::ENDPOINT_TEL; } public function getVoiceDestination() { return $this->fromData('voiceCallbackValue'); } public function getVoiceType() { if(!isset($this->data['voiceCallbackType'])){ return null; } return $this->data['voiceCallbackType']; } protected function fromData($name) { if(!isset($this->data[$name])){ throw new \RuntimeException("`{$name}` has not been set"); } return $this->data[$name]; } public function JsonUnserialize(array $json) { $this->data = $json; } function jsonSerialize() { $json = $this->data; if(isset($json['voiceCallbackValue']) AND ($json['voiceCallbackValue'] instanceof Application)){ $json['voiceCallbackValue'] = $json['voiceCallbackValue']->getId(); } return $json; } public function __toString() { return (string) $this->getId(); } }