From 5e1dca4eb2cdd0291b81245af8c9e7dc8a3a93af Mon Sep 17 00:00:00 2001 From: Ron Rise Date: Wed, 1 Nov 2023 18:10:40 -0400 Subject: [PATCH] Crap. Tonight is raid night and I am already late. --- .gitlab-ci.yml | 14 ++++++++ composer.json | 25 ++++++++++++++ rules.xml | 46 +++++++++++++++++++++++++ src/Adapters/AdapterInterface.php | 21 ++++++++++++ src/Adapters/Log.php | 56 +++++++++++++++++++++++++++++++ src/Adapters/Sns.php | 49 +++++++++++++++++++++++++++ src/TextMessenger.php | 38 +++++++++++++++++++++ 7 files changed, 249 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100644 composer.json create mode 100644 rules.xml create mode 100644 src/Adapters/AdapterInterface.php create mode 100644 src/Adapters/Log.php create mode 100644 src/Adapters/Sns.php create mode 100644 src/TextMessenger.php diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..7bd3bb5 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,14 @@ +stages: + - deploy + +deploy: + stage: deploy + image: alpine:latest + only: + - tags + tags: + - build + script: + - apk add curl + - 'curl -iL --header "Job-Token: $CI_JOB_TOKEN" --data tag=${CI_COMMIT_TAG} "${CI_API_V4_URL}/projects/$CI_PROJECT_ID/packages/composer"' + environment: production diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..6fa4401 --- /dev/null +++ b/composer.json @@ -0,0 +1,25 @@ +{ + "name": "siteworxpro/sms", + "description": "A Text Message Library", + "type": "library", + "authors": [ + { + "name": "Ron Rise", + "email": "ron@siteworxpro.com" + } + ], + "require": { + "php": "^7.4 || ^8.0 || ^8.1", + "psr/log": "^1.1", + "aws/aws-sdk-php": "^3.159" + }, + "require-dev": { + "squizlabs/php_codesniffer": "^3.5.8", + "slevomat/coding-standard": "^7.0.16" + }, + "autoload": { + "psr-4": { + "Siteworx\\Sms\\": "src/" + } + } +} diff --git a/rules.xml b/rules.xml new file mode 100644 index 0000000..856ad42 --- /dev/null +++ b/rules.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Adapters/AdapterInterface.php b/src/Adapters/AdapterInterface.php new file mode 100644 index 0000000..1fa6b39 --- /dev/null +++ b/src/Adapters/AdapterInterface.php @@ -0,0 +1,21 @@ +logger = $logger; + $this->logLevel = $options['logLevel'] ?? LogLevel::INFO; + } + + /** + * @param string $number + * @param string $message + * @return string + * @throws \Exception + */ + public function sendText(string $number, string $message): string + { + $this->logger->{$this->logLevel}(sprintf('[Text Message] (%s): "%s"', $number, $message)); + + return sprintf( + '%04X%04X-%04X-%04X-%04X-%04X%04X%04X', + random_int(0, 65535), + random_int(0, 65535), + random_int(0, 65535), + random_int(16384, 20479), + random_int(32768, 49151), + random_int(0, 65535), + random_int(0, 65535), + random_int(0, 65535) + ); + } + + public function validatePhoneNumber(string $number): bool + { + preg_match('/\+1-[\d]{3}-[\d]{3}-[\d]{4}/', $number, $output_array); + + return \count($output_array) === 1; + } +} diff --git a/src/Adapters/Sns.php b/src/Adapters/Sns.php new file mode 100644 index 0000000..26a2407 --- /dev/null +++ b/src/Adapters/Sns.php @@ -0,0 +1,49 @@ +snsClient = new SnsClient($options); + } + + public function sendText(string $number, string $message): string + { + $result = $this->snsClient->publish([ + 'Message' => $message, + 'PhoneNumber' => $number, + ]); + + $messageId = $result->get('MessageId'); + + return $messageId ?? ''; + } + + public function validatePhoneNumber(string $number): bool + { + preg_match('/\+1-[\d]{3}-[\d]{3}-[\d]{4}/', $number, $output_array); + + return \count($output_array) === 1; + } +} diff --git a/src/TextMessenger.php b/src/TextMessenger.php new file mode 100644 index 0000000..176bd20 --- /dev/null +++ b/src/TextMessenger.php @@ -0,0 +1,38 @@ + Log::class, + 'sns' => Sns::class + ]; + + public function __construct(AdapterInterface $adapter) + { + $this->adapter = $adapter; + } + + /** + * @param string $number + * @param string $message + * @return string + * @throws \InvalidArgumentException + */ + public function sendText(string $number, string $message): string + { + if ($this->adapter->validatePhoneNumber($number) === false) { + throw new \InvalidArgumentException('Invalid phone number for adapter: ' . $number); + } + + return $this->adapter->sendText($number, $message); + } +}