Crap. Tonight is raid night and I am already late.
This commit is contained in:
14
.gitlab-ci.yml
Normal file
14
.gitlab-ci.yml
Normal 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
25
composer.json
Normal 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
46
rules.xml
Normal 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>
|
21
src/Adapters/AdapterInterface.php
Normal file
21
src/Adapters/AdapterInterface.php
Normal 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
56
src/Adapters/Log.php
Normal 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
49
src/Adapters/Sns.php
Normal 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
38
src/TextMessenger.php
Normal 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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user