169 lines
5.4 KiB
PHP
Executable File
169 lines
5.4 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Mautic\NotificationBundle\Api;
|
|
|
|
use Mautic\NotificationBundle\Entity\Notification;
|
|
use Mautic\NotificationBundle\Exception\MissingApiKeyException;
|
|
use Mautic\NotificationBundle\Exception\MissingAppIDException;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
|
|
class OneSignalApi extends AbstractNotificationApi
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $apiUrlBase = 'https://onesignal.com/api/v1';
|
|
|
|
/**
|
|
* @throws MissingAppIDException
|
|
* @throws MissingApiKeyException
|
|
*/
|
|
public function send(string $endpoint, array $data): ResponseInterface
|
|
{
|
|
$apiKeys = $this->integrationHelper->getIntegrationObject('OneSignal')->getKeys();
|
|
$appId = $apiKeys['app_id'];
|
|
$restApiKey = $apiKeys['rest_api_key'];
|
|
|
|
if (!$restApiKey) {
|
|
throw new MissingApiKeyException();
|
|
}
|
|
|
|
if (!array_key_exists('app_id', $data)) {
|
|
if (!$appId) {
|
|
throw new MissingAppIDException();
|
|
}
|
|
|
|
$data['app_id'] = $appId;
|
|
}
|
|
|
|
return $this->http->post(
|
|
$this->apiUrlBase.$endpoint,
|
|
[
|
|
\GuzzleHttp\RequestOptions::HEADERS => [
|
|
'Authorization' => 'Basic '.$restApiKey,
|
|
'Content-Type' => 'application/json',
|
|
],
|
|
\GuzzleHttp\RequestOptions::JSON => $data,
|
|
\GuzzleHttp\RequestOptions::HTTP_ERRORS => false,
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param string|array $playerId Player ID as string, or an array of player ID's
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
public function sendNotification($playerId, Notification $notification): ResponseInterface
|
|
{
|
|
$data = [];
|
|
|
|
$buttonId = $notification->getHeading();
|
|
$title = $notification->getHeading();
|
|
$url = $notification->getUrl();
|
|
$button = $notification->getButton();
|
|
$message = $notification->getMessage();
|
|
|
|
if (!is_array($playerId)) {
|
|
$playerId = [$playerId];
|
|
}
|
|
|
|
$data['include_player_ids'] = $playerId;
|
|
|
|
if (!is_array($message)) {
|
|
$message = ['en' => $message];
|
|
}
|
|
|
|
$data['contents'] = $message;
|
|
|
|
if (!empty($title)) {
|
|
if (!is_array($title)) {
|
|
$title = ['en' => $title];
|
|
}
|
|
}
|
|
|
|
$data['headings'] = $title;
|
|
|
|
if ($url) {
|
|
$data['url'] = $url;
|
|
}
|
|
|
|
if ($notification->isMobile()) {
|
|
$this->addMobileData($data, $notification->getMobileSettings());
|
|
|
|
if ($button) {
|
|
$data['buttons'][] = ['id' => $buttonId, 'text' => $button];
|
|
}
|
|
} else {
|
|
if ($button && $url) {
|
|
$data['web_buttons'][] = ['id' => $buttonId, 'text' => $button, 'url' => $url];
|
|
}
|
|
}
|
|
|
|
return $this->send('/notifications', $data);
|
|
}
|
|
|
|
protected function addMobileData(array &$data, array $mobileConfig)
|
|
{
|
|
foreach ($mobileConfig as $key => $value) {
|
|
switch ($key) {
|
|
case 'ios_subtitle':
|
|
$data['subtitle'] = ['en' => $value];
|
|
break;
|
|
case 'ios_sound':
|
|
$data['ios_sound'] = $value ?: 'default';
|
|
break;
|
|
case 'ios_badges':
|
|
$data['ios_badgeType'] = $value;
|
|
break;
|
|
case 'ios_badgeCount':
|
|
$data['ios_badgeCount'] = (int) $value;
|
|
break;
|
|
case 'ios_contentAvailable':
|
|
$data['content_available'] = (bool) $value;
|
|
break;
|
|
case 'ios_media':
|
|
$data['ios_attachments'] = [uniqid('id_') => $value];
|
|
break;
|
|
case 'ios_mutableContent':
|
|
$data['mutable_content'] = (bool) $value;
|
|
break;
|
|
case 'android_sound':
|
|
$data['android_sound'] = $value;
|
|
break;
|
|
case 'android_small_icon':
|
|
$data['small_icon'] = $value;
|
|
break;
|
|
case 'android_large_icon':
|
|
$data['large_icon'] = $value;
|
|
break;
|
|
case 'android_big_picture':
|
|
$data['big_picture'] = $value;
|
|
break;
|
|
case 'android_led_color':
|
|
$data['android_led_color'] = 'FF'.strtoupper($value);
|
|
break;
|
|
case 'android_accent_color':
|
|
$data['android_accent_color'] = 'FF'.strtoupper($value);
|
|
break;
|
|
case 'android_group_key':
|
|
$data['android_group'] = $value;
|
|
break;
|
|
case 'android_lockscreen_visibility':
|
|
$data['android_visibility'] = (int) $value;
|
|
break;
|
|
case 'additional_data':
|
|
// Transforms values received from SortableListType into values acceptable by OneSignal.
|
|
if (count($value['list']) > 0) {
|
|
$result = [];
|
|
foreach ($value['list'] as $item) {
|
|
$result[$item['label']] = $item['value'];
|
|
}
|
|
$data['data'] = $result;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|