From 80617cead96816f67e3634e27269b39aa93927a3 Mon Sep 17 00:00:00 2001 From: deepshekhardas Date: Mon, 16 Mar 2026 17:23:22 +0530 Subject: [PATCH 1/2] Feat: Add OneSignal push provider adapter (#7726) --- .../Messaging/Adapter/Push/OneSignal.php | 99 +++++++++++++++++++ .../Messaging/Adapter/Push/OneSignalTest.php | 23 +++++ 2 files changed, 122 insertions(+) create mode 100644 src/Utopia/Messaging/Adapter/Push/OneSignal.php create mode 100644 tests/Messaging/Adapter/Push/OneSignalTest.php diff --git a/src/Utopia/Messaging/Adapter/Push/OneSignal.php b/src/Utopia/Messaging/Adapter/Push/OneSignal.php new file mode 100644 index 00000000..3f539772 --- /dev/null +++ b/src/Utopia/Messaging/Adapter/Push/OneSignal.php @@ -0,0 +1,99 @@ + $this->appId, + 'include_player_ids' => $message->getTo(), + ]; + + if (!\is_null($message->getTitle())) { + $payload['headings'] = ['en' => $message->getTitle()]; + } + if (!\is_null($message->getBody())) { + $payload['contents'] = ['en' => $message->getBody()]; + } + if (!\is_null($message->getData())) { + $payload['data'] = $message->getData(); + } + if (!\is_null($message->getAction())) { + $payload['url'] = $message->getAction(); + } + if (!\is_null($message->getImage())) { + $payload['big_picture'] = $message->getImage(); + $payload['ios_attachments'] = ['id' => $message->getImage()]; + } + if (!\is_null($message->getSound())) { + $payload['android_sound'] = $message->getSound(); + $payload['ios_sound'] = $message->getSound() . '.wav'; + } + if (!\is_null($message->getBadge())) { + $payload['ios_badgeType'] = 'SetTo'; + $payload['ios_badgeCount'] = $message->getBadge(); + } + + $results = $this->request( + method: 'POST', + url: 'https://onesignal.com/api/v1/notifications', + headers: [ + 'Content-Type: application/json', + "Authorization: Basic {$this->apiKey}", + ], + body: $payload + ); + + $response = new Response($this->getType()); + + if ($results['statusCode'] >= 200 && $results['statusCode'] < 300) { + $response->incrementDeliveredTo(\count($message->getTo())); + foreach ($message->getTo() as $to) { + $response->addResult($to); + } + } else { + foreach ($message->getTo() as $to) { + $response->addResult($to, $results['response']['errors'][0] ?? 'Unknown error'); + } + } + + return $response->toArray(); + } +} diff --git a/tests/Messaging/Adapter/Push/OneSignalTest.php b/tests/Messaging/Adapter/Push/OneSignalTest.php new file mode 100644 index 00000000..ce093903 --- /dev/null +++ b/tests/Messaging/Adapter/Push/OneSignalTest.php @@ -0,0 +1,23 @@ +adapter = new OneSignalAdapter($appId, $apiKey); + } + + protected function getTo(): array + { + return [\getenv('ONESIGNAL_TO')]; + } +} From 6f22bdaae26223a6476918fb23cd5cf931d19dcf Mon Sep 17 00:00:00 2001 From: deepshekhardas Date: Fri, 19 Jun 2026 08:07:03 +0530 Subject: [PATCH 2/2] fix: add parent constructor, fix delivery counting, map remaining Push fields (icon, color, tag, contentAvailable, priority) --- .../Messaging/Adapter/Push/OneSignal.php | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Utopia/Messaging/Adapter/Push/OneSignal.php b/src/Utopia/Messaging/Adapter/Push/OneSignal.php index 3f539772..2b4330d0 100644 --- a/src/Utopia/Messaging/Adapter/Push/OneSignal.php +++ b/src/Utopia/Messaging/Adapter/Push/OneSignal.php @@ -4,6 +4,7 @@ use Utopia\Messaging\Adapter\Push as PushAdapter; use Utopia\Messaging\Messages\Push as PushMessage; +use Utopia\Messaging\Priority; use Utopia\Messaging\Response; class OneSignal extends PushAdapter @@ -18,6 +19,7 @@ public function __construct( private string $appId, private string $apiKey, ) { + parent::__construct(); } /** @@ -62,6 +64,15 @@ protected function process(PushMessage $message): array $payload['big_picture'] = $message->getImage(); $payload['ios_attachments'] = ['id' => $message->getImage()]; } + if (!\is_null($message->getIcon())) { + $payload['small_icon'] = $message->getIcon(); + } + if (!\is_null($message->getColor())) { + $payload['android_accent_color'] = $message->getColor(); + } + if (!\is_null($message->getTag())) { + $payload['android_group'] = $message->getTag(); + } if (!\is_null($message->getSound())) { $payload['android_sound'] = $message->getSound(); $payload['ios_sound'] = $message->getSound() . '.wav'; @@ -70,6 +81,15 @@ protected function process(PushMessage $message): array $payload['ios_badgeType'] = 'SetTo'; $payload['ios_badgeCount'] = $message->getBadge(); } + if (!\is_null($message->getContentAvailable())) { + $payload['content_available'] = true; + } + if (!\is_null($message->getPriority())) { + $payload['priority'] = match ($message->getPriority()) { + Priority::HIGH => 10, + Priority::NORMAL => 5, + }; + } $results = $this->request( method: 'POST', @@ -84,7 +104,7 @@ protected function process(PushMessage $message): array $response = new Response($this->getType()); if ($results['statusCode'] >= 200 && $results['statusCode'] < 300) { - $response->incrementDeliveredTo(\count($message->getTo())); + $response->setDeliveredTo(\count($message->getTo())); foreach ($message->getTo() as $to) { $response->addResult($to); }