diff --git a/Entity/DeviceNotification.php b/Entity/DeviceNotification.php index c28c875..9048bfc 100644 --- a/Entity/DeviceNotification.php +++ b/Entity/DeviceNotification.php @@ -2,8 +2,6 @@ namespace RedjanYm\FCMBundle\Entity; -use Symfony\Component\Console\Exception\InvalidArgumentException; - class DeviceNotification extends Notification implements \RedjanYm\FCMBundle\Model\DeviceNotification { private $deviceToken; @@ -30,7 +28,7 @@ public function getDeviceToken() if ($this->deviceToken) { return $this->deviceToken; } else { - throw new InvalidArgumentException('The Mobile Notification must have a Device Token!'); + throw new \InvalidArgumentException('The Mobile Notification must have a Device Token!'); } } } diff --git a/Entity/TopicNotification.php b/Entity/TopicNotification.php new file mode 100644 index 0000000..8226579 --- /dev/null +++ b/Entity/TopicNotification.php @@ -0,0 +1,31 @@ +topic = $topic; + + return $this; + } + + /** + * @inheritdoc + */ + public function getTopic() + { + if($this->topic){ + return $this->topic; + } else { + throw new \InvalidArgumentException('The Topic Notification must have a Topic!'); + } + } +} \ No newline at end of file diff --git a/FCMClient.php b/FCMClient.php index 5e23b74..bbe3365 100644 --- a/FCMClient.php +++ b/FCMClient.php @@ -17,7 +17,7 @@ use sngrl\PhpFirebaseCloudMessaging\Message; use sngrl\PhpFirebaseCloudMessaging\Notification; use sngrl\PhpFirebaseCloudMessaging\Recipient\Device; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use sngrl\PhpFirebaseCloudMessaging\Recipient\Topic; /** * The FCMBundle primary class. @@ -38,9 +38,18 @@ class FCMClient */ public function __construct(Client $client) { + $client->injectGuzzleHttpClient(new \GuzzleHttp\Client()); $this->client = $client; } + /** + * Create a notification of type Device Notification + * + * @param null $title + * @param null $body + * @param null $token + * @return DeviceNotification + */ public function createDeviceNotification($title = null, $body = null, $token = null) { $notification = new DeviceNotification(); @@ -52,22 +61,77 @@ public function createDeviceNotification($title = null, $body = null, $token = n return $notification; } + /** + * Create a notification of type Topic + * + * @param null $title + * @param null $body + * @param null $topic + * @return TopicNotification + */ + public function createTopicNotification($title = null, $body = null, $topic = null) + { + $notification = new TopicNotification(); + $notification + ->setTitle($title) + ->setBody($body) + ->setTopic($topic); + + return $notification; + } + + /** + * Subscribe devices to a Topic + * + * @param null $topicId + * @param array $deviceTokens + * @return \Psr\Http\Message\ResponseInterface + */ + public function subscribeDevicesToTopic($topicId = null, $deviceTokens = array()) + { + if(!$topicId || empty($deviceTokens)){ + throw new \InvalidArgumentException("Please check arguments!"); + } + + return $this->client->addTopicSubscription($topicId, $deviceTokens); + } + + /** + * Remove devices from a Topic + * + * @param null $topicId + * @param array $deviceTokens + * @return \Psr\Http\Message\ResponseInterface + */ + public function removeDevicesFromTopic($topicId = null, $deviceTokens = array()) + { + if(!$topicId || empty($deviceTokens)){ + throw new \InvalidArgumentException("Please check arguments!"); + } + + return $this->client->removeTopicSubscription($topicId, $deviceTokens); + } + /** * @param DeviceNotification | TopicNotification $notification * - * @return Client + * @return \Psr\Http\Message\ResponseInterface */ public function sendNotification($notification) { - if (!$notification instanceof DeviceNotification) { - throw new NotFoundHttpException('Notification must be of type DeviceNotification'); + if (!$notification instanceof DeviceNotification && !$notification instanceof TopicNotification) { + throw new \InvalidArgumentException('Notification must be of type DeviceNotification or TopicNotification'); } - $this->client->injectGuzzleHttpClient(new \GuzzleHttp\Client()); $message = new Message(); $message->setPriority($notification->getPriority()); - $message->addRecipient(new Device($notification->getDeviceToken())); + // Check for the type of Notification + if($notification instanceof DeviceNotification){ + $message->addRecipient(new Device($notification->getDeviceToken())); + } else if ($notification instanceof TopicNotification) { + $message->addRecipient(new Topic($notification->getTopic())); + } $message ->setNotification( diff --git a/Model/TopicNotification.php b/Model/TopicNotification.php new file mode 100644 index 0000000..c6da328 --- /dev/null +++ b/Model/TopicNotification.php @@ -0,0 +1,18 @@ +getContainer()->get('redjan_ym_fcm.client'); -``` - -* Create a Notification. For now FCMBundle supports only Device Notifications. Topic Notifications will be added in the future versions. - -``` -$notification = $fcmClient->createDeviceNotification( - 'Title of Notification', - 'Body of Notification', - 'Firebase Token of the device who will recive the notification' - ); -``` -In case you need to send extra data or set other notification properties the Notification Entity supports a set of setters and getters like: -``` - $notification->setData($array); and $notification->getData(); - - $notification->setPriority('high'); // Excepts 2 priorities, high(default) and low - - $notification->setIcon('name of icon located in the native mobile app'); -``` - -You could also modify the arguments passed in the `createDeviceNotification` method. -``` - $notifiaction->setTitle('string'); - $notifiaction->setBody('text'); - $notifiaction->setDeviceToken('string'); -``` - -**The only required field is the Device Token** - -* Send notification -``` -$fcmClient->sendNotification($notification); -``` - -The request of sending the notification is a HTTP Synchronous Request. - -> The Asynchronous requests will be implemented in the next version! - - ----------- - - -> This Bundle is a wrapper for this [Firebase Cloud Messaging](https://github.com/sngrl/php-firebase-cloud-messaging) php library - ------------ -**License** -FCMBundle is licensed under the MIT license \ No newline at end of file +For more detailed information about **Instalation** and **Usage** please go to bundle's [Wiki](https://github.com/redjanym/FCMBundle/wiki) diff --git a/Resources/README.md b/Resources/README.md deleted file mode 100755 index 010394c..0000000 --- a/Resources/README.md +++ /dev/null @@ -1,97 +0,0 @@ -Installation -============ - -Step 1: Download the Bundle ---------------------------- - -Execute the following command to download the latest stable version of this bundle: - -```bash -$ composer require RedjanYm/fcm-bundle "^1.0" -``` - -This command requires you to have Composer installed globally, as explained in the [installation chapter](https://getcomposer.org/doc/00-intro.md) of the Composer documentation. - -Step 2: Enable the Bundle -------------------------- - -Then, enable the bundle by adding it to the list of registered bundles in the `app/AppKernel.php` file of your project: - -```php -getContainer()->get('redjan_ym_fcm.client'); -``` - -* Create a Notification -For now FCMBundle supports only Device Notifications. Topic Notifications will be added in the future versions. - -``` -$notification = $fcmClient->createDeviceNotification( - 'Title of Notification', - 'Body of Notification', - 'Firebase Token of the device who will recive the notification' - ); -``` -In case you need to send extra data or set other notification properties the Notification Entity suports a set of setters and getters like: -``` - $notification->setData($array); and $notification->getData(); - - $notification->setPriority('high'); // Exepts 2 priorities, high(default) and low - - $notification->setIcon('name of icon located in the native mobile app'); -``` - -And also modify use setters and getters for the arguments passed in the `createDeviceNotification` method. -``` - $notifiaction->setTitle('string'); - $notifiaction->setBody('text'); - $notifiaction->setDeviceToken('string'); -``` - -**The only required field is the Device Token** - -* Send notification -``` -$fcmClient->sendNotification($notification); -``` - -The request of sending the notification is a Synchronous Request. - -**The Asynchronous requests will be implemented in the next version!** \ No newline at end of file