Improve adapters datas interface by defining fields and implement real OVH SMS API adapter !
This commit is contained in:
parent
4cd1105ae6
commit
c4bc7d94c1
|
@ -31,6 +31,12 @@
|
||||||
* Description of the datas expected by the adapter to help the user. (e.g : A list of expecteds Api credentials fields, with name and value)
|
* Description of the datas expected by the adapter to help the user. (e.g : A list of expecteds Api credentials fields, with name and value)
|
||||||
*/
|
*/
|
||||||
public static function meta_datas_help() : string;
|
public static function meta_datas_help() : string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of entries we want in datas for the adapter
|
||||||
|
* @return array : Eachline line is a field as an array with keys : name, title, description, required
|
||||||
|
*/
|
||||||
|
public static function meta_datas_fields() : array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does the implemented service support flash smss
|
* Does the implemented service support flash smss
|
||||||
|
@ -58,7 +64,7 @@
|
||||||
* @param bool $flash : Is the SMS a Flash SMS
|
* @param bool $flash : Is the SMS a Flash SMS
|
||||||
* @return mixed Uid of the sended message if send, False else
|
* @return mixed Uid of the sended message if send, False else
|
||||||
*/
|
*/
|
||||||
public function send (string $destination, string $text, bool $flash);
|
public function send (string $destination, string $text, bool $flash = false);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -68,6 +74,14 @@
|
||||||
public function read () : array;
|
public function read () : array;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method called to verify if the adapter is working correctly
|
||||||
|
* should be use for exemple to verify that credentials and number are both valid
|
||||||
|
* @return boolean : False on error, true else
|
||||||
|
*/
|
||||||
|
public function test () : bool;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method called on reception of a status update notification for a SMS
|
* Method called on reception of a status update notification for a SMS
|
||||||
* @return mixed : False on error, else array ['uid' => uid of the sms, 'status' => New status of the sms ('unknown', 'delivered', 'failed')]
|
* @return mixed : False on error, else array ['uid' => uid of the sms, 'status' => New status of the sms ('unknown', 'delivered', 'failed')]
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
namespace adapters;
|
namespace adapters;
|
||||||
|
use \Ovh\Api;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for phones adapters
|
* Interface for phones adapters
|
||||||
|
@ -30,7 +31,47 @@
|
||||||
/**
|
/**
|
||||||
* Description of the datas expected by the adapter to help the user. (e.g : A list of expecteds Api credentials fields, with name and value)
|
* Description of the datas expected by the adapter to help the user. (e.g : A list of expecteds Api credentials fields, with name and value)
|
||||||
*/
|
*/
|
||||||
public static function meta_datas_help() : string { return 'See later.'; }
|
public static function meta_datas_help() : string { return 'Clefs API OVH, https://api.ovh.com/createToken/index.cgi.'; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of entries we want in datas for the adapter
|
||||||
|
* @return array : Every line is a field as an array with keys : name, title, description, required
|
||||||
|
*/
|
||||||
|
public static function meta_datas_fields() : array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
'name' => 'app_key',
|
||||||
|
'title' => 'Application Key',
|
||||||
|
'description' => 'Paramètre "Application Key" obtenu lors de la génération de la clef API OVH.',
|
||||||
|
'required' => true,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'app_secret',
|
||||||
|
'title' => 'Application Secret',
|
||||||
|
'description' => 'Paramètre "Application Secret" obtenu lors de la génération de la clef API OVH.',
|
||||||
|
'required' => true,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'consumer_key',
|
||||||
|
'title' => 'Consumer Key',
|
||||||
|
'description' => 'Paramètre "Consumer Key" obtenu lors de la génération de la clef API OVH.',
|
||||||
|
'required' => true,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'endpoint',
|
||||||
|
'title' => 'Endpoint',
|
||||||
|
'description' => 'Endpoint de l\'API OVH, voir https://github.com/ovh/php-ovh/#supported-apis.',
|
||||||
|
'required' => true,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'service_name',
|
||||||
|
'title' => 'Service Name',
|
||||||
|
'description' => 'Service Name de votre service SMS chez OVH. Il s\'agit du nom associé à votre service SMS dans la console OVH, probablement quelque chose comme "sms-xxxxx-1" ou "xxxx" est votre identifiant client OVH.',
|
||||||
|
'required' => true,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does the implemented service support flash smss
|
* Does the implemented service support flash smss
|
||||||
|
@ -53,6 +94,15 @@
|
||||||
*/
|
*/
|
||||||
private $datas;
|
private $datas;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OVH Api instance
|
||||||
|
*/
|
||||||
|
private $api;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number formated to be compatible with http query according to the ovh way
|
||||||
|
*/
|
||||||
|
private $formatted_number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapter constructor, called when instanciated by RaspiSMS
|
* Adapter constructor, called when instanciated by RaspiSMS
|
||||||
|
@ -62,7 +112,15 @@
|
||||||
public function __construct (string $number, string $datas)
|
public function __construct (string $number, string $datas)
|
||||||
{
|
{
|
||||||
$this->number = $number;
|
$this->number = $number;
|
||||||
$this->datas = $datas;
|
$this->formatted_number = str_replace('+', '00', $number);
|
||||||
|
$this->datas = json_decode($datas, true);
|
||||||
|
|
||||||
|
$this->api = new Api(
|
||||||
|
$this->datas['app_key'],
|
||||||
|
$this->datas['app_secret'],
|
||||||
|
$this->datas['endpoint'],
|
||||||
|
$this->datas['consumer_key']
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,9 +131,33 @@
|
||||||
* @param bool $flash : Is the SMS a Flash SMS
|
* @param bool $flash : Is the SMS a Flash SMS
|
||||||
* @return mixed Uid of the sended message if send, False else
|
* @return mixed Uid of the sended message if send, False else
|
||||||
*/
|
*/
|
||||||
public function send (string $destination, string $text, bool $flash)
|
public function send (string $destination, string $text, bool $flash = false)
|
||||||
{
|
{
|
||||||
return uniqid();
|
try
|
||||||
|
{
|
||||||
|
$success = true;
|
||||||
|
|
||||||
|
$endpoint = '/sms/' . $this->datas['service_name'] . '/virtualNumbers/' . $this->formatted_number . '/jobs';
|
||||||
|
$params = [
|
||||||
|
'message' => $text,
|
||||||
|
'receivers' => [$destination],
|
||||||
|
];
|
||||||
|
|
||||||
|
$response = $this->api->post($endpoint, $params);
|
||||||
|
|
||||||
|
$nb_invalid_receivers = count(($response['invalidReceivers'] ?? []));
|
||||||
|
if ($nb_invalid_receivers > 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$uids = $response['ids'] ?? [];
|
||||||
|
return ($uids[0] ?? false);
|
||||||
|
}
|
||||||
|
catch (\Exception $e)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,7 +167,77 @@
|
||||||
*/
|
*/
|
||||||
public function read () : array
|
public function read () : array
|
||||||
{
|
{
|
||||||
return [];
|
try
|
||||||
|
{
|
||||||
|
$success = true;
|
||||||
|
|
||||||
|
$endpoint = '/sms/' . $this->datas['service_name'] . '/virtualNumbers/' . $this->formatted_number . '/incoming';
|
||||||
|
$uids = $this->api->get($endpoint);
|
||||||
|
|
||||||
|
if (!is_array($uids) || !$uids)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$received_smss = [];
|
||||||
|
foreach ($uids as $uid)
|
||||||
|
{
|
||||||
|
$endpoint = '/sms/' . $this->datas['service_name'] . '/virtualNumbers/' . $this->formatted_number . '/incoming/' . $uid;
|
||||||
|
$sms_details = $this->api->get($endpoint);
|
||||||
|
|
||||||
|
if (!isset($sms_details['creationDatetime'], $sms_details['message'], $sms_details['sender']))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$received_smss[] = [
|
||||||
|
'at' => (new \DateTime($sms_details['creationDatetime']))->format('Y-m-d H:i:s'),
|
||||||
|
'text' => $sms_details['message'],
|
||||||
|
'origin' => $sms_details['sender'],
|
||||||
|
'destination' => $this->number,
|
||||||
|
];
|
||||||
|
|
||||||
|
//Remove the sms to prevent double reading as ovh do not offer a filter for unread messages only
|
||||||
|
$endpoint = '/sms/' . $this->datas['service_name'] . '/virtualNumbers/' . $this->formatted_number . '/incoming/' . $uid;
|
||||||
|
$this->api->delete($endpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $received_smss;
|
||||||
|
}
|
||||||
|
catch (\Exception $e)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method called to verify if the adapter is working correctly
|
||||||
|
* should be use for exemple to verify that credentials and number are both valid
|
||||||
|
* @return boolean : False on error, true else
|
||||||
|
*/
|
||||||
|
public function test () : bool
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$success = true;
|
||||||
|
|
||||||
|
//Check service name
|
||||||
|
$endpoint = '/sms/' . $this->datas['service_name'];
|
||||||
|
$response = $this->api->get($endpoint);
|
||||||
|
$success = $success && (bool) $response;
|
||||||
|
|
||||||
|
//Check virtualnumber
|
||||||
|
$endpoint = '/sms/virtualNumbers/' . $this->formatted_number;
|
||||||
|
$response = $this->api->get($endpoint);
|
||||||
|
$success = $success && (bool) $response;
|
||||||
|
|
||||||
|
return $success;
|
||||||
|
}
|
||||||
|
catch (\Exception $e)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -95,6 +247,30 @@
|
||||||
*/
|
*/
|
||||||
public static function status_change_callback ()
|
public static function status_change_callback ()
|
||||||
{
|
{
|
||||||
return false;
|
$uid = $_GET['id'] ?? false;
|
||||||
|
$dlr = $_GET['dlr'] ?? false;
|
||||||
|
|
||||||
|
if ($uid === false || $dlr ==== false)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($dlr)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
$status = 'delivered';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
case 16:
|
||||||
|
$status = 'failed';
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$status = 'unknown';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ['uid' => $uid, 'status' => $status];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,12 @@
|
||||||
* Description of the datas expected by the adapter to help the user. (e.g : A list of expecteds Api credentials fields, with name and value)
|
* Description of the datas expected by the adapter to help the user. (e.g : A list of expecteds Api credentials fields, with name and value)
|
||||||
*/
|
*/
|
||||||
public static function meta_datas_help() : string { return 'No datas.'; }
|
public static function meta_datas_help() : string { return 'No datas.'; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of entries we want in datas for the adapter
|
||||||
|
* @return array : Eachline line is a field as an array with keys : name, title, description, required
|
||||||
|
*/
|
||||||
|
public static function meta_datas_fields() : array { return []; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does the implemented service support flash smss
|
* Does the implemented service support flash smss
|
||||||
|
@ -84,7 +90,7 @@
|
||||||
* @param bool $flash : Is the SMS a Flash SMS
|
* @param bool $flash : Is the SMS a Flash SMS
|
||||||
* @return mixed Uid of the sended message if send, False else
|
* @return mixed Uid of the sended message if send, False else
|
||||||
*/
|
*/
|
||||||
public function send (string $destination, string $text, bool $flash)
|
public function send (string $destination, string $text, bool $flash = false)
|
||||||
{
|
{
|
||||||
$uid = uniqid();
|
$uid = uniqid();
|
||||||
|
|
||||||
|
@ -125,6 +131,17 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method called to verify if the adapter is working correctly
|
||||||
|
* should be use for exemple to verify that credentials and number are both valid
|
||||||
|
* @return boolean : False on error, true else
|
||||||
|
*/
|
||||||
|
public function test () : bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method called on reception of a status update notification for a SMS
|
* Method called on reception of a status update notification for a SMS
|
||||||
* @return mixed : False on error, else array ['uid' => uid of the sms, 'status' => New status of the sms ('unknown', 'delivered', 'failed')]
|
* @return mixed : False on error, else array ['uid' => uid of the sms, 'status' => New status of the sms ('unknown', 'delivered', 'failed')]
|
||||||
|
|
|
@ -6,7 +6,8 @@
|
||||||
"twig/twig": "^3.0",
|
"twig/twig": "^3.0",
|
||||||
"symfony/expression-language": "^5.0",
|
"symfony/expression-language": "^5.0",
|
||||||
"robmorgan/phinx": "^0.11.1",
|
"robmorgan/phinx": "^0.11.1",
|
||||||
"monolog/monolog": "^2.0"
|
"monolog/monolog": "^2.0",
|
||||||
|
"ovh/ovh": "^2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "2c1bb9c8a11ff3457ba8db4d5d1d33ae",
|
"content-hash": "c1b16bab1d0052b5ccb38c18a08ee0d2",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "ajani/flash-message",
|
"name": "ajani/flash-message",
|
||||||
|
@ -495,6 +495,195 @@
|
||||||
"description": "Locale functions required by libphonenumber-for-php",
|
"description": "Locale functions required by libphonenumber-for-php",
|
||||||
"time": "2019-10-09T18:53:14+00:00"
|
"time": "2019-10-09T18:53:14+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "guzzlehttp/guzzle",
|
||||||
|
"version": "6.5.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/guzzle/guzzle.git",
|
||||||
|
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82",
|
||||||
|
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"guzzlehttp/promises": "^1.0",
|
||||||
|
"guzzlehttp/psr7": "^1.6.1",
|
||||||
|
"php": ">=5.5"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-curl": "*",
|
||||||
|
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
|
||||||
|
"psr/log": "^1.1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
|
||||||
|
"psr/log": "Required for using the Log middleware"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "6.5-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"GuzzleHttp\\": "src/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/functions_include.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Michael Dowling",
|
||||||
|
"email": "mtdowling@gmail.com",
|
||||||
|
"homepage": "https://github.com/mtdowling"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Guzzle is a PHP HTTP client library",
|
||||||
|
"homepage": "http://guzzlephp.org/",
|
||||||
|
"keywords": [
|
||||||
|
"client",
|
||||||
|
"curl",
|
||||||
|
"framework",
|
||||||
|
"http",
|
||||||
|
"http client",
|
||||||
|
"rest",
|
||||||
|
"web service"
|
||||||
|
],
|
||||||
|
"time": "2019-12-23T11:57:10+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "guzzlehttp/promises",
|
||||||
|
"version": "v1.3.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/guzzle/promises.git",
|
||||||
|
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
||||||
|
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"GuzzleHttp\\Promise\\": "src/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/functions_include.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Michael Dowling",
|
||||||
|
"email": "mtdowling@gmail.com",
|
||||||
|
"homepage": "https://github.com/mtdowling"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Guzzle promises library",
|
||||||
|
"keywords": [
|
||||||
|
"promise"
|
||||||
|
],
|
||||||
|
"time": "2016-12-20T10:07:11+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "guzzlehttp/psr7",
|
||||||
|
"version": "1.6.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/guzzle/psr7.git",
|
||||||
|
"reference": "239400de7a173fe9901b9ac7c06497751f00727a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
|
||||||
|
"reference": "239400de7a173fe9901b9ac7c06497751f00727a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0",
|
||||||
|
"psr/http-message": "~1.0",
|
||||||
|
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"psr/http-message-implementation": "1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-zlib": "*",
|
||||||
|
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.6-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"GuzzleHttp\\Psr7\\": "src/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/functions_include.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Michael Dowling",
|
||||||
|
"email": "mtdowling@gmail.com",
|
||||||
|
"homepage": "https://github.com/mtdowling"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Tobias Schultze",
|
||||||
|
"homepage": "https://github.com/Tobion"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PSR-7 message implementation that also provides common utility methods",
|
||||||
|
"keywords": [
|
||||||
|
"http",
|
||||||
|
"message",
|
||||||
|
"psr-7",
|
||||||
|
"request",
|
||||||
|
"response",
|
||||||
|
"stream",
|
||||||
|
"uri",
|
||||||
|
"url"
|
||||||
|
],
|
||||||
|
"time": "2019-07-01T23:21:34+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "ingenerator/tokenista",
|
"name": "ingenerator/tokenista",
|
||||||
"version": "v1.1.0",
|
"version": "v1.1.0",
|
||||||
|
@ -629,6 +818,41 @@
|
||||||
],
|
],
|
||||||
"time": "2019-11-13T10:27:43+00:00"
|
"time": "2019-11-13T10:27:43+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "ovh/ovh",
|
||||||
|
"version": "v2.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/ovh/php-ovh.git",
|
||||||
|
"reference": "25a97501a150dff8a7848c372b5826395aab4df2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/ovh/php-ovh/zipball/25a97501a150dff8a7848c372b5826395aab4df2",
|
||||||
|
"reference": "25a97501a150dff8a7848c372b5826395aab4df2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"guzzlehttp/guzzle": "^6.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpdocumentor/phpdocumentor": "2.*",
|
||||||
|
"phpunit/phpunit": "4.*",
|
||||||
|
"squizlabs/php_codesniffer": "1.*"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Ovh\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"description": "Wrapper for OVH APIs",
|
||||||
|
"time": "2016-02-10T13:16:38+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/cache",
|
"name": "psr/cache",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
|
@ -724,6 +948,56 @@
|
||||||
],
|
],
|
||||||
"time": "2017-02-14T16:28:37+00:00"
|
"time": "2017-02-14T16:28:37+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/http-message",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/http-message.git",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Http\\Message\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for HTTP messages",
|
||||||
|
"homepage": "https://github.com/php-fig/http-message",
|
||||||
|
"keywords": [
|
||||||
|
"http",
|
||||||
|
"http-message",
|
||||||
|
"psr",
|
||||||
|
"psr-7",
|
||||||
|
"request",
|
||||||
|
"response"
|
||||||
|
],
|
||||||
|
"time": "2016-08-06T14:39:51+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/log",
|
"name": "psr/log",
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
|
@ -819,6 +1093,46 @@
|
||||||
],
|
],
|
||||||
"time": "2017-10-23T01:57:42+00:00"
|
"time": "2017-10-23T01:57:42+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "ralouphie/getallheaders",
|
||||||
|
"version": "3.0.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/ralouphie/getallheaders.git",
|
||||||
|
"reference": "120b605dfeb996808c31b6477290a714d356e822"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
|
||||||
|
"reference": "120b605dfeb996808c31b6477290a714d356e822",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.6"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"php-coveralls/php-coveralls": "^2.1",
|
||||||
|
"phpunit/phpunit": "^5 || ^6.5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"src/getallheaders.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Ralph Khattar",
|
||||||
|
"email": "ralph.khattar@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A polyfill for getallheaders.",
|
||||||
|
"time": "2019-03-08T08:55:37+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "robmorgan/phinx",
|
"name": "robmorgan/phinx",
|
||||||
"version": "0.11.1",
|
"version": "0.11.1",
|
||||||
|
|
|
@ -101,7 +101,7 @@ class Phone extends \descartes\Controller
|
||||||
* @param $csrf : CSRF token
|
* @param $csrf : CSRF token
|
||||||
* @param string $_POST['number'] : Phone number
|
* @param string $_POST['number'] : Phone number
|
||||||
* @param string $_POST['adapter'] : Phone adapter
|
* @param string $_POST['adapter'] : Phone adapter
|
||||||
* @param string $_POST['adapter_datas'] : Phone adapter datas
|
* @param array $_POST['adapter_datas'] : Phone adapter datas
|
||||||
*/
|
*/
|
||||||
public function create($csrf)
|
public function create($csrf)
|
||||||
{
|
{
|
||||||
|
@ -114,7 +114,7 @@ class Phone extends \descartes\Controller
|
||||||
$id_user = $_SESSION['user']['id'];
|
$id_user = $_SESSION['user']['id'];
|
||||||
$number = $_POST['number'] ?? false;
|
$number = $_POST['number'] ?? false;
|
||||||
$adapter = $_POST['adapter'] ?? false;
|
$adapter = $_POST['adapter'] ?? false;
|
||||||
$adapter_datas = !empty($_POST['adapter_datas']) ? $_POST['adapter_datas'] : '{}';
|
$adapter_datas = !empty($_POST['adapter_datas']) ? $_POST['adapter_datas'] : [];
|
||||||
|
|
||||||
if (!$number || !$adapter)
|
if (!$number || !$adapter)
|
||||||
{
|
{
|
||||||
|
@ -139,26 +139,49 @@ class Phone extends \descartes\Controller
|
||||||
|
|
||||||
|
|
||||||
$adapters = $this->internal_adapter->list_adapters();
|
$adapters = $this->internal_adapter->list_adapters();
|
||||||
$adapter_exists = false;
|
$find_adapter = false;
|
||||||
foreach ($adapters as $metas)
|
foreach ($adapters as $metas)
|
||||||
{
|
{
|
||||||
if ($metas['meta_classname'] === $adapter)
|
if ($metas['meta_classname'] === $adapter)
|
||||||
{
|
{
|
||||||
$adapter_exists = true;
|
$find_adapter = $metas;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$adapter_exists)
|
if (!$find_adapter)
|
||||||
{
|
{
|
||||||
\FlashMessage\FlashMessage::push('danger', 'Cet adaptateur n\'existe pas.');
|
\FlashMessage\FlashMessage::push('danger', 'Cet adaptateur n\'existe pas.');
|
||||||
return $this->redirect(\descartes\Router::url('Phone', 'add'));
|
return $this->redirect(\descartes\Router::url('Phone', 'add'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//If missing required data fields, error
|
||||||
if (NULL === json_decode($adapter_datas))
|
foreach ($find_adapter['meta_datas_fields'] as $field)
|
||||||
{
|
{
|
||||||
\FlashMessage\FlashMessage::push('danger', 'La chaîne de configuration n\'est pas valide.');
|
if ($field['required'] === false)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($adapter_datas[$field['name']]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
\FlashMessage\FlashMessage::push('danger', 'Vous n\'avez pas rempli certains champs obligatoires pour l\'adaptateur choisis.');
|
||||||
|
return $this->redirect(\descartes\Router::url('Phone', 'add'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$adapter_datas = json_encode($adapter_datas);
|
||||||
|
|
||||||
|
//Check adapter is working correctly with thoses numbers and datas
|
||||||
|
$adapter_classname = $find_adapter['meta_classname'];
|
||||||
|
$adapter_instance = new $adapter_classname($number, $adapter_datas);
|
||||||
|
$adapter_working = $adapter_instance->test();
|
||||||
|
|
||||||
|
if (!$adapter_working)
|
||||||
|
{
|
||||||
|
\FlashMessage\FlashMessage::push('danger', 'Impossible d\'utiliser l\'adaptateur choisis avec les données fournies. Vérifiez le numéro de téléphone et les réglages.');
|
||||||
return $this->redirect(\descartes\Router::url('Phone', 'add'));
|
return $this->redirect(\descartes\Router::url('Phone', 'add'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,20 +59,15 @@
|
||||||
title="<?php $this->s($adapter['meta_description']); ?>"
|
title="<?php $this->s($adapter['meta_description']); ?>"
|
||||||
data-description="<?php $this->s($adapter['meta_description']); ?>"
|
data-description="<?php $this->s($adapter['meta_description']); ?>"
|
||||||
data-datas-help="<?php $this->s($adapter['meta_datas_help']); ?>"
|
data-datas-help="<?php $this->s($adapter['meta_datas_help']); ?>"
|
||||||
|
data-datas-fields="<?php $this->s(json_encode($adapter['meta_datas_fields'])); ?>"
|
||||||
>
|
>
|
||||||
<?php $this->s($adapter['meta_name']); ?>
|
<?php $this->s($adapter['meta_name']); ?>
|
||||||
</option>
|
</option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group" id="adapter-datas-container">
|
<div id="adapter-datas-fields-container">
|
||||||
<label>Configuration de l'adaptateur</label>
|
</div>
|
||||||
<p class="italic small help" id="description-adapter-datas">
|
|
||||||
Les données à fournir à l'adaptateur pour lui permettre de faire la liaison avec le téléphone. Par exemple des identifiants d'API.<br/>
|
|
||||||
</p>
|
|
||||||
<textarea id="adapter-datas" name="adapter_datas" class="form-control has-error"></textarea>
|
|
||||||
<p class="hidden help-block" id="adapter-datas-error-message">La configuration doit être un JSON valide.</p>
|
|
||||||
</div>
|
|
||||||
<a class="btn btn-danger" href="<?php echo \descartes\Router::url('Phone', 'list'); ?>">Annuler</a>
|
<a class="btn btn-danger" href="<?php echo \descartes\Router::url('Phone', 'list'); ?>">Annuler</a>
|
||||||
<input type="submit" class="btn btn-success" value="Enregistrer le phone" />
|
<input type="submit" class="btn btn-success" value="Enregistrer le phone" />
|
||||||
</form>
|
</form>
|
||||||
|
@ -84,36 +79,39 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
jQuery('document').ready(function($)
|
|
||||||
|
function change_adapter ()
|
||||||
{
|
{
|
||||||
var option = jQuery('#adapter-select').find('option:selected');
|
var option = jQuery('#adapter-select').find('option:selected');
|
||||||
jQuery('#description-adapter').text(option.attr('data-description'));
|
jQuery('#description-adapter').text(option.attr('data-description'));
|
||||||
jQuery('#description-adapter-datas').text(option.attr('data-datas-help'));
|
jQuery('#description-adapter-datas').text(option.attr('data-datas-help'));
|
||||||
|
|
||||||
jQuery('#adapter-select').on('change', function (e)
|
var datas_fields = option.attr('data-datas-fields');
|
||||||
|
datas_fields = JSON.parse(datas_fields);
|
||||||
|
|
||||||
|
|
||||||
|
var html = '';
|
||||||
|
jQuery.each(datas_fields, function (index, field)
|
||||||
{
|
{
|
||||||
var option = jQuery(this).find('option:selected');
|
html += '<div class="form-group">' +
|
||||||
jQuery('#description-adapter').text(option.attr('data-description'));
|
'<label>' + field.title + '</label>' +
|
||||||
jQuery('#description-adapter-datas').text(option.attr('data-datas-help'));
|
'<p class="italic small help">' + field.description + '</p>' +
|
||||||
|
'<div class="form-group">' +
|
||||||
|
'<input name="adapter_datas[' + field.name + ']" class="form-control" ' + (field.required ? 'required' : '') + ' >' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>';
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery('#adapter-datas').on('input', function (e)
|
jQuery('#adapter-datas-fields-container').html(html);
|
||||||
{
|
}
|
||||||
try
|
|
||||||
{
|
|
||||||
if (jQuery(this).val() !== '')
|
|
||||||
{
|
|
||||||
JSON.parse(jQuery(this).val());
|
|
||||||
}
|
|
||||||
|
|
||||||
jQuery('#adapter-datas-container').removeClass('has-error');
|
jQuery('document').ready(function($)
|
||||||
jQuery('#adapter-datas-error-message').addClass('hidden');
|
{
|
||||||
}
|
change_adapter();
|
||||||
catch (err)
|
|
||||||
{
|
jQuery('#adapter-select').on('change', function (e)
|
||||||
jQuery('#adapter-datas-container').addClass('has-error');
|
{
|
||||||
jQuery('#adapter-datas-error-message').removeClass('hidden');
|
change_adapter();
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var number_input = jQuery('#phone-international-input')[0];
|
var number_input = jQuery('#phone-international-input')[0];
|
||||||
|
|
Loading…
Reference in New Issue