From c31d6f12316dd17c9575ba2de2dd85ae726c9be6 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sat, 5 Apr 2025 19:41:09 +0000 Subject: [PATCH 1/7] feat: inforu sms adapter --- src/Utopia/Messaging/Adapter/SMS/Inforu.php | 83 +++++++++++++++++++++ tests/Messaging/Adapter/SMS/InforuTest.php | 31 ++++++++ 2 files changed, 114 insertions(+) create mode 100644 src/Utopia/Messaging/Adapter/SMS/Inforu.php create mode 100644 tests/Messaging/Adapter/SMS/InforuTest.php diff --git a/src/Utopia/Messaging/Adapter/SMS/Inforu.php b/src/Utopia/Messaging/Adapter/SMS/Inforu.php new file mode 100644 index 0000000..8318d08 --- /dev/null +++ b/src/Utopia/Messaging/Adapter/SMS/Inforu.php @@ -0,0 +1,83 @@ +getType()); + + $recipients = array_map( + fn ($number) => ['Phone' => ltrim($number, '+')], + $message->getTo() + ); + + $result = $this->request( + method: 'POST', + url: 'https://capi.inforu.co.il/api/v2/SMS/SendSms', + headers: [ + 'Content-Type: application/json', + 'Authorization: Basic ' . base64_encode("{$this->username}:{$this->apiToken}"), + ], + body: [ + 'Data' => [ + 'Message' => $message->getContent(), + 'Recipients' => $recipients, + 'Settings' => [ + 'Sender' => $this->sender, + ], + ], + ], + ); + + if ($result['statusCode'] === 200 && ($result['response']['StatusId'] ?? 0) === 1) { + $response->setDeliveredTo(count($message->getTo())); + foreach ($message->getTo() as $to) { + $response->addResult($to); + } + } else { + $errorMessage = $result['response']['DetailedDescription'] ?? 'Unknown error'; + foreach ($message->getTo() as $to) { + $response->addResult($to, $errorMessage); + } + } + + return $response->toArray(); + } +} diff --git a/tests/Messaging/Adapter/SMS/InforuTest.php b/tests/Messaging/Adapter/SMS/InforuTest.php new file mode 100644 index 0000000..fa5ebad --- /dev/null +++ b/tests/Messaging/Adapter/SMS/InforuTest.php @@ -0,0 +1,31 @@ +send($message); + + $this->assertResponse($response); + } +} From c5eab46c1b9d23227135c8efe1793003a07d5f4d Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 7 Apr 2025 05:21:46 +0000 Subject: [PATCH 2/7] chore: update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index def239e..110842b 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ $messaging->send($message); - [x] [Sinch](https://www.sinch.com/) - [x] [Seven](https://www.seven.io/) - [ ] [SmsGlobal](https://www.smsglobal.com/) +- [x] [Inforu](https://www.inforu.co.il/) ### Push - [x] [FCM](https://firebase.google.com/docs/cloud-messaging) From f1ea63c698806effbada520455fd892ed47f4221 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 7 Apr 2025 08:27:18 +0000 Subject: [PATCH 3/7] chore: add env variables --- .env.dev | 5 ++++- .github/workflows/test.yml | 3 +++ docker-compose.yml | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.env.dev b/.env.dev index 36923f8..5ee54d8 100644 --- a/.env.dev +++ b/.env.dev @@ -32,4 +32,7 @@ DISCORD_WEBHOOK_TOKEN= FAST2SMS_API_KEY= FAST2SMS_SENDER_ID= FAST2SMS_MESSAGE_ID= -FAST2SMS_TO= \ No newline at end of file +FAST2SMS_TO= +INFORU_USERNAME= +INFORU_API_TOKEN= +INFORU_SENDER= \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9df4bf4..7afd87a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,6 +49,9 @@ jobs: FAST2SMS_SENDER_ID: ${{ secrets.FAST2SMS_SENDER_ID }} FAST2SMS_MESSAGE_ID: ${{ secrets.FAST2SMS_MESSAGE_ID }} FAST2SMS_TO: ${{ secrets.FAST2SMS_TO }} + INFORU_USERNAME: ${{ secrets.INFORU_USERNAME }} + INFORU_API_TOKEN: ${{ secrets.INFORU_API_TOKEN }} + INFORU_SENDER: ${{ secrets.INFORU_SENDER }} run: | docker compose up -d --build sleep 5 diff --git a/docker-compose.yml b/docker-compose.yml index 1756221..31f6688 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,6 +42,9 @@ services: - FAST2SMS_SENDER_ID - FAST2SMS_MESSAGE_ID - FAST2SMS_TO + - INFORU_USERNAME + - INFORU_API_TOKEN + - INFORU_SENDER maildev: image: appwrite/mailcatcher:1.0.0 From 8f8611e2ed139339491e8063ee6f99007958a4bf Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sun, 11 May 2025 06:25:04 +0000 Subject: [PATCH 4/7] chore: finish the adapter tests --- .env.dev | 1 - .github/workflows/test.yml | 1 - docker-compose.yml | 1 - src/Utopia/Messaging/Adapter/SMS/Inforu.php | 8 ++++---- tests/Messaging/Adapter/SMS/InforuTest.php | 6 +++--- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.env.dev b/.env.dev index 5ee54d8..68ce0a3 100644 --- a/.env.dev +++ b/.env.dev @@ -33,6 +33,5 @@ FAST2SMS_API_KEY= FAST2SMS_SENDER_ID= FAST2SMS_MESSAGE_ID= FAST2SMS_TO= -INFORU_USERNAME= INFORU_API_TOKEN= INFORU_SENDER= \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7afd87a..ad01397 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,7 +49,6 @@ jobs: FAST2SMS_SENDER_ID: ${{ secrets.FAST2SMS_SENDER_ID }} FAST2SMS_MESSAGE_ID: ${{ secrets.FAST2SMS_MESSAGE_ID }} FAST2SMS_TO: ${{ secrets.FAST2SMS_TO }} - INFORU_USERNAME: ${{ secrets.INFORU_USERNAME }} INFORU_API_TOKEN: ${{ secrets.INFORU_API_TOKEN }} INFORU_SENDER: ${{ secrets.INFORU_SENDER }} run: | diff --git a/docker-compose.yml b/docker-compose.yml index 31f6688..73eaae8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,7 +42,6 @@ services: - FAST2SMS_SENDER_ID - FAST2SMS_MESSAGE_ID - FAST2SMS_TO - - INFORU_USERNAME - INFORU_API_TOKEN - INFORU_SENDER diff --git a/src/Utopia/Messaging/Adapter/SMS/Inforu.php b/src/Utopia/Messaging/Adapter/SMS/Inforu.php index 8318d08..89a7d6f 100644 --- a/src/Utopia/Messaging/Adapter/SMS/Inforu.php +++ b/src/Utopia/Messaging/Adapter/SMS/Inforu.php @@ -13,12 +13,10 @@ class Inforu extends SMSAdapter protected const NAME = 'Inforu'; /** - * @param string $username Inforu username * @param string $apiToken Inforu API token * @param string $sender Sender name/number */ public function __construct( - private string $username, private string $apiToken, private string $sender ) { @@ -48,12 +46,14 @@ protected function process(SMSMessage $message): array $message->getTo() ); + fwrite(STDOUT, json_encode($recipients, JSON_PRETTY_PRINT)); + $result = $this->request( method: 'POST', url: 'https://capi.inforu.co.il/api/v2/SMS/SendSms', headers: [ 'Content-Type: application/json', - 'Authorization: Basic ' . base64_encode("{$this->username}:{$this->apiToken}"), + 'Authorization: Basic ' . $this->apiToken, ], body: [ 'Data' => [ @@ -72,7 +72,7 @@ protected function process(SMSMessage $message): array $response->addResult($to); } } else { - $errorMessage = $result['response']['DetailedDescription'] ?? 'Unknown error'; + $errorMessage = $result['response']['StatusDescription'] ?? 'Unknown error'; foreach ($message->getTo() as $to) { $response->addResult($to, $errorMessage); } diff --git a/tests/Messaging/Adapter/SMS/InforuTest.php b/tests/Messaging/Adapter/SMS/InforuTest.php index fa5ebad..1744436 100644 --- a/tests/Messaging/Adapter/SMS/InforuTest.php +++ b/tests/Messaging/Adapter/SMS/InforuTest.php @@ -14,14 +14,14 @@ class InforuTest extends Base public function testSendSMS(): void { $sender = new Inforu( - username: \getenv('INFORU_USERNAME'), apiToken: \getenv('INFORU_API_TOKEN'), sender: \getenv('INFORU_SENDER') ); $message = new SMS( - to: [\getenv('INFORU_TO')], - content: 'Test Content' + to: ['0541234567'], + content: 'Test Content', + from: '+987654321' ); $response = $sender->send($message); From 3f34bace2d381db10caf111c0841290ede22b8f5 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sun, 11 May 2025 06:26:08 +0000 Subject: [PATCH 5/7] fix: env format --- .env.dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.dev b/.env.dev index 68ce0a3..635e602 100644 --- a/.env.dev +++ b/.env.dev @@ -34,4 +34,4 @@ FAST2SMS_SENDER_ID= FAST2SMS_MESSAGE_ID= FAST2SMS_TO= INFORU_API_TOKEN= -INFORU_SENDER= \ No newline at end of file +INFORU_SENDER= From 6867085ebc1f813c1be12f649a9cadce686a8112 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sun, 11 May 2025 06:29:25 +0000 Subject: [PATCH 6/7] chore: update to use senderId --- .env.dev | 2 +- .github/workflows/test.yml | 2 +- docker-compose.yml | 2 +- src/Utopia/Messaging/Adapter/SMS/Inforu.php | 6 +++--- tests/Messaging/Adapter/SMS/InforuTest.php | 3 +-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.env.dev b/.env.dev index 635e602..50d4c55 100644 --- a/.env.dev +++ b/.env.dev @@ -34,4 +34,4 @@ FAST2SMS_SENDER_ID= FAST2SMS_MESSAGE_ID= FAST2SMS_TO= INFORU_API_TOKEN= -INFORU_SENDER= +INFORU_SENDER_ID= diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ad01397..9e16686 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,7 +50,7 @@ jobs: FAST2SMS_MESSAGE_ID: ${{ secrets.FAST2SMS_MESSAGE_ID }} FAST2SMS_TO: ${{ secrets.FAST2SMS_TO }} INFORU_API_TOKEN: ${{ secrets.INFORU_API_TOKEN }} - INFORU_SENDER: ${{ secrets.INFORU_SENDER }} + INFORU_SENDER_ID: ${{ secrets.INFORU_SENDER_ID }} run: | docker compose up -d --build sleep 5 diff --git a/docker-compose.yml b/docker-compose.yml index 73eaae8..fc7b7cc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,7 +43,7 @@ services: - FAST2SMS_MESSAGE_ID - FAST2SMS_TO - INFORU_API_TOKEN - - INFORU_SENDER + - INFORU_SENDER_ID maildev: image: appwrite/mailcatcher:1.0.0 diff --git a/src/Utopia/Messaging/Adapter/SMS/Inforu.php b/src/Utopia/Messaging/Adapter/SMS/Inforu.php index 89a7d6f..312a905 100644 --- a/src/Utopia/Messaging/Adapter/SMS/Inforu.php +++ b/src/Utopia/Messaging/Adapter/SMS/Inforu.php @@ -14,11 +14,11 @@ class Inforu extends SMSAdapter /** * @param string $apiToken Inforu API token - * @param string $sender Sender name/number + * @param string $senderId Sender ID */ public function __construct( private string $apiToken, - private string $sender + private string $senderId ) { } @@ -60,7 +60,7 @@ protected function process(SMSMessage $message): array 'Message' => $message->getContent(), 'Recipients' => $recipients, 'Settings' => [ - 'Sender' => $this->sender, + 'Sender' => $this->senderId, ], ], ], diff --git a/tests/Messaging/Adapter/SMS/InforuTest.php b/tests/Messaging/Adapter/SMS/InforuTest.php index 1744436..adaff37 100644 --- a/tests/Messaging/Adapter/SMS/InforuTest.php +++ b/tests/Messaging/Adapter/SMS/InforuTest.php @@ -15,13 +15,12 @@ public function testSendSMS(): void { $sender = new Inforu( apiToken: \getenv('INFORU_API_TOKEN'), - sender: \getenv('INFORU_SENDER') + senderId: \getenv('INFORU_SENDER_ID') ); $message = new SMS( to: ['0541234567'], content: 'Test Content', - from: '+987654321' ); $response = $sender->send($message); From 3c5a61c5a91a991efc4b4e4bda85ec06a567221e Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 12 May 2025 16:03:53 +0000 Subject: [PATCH 7/7] chore: review --- src/Utopia/Messaging/Adapter/SMS/Inforu.php | 4 +--- tests/Messaging/Adapter/SMS/InforuTest.php | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Utopia/Messaging/Adapter/SMS/Inforu.php b/src/Utopia/Messaging/Adapter/SMS/Inforu.php index 312a905..54b8dcc 100644 --- a/src/Utopia/Messaging/Adapter/SMS/Inforu.php +++ b/src/Utopia/Messaging/Adapter/SMS/Inforu.php @@ -17,8 +17,8 @@ class Inforu extends SMSAdapter * @param string $senderId Sender ID */ public function __construct( + private string $senderId, private string $apiToken, - private string $senderId ) { } @@ -46,8 +46,6 @@ protected function process(SMSMessage $message): array $message->getTo() ); - fwrite(STDOUT, json_encode($recipients, JSON_PRETTY_PRINT)); - $result = $this->request( method: 'POST', url: 'https://capi.inforu.co.il/api/v2/SMS/SendSms', diff --git a/tests/Messaging/Adapter/SMS/InforuTest.php b/tests/Messaging/Adapter/SMS/InforuTest.php index adaff37..206cbde 100644 --- a/tests/Messaging/Adapter/SMS/InforuTest.php +++ b/tests/Messaging/Adapter/SMS/InforuTest.php @@ -14,8 +14,8 @@ class InforuTest extends Base public function testSendSMS(): void { $sender = new Inforu( + senderId: \getenv('INFORU_SENDER_ID'), apiToken: \getenv('INFORU_API_TOKEN'), - senderId: \getenv('INFORU_SENDER_ID') ); $message = new SMS(