Crap. Tonight is raid night and I am already late.

This commit is contained in:
2023-11-01 18:10:40 -04:00
commit 5e1dca4eb2
7 changed files with 249 additions and 0 deletions

14
.gitlab-ci.yml Normal file
View File

@@ -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

25
composer.json Normal file
View File

@@ -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/"
}
}
}

46
rules.xml Normal file
View File

@@ -0,0 +1,46 @@
<?xml version="1.0"?>
<ruleset name="siteworxpro">
<!-- relative path from PHPCS source location -->
<config name="installed_paths" value="vendor/slevomat/coding-standard"/>
<config name="installed_paths" value="vendor/squizlabs/php_codesniffer/src"/>
<rule ref="PSR12">
<exclude name="PSR1.Files.SideEffects.FoundWithSymbols" />
<exclude name="PSR12.Classes.OpeningBraceSpace.Found" />
</rule>
<!-- specific sniffs to include -->
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSpacingSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UselessVariableSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/UselessParameterDefaultValueSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UselessAliasSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseFromSameNamespaceSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseDoesNotStartWithBackslashSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/RequireCombinedAssignmentOperatorSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/TypeCastSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/UselessParenthesesSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/UselessSemicolonSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowImplicitArrayCreationSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AssignmentInConditionSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowContinueWithoutIntegerOperandInSwitchSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowShortTernaryOperatorSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowYodaComparisonSniff.php" />
<rule ref="vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/LanguageConstructWithParenthesesSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ForbiddenFunctionsSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/NoSilencedErrorsSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/SyntaxSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/IncrementDecrementSpacingSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php" />
<rule ref="vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php" />
</ruleset>

View File

@@ -0,0 +1,21 @@
<?php
declare(strict_types=1);
namespace Siteworx\Sms\Adapters;
interface AdapterInterface
{
/**
* @param string $number
* @param string $message
* @return string uuid of message
*/
public function sendText(string $number, string $message): string;
/**
* @param string $number
* @return bool
*/
public function validatePhoneNumber(string $number): bool;
}

56
src/Adapters/Log.php Normal file
View File

@@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace Siteworx\Sms\Adapters;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
/**
* Class Log
* @package Siteworx\Library\Sms\Adapters
*/
final class Log implements AdapterInterface
{
private string $logLevel;
private LoggerInterface $logger;
public function __construct(LoggerInterface $logger, array $options = [])
{
$this->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;
}
}

49
src/Adapters/Sns.php Normal file
View File

@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace Siteworx\Sms\Adapters;
use Aws\Sns\SnsClient;
/**
* Class Sns
* @package Siteworx\Library\Sms\Adapters
*/
final class Sns implements AdapterInterface
{
private SnsClient $snsClient;
public function __construct(array $options)
{
if (!isset($options['version'])) {
throw new \InvalidArgumentException('AWS sdk version is required');
}
if (!isset($options['region'])) {
throw new \InvalidArgumentException('AWS sdk region is required');
}
$this->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;
}
}

38
src/TextMessenger.php Normal file
View File

@@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
namespace Siteworx\Sms;
use Siteworx\Sms\Adapters\AdapterInterface;
final class TextMessenger
{
private AdapterInterface $adapter;
public const ADAPTERS = [
'log' => 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);
}
}