From ff6b4da4dfa60f2f02bcbcc86f97c027e4b36fa1 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Fri, 1 May 2020 14:03:27 +0800 Subject: [PATCH 1/2] Save records of sms messages when sending #384 --- config/services.yaml | 1 + src/Command/TestSMSCommand.php | 41 ++++++++++ src/Entity/SMSMessage.php | 126 ++++++++++++++++++++++++++++++ src/Service/RisingTideGateway.php | 18 ++++- 4 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 src/Command/TestSMSCommand.php create mode 100644 src/Entity/SMSMessage.php diff --git a/config/services.yaml b/config/services.yaml index 284b7b73..b0a5b022 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -73,6 +73,7 @@ services: $pass: "%env(RT_PASS)%" $usage_type: "%env(RT_USAGE_TYPE)%" $shortcode: "%env(RT_SHORTCODE)%" + $dr_url: "" App\Service\MQTTClient: arguments: diff --git a/src/Command/TestSMSCommand.php b/src/Command/TestSMSCommand.php new file mode 100644 index 00000000..f431398f --- /dev/null +++ b/src/Command/TestSMSCommand.php @@ -0,0 +1,41 @@ +setName('sms:test') + ->setDescription('Sends a test SMS message.') + ->setHelp('Sends a test SMS message.') + ->addArgument('destination', InputArgument::REQUIRED, 'Destination number to send to'); + } + + public function __construct(RisingTideGateway $gateway) + { + $this->gateway = $gateway; + + parent::__construct(); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $number = $input->getArgument('destination'); + + error_log('sending sms to ' . $number); + $msg = 'This is a test.'; + $this->gateway->sendSMS($number, 'MOTOLITE', $msg); + + return 0; + } +} diff --git a/src/Entity/SMSMessage.php b/src/Entity/SMSMessage.php new file mode 100644 index 00000000..cb6b2e0a --- /dev/null +++ b/src/Entity/SMSMessage.php @@ -0,0 +1,126 @@ +date_create = new DateTime(); + $this->from = ''; + $this->from_alias = ''; + $this->to = ''; + $this->message = ''; + $this->status = 'created'; + } + + public function getID() + { + return $this->id; + } + + public function getDateCreate() + { + return $this->date_create; + } + + public function setFrom($from) + { + $this->source = $from; + return $this; + } + + public function getFrom() + { + return $this->source; + } + + public function setFromAlias($alias) + { + $this->source_alias = $alias; + return $this; + } + + public function getFromAlias() + { + return $this->source_alias; + } + + public function setTo($to) + { + $this->destination = $to; + return $this; + } + + public function getTo() + { + return $this->destination; + } + + public function setMessage($message) + { + $this->message = $message; + return $this; + } + + public function getMessage() + { + return $this->message; + } + + public function setStatus($status) + { + $this->status = $status; + return $this; + } + + public function getStatus() + { + return $this->status; + } +} diff --git a/src/Service/RisingTideGateway.php b/src/Service/RisingTideGateway.php index ddfb2f79..c33c0ae9 100644 --- a/src/Service/RisingTideGateway.php +++ b/src/Service/RisingTideGateway.php @@ -4,6 +4,7 @@ namespace App\Service; use Doctrine\ORM\EntityManagerInterface; use DateTime; +use App\Entity\SMSMessage; class RisingTideGateway { @@ -17,14 +18,16 @@ class RisingTideGateway protected $pass; protected $usage_type; protected $shortcode; + protected $dr_url; - public function __construct(EntityManagerInterface $em, $user, $pass, $usage_type, $shortcode) + public function __construct(EntityManagerInterface $em, $user, $pass, $usage_type, $shortcode, $dr_url) { $this->em = $em; $this->user = $user; $this->pass = $pass; $this->usage_type = $usage_type; $this->shortcode = $shortcode; + $this->dr_url = $dr_url; } public function sendSMS($mobile_num, $mask, $message) @@ -33,7 +36,18 @@ class RisingTideGateway 'Content-Type: application/vnd.net.wyrls.Document-v3+json' ]; - $date = new DateTime(); + $sms = new SMSMessage(); + $sms->setFrom($this->shortcode) + ->setFromAlias($mask) + ->setTo($mobile_num) + ->setMessage($message) + ->setStatus('sent'); + + $this->em->persist($sms); + $this->em->flush(); + + $date = $sms->getDateCreate(); + // $date = new DateTime(); $date_string = $date->format('Y-m-d') . 'T' . $date->format('H:m:s'); $data = [ From d189b8eb189c59aaa8338b142fe81664e8c747f7 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 3 May 2020 22:50:56 +0800 Subject: [PATCH 2/2] Fix SMS delivery receipt functionality #394 --- config/packages/security.yaml | 4 ++ config/routes/sms.yaml | 6 +++ config/services.yaml | 2 +- src/Controller/SMSController.php | 71 +++++++++++++++++++++++++++++++ src/Entity/SMSMessage.php | 23 ++++++++++ src/Service/RisingTideGateway.php | 4 ++ 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 config/routes/sms.yaml create mode 100644 src/Controller/SMSController.php diff --git a/config/packages/security.yaml b/config/packages/security.yaml index dc9aa78d..4339eba4 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -30,6 +30,10 @@ security: pattern: ^\/api\/ security: false + sms: + pattern: ^/sms\/ + security: false + rider_api: pattern: ^\/rapi\/ security: false diff --git a/config/routes/sms.yaml b/config/routes/sms.yaml new file mode 100644 index 00000000..0c6fb363 --- /dev/null +++ b/config/routes/sms.yaml @@ -0,0 +1,6 @@ +# sms handling - rising tide + +sms_delivery_receipt: + path: /sms/delivery_receipt + controller: App\Controller\SMSController::deliveryReceipt + methods: [POST] diff --git a/config/services.yaml b/config/services.yaml index d235bff2..697e0428 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -74,7 +74,7 @@ services: $pass: "%env(RT_PASS)%" $usage_type: "%env(RT_USAGE_TYPE)%" $shortcode: "%env(RT_SHORTCODE)%" - $dr_url: "" + $dr_url: "https://resqapi.jankstudio.com/sms/delivery_receipt" App\Service\MQTTClient: arguments: diff --git a/src/Controller/SMSController.php b/src/Controller/SMSController.php new file mode 100644 index 00000000..b001e668 --- /dev/null +++ b/src/Controller/SMSController.php @@ -0,0 +1,71 @@ +getContent(); + + error_log($content); + + $data = json_decode($content, true); + error_log(print_r($data, true)); + + // data has id? + if (!isset($data['id'])) + { + error_log('SMSDR: no id sent'); + $resp = new Response(); + $resp->setStatusCode(400); + return $resp; + } + + // check structure + if (!isset($data['delivered']) || + !isset($data['reason_code']) || + !isset($data['reason_description']) + ) + { + error_log('SMSDR: bad data structure'); + $resp = new Response(); + $resp->setStatusCode(400); + return $resp; + } + + // find sms + $sms = $em->getRepository(SMSMessage::class)->find($data['id']); + if ($sms == null) + { + error_log('SMSDR: no sms found'); + $resp = new Response(); + $resp->setStatusCode(202); + return $resp; + } + + $sms->setReasonCode($data['reason_code']); + if ($data['delivered']) + $sms->setStatus('delivered'); + else + $sms->setStatus('not_delivered'); + $em->flush(); + + $resp = new Response(); + $resp->setStatusCode(202); + return $resp; + } +} diff --git a/src/Entity/SMSMessage.php b/src/Entity/SMSMessage.php index cb6b2e0a..4869ee29 100644 --- a/src/Entity/SMSMessage.php +++ b/src/Entity/SMSMessage.php @@ -48,6 +48,11 @@ class SMSMessage */ protected $status; + /** + * @ORM\Column(type="integer", length=5) + */ + protected $reason_code; + public function __construct() { @@ -57,6 +62,13 @@ class SMSMessage $this->to = ''; $this->message = ''; $this->status = 'created'; + $this->reason_code = 0; + + // status are: + // created + // sent + // delivered + // not_delivered } public function getID() @@ -123,4 +135,15 @@ class SMSMessage { return $this->status; } + + public function setReasonCode($code) + { + $this->reason_code = $code; + return $this; + } + + public function getReasonCode() + { + return $this->reason_code; + } } diff --git a/src/Service/RisingTideGateway.php b/src/Service/RisingTideGateway.php index c33c0ae9..7eabb251 100644 --- a/src/Service/RisingTideGateway.php +++ b/src/Service/RisingTideGateway.php @@ -51,6 +51,7 @@ class RisingTideGateway $date_string = $date->format('Y-m-d') . 'T' . $date->format('H:m:s'); $data = [ + 'id' => $sms->getID(), 'from' => $this->shortcode, 'from_alias' => $mask, 'to' => $mobile_num, @@ -58,7 +59,10 @@ class RisingTideGateway 'body' => $message, 'date' => $date_string, 'usagetype' => $this->usage_type, + 'delivery_receipt_url' => $dr_url, ]; + error_log(print_r($data, true)); + $data_json = json_encode($data); $userpwd = $this->user . ':' . $this->pass;