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 82eb4cc5..697e0428 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -74,6 +74,7 @@ services: $pass: "%env(RT_PASS)%" $usage_type: "%env(RT_USAGE_TYPE)%" $shortcode: "%env(RT_SHORTCODE)%" + $dr_url: "https://resqapi.jankstudio.com/sms/delivery_receipt" 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/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 new file mode 100644 index 00000000..4869ee29 --- /dev/null +++ b/src/Entity/SMSMessage.php @@ -0,0 +1,149 @@ +date_create = new DateTime(); + $this->from = ''; + $this->from_alias = ''; + $this->to = ''; + $this->message = ''; + $this->status = 'created'; + $this->reason_code = 0; + + // status are: + // created + // sent + // delivered + // not_delivered + } + + 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; + } + + 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 ddfb2f79..7eabb251 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,10 +36,22 @@ 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 = [ + 'id' => $sms->getID(), 'from' => $this->shortcode, 'from_alias' => $mask, 'to' => $mobile_num, @@ -44,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;