-
Notifications
You must be signed in to change notification settings - Fork 20
/
FCMClient.php
148 lines (130 loc) · 4.17 KB
/
FCMClient.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
/*
* This file is part of the FCMBundle.
*
* (c) Redjan Ymeraj <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace RedjanYm\FCMBundle;
use RedjanYm\FCMBundle\Entity\DeviceNotification;
use RedjanYm\FCMBundle\Entity\TopicNotification;
use sngrl\PhpFirebaseCloudMessaging\ClientInterface;
use sngrl\PhpFirebaseCloudMessaging\Message;
use sngrl\PhpFirebaseCloudMessaging\Recipient\Device;
use sngrl\PhpFirebaseCloudMessaging\Recipient\Topic;
/**
* The FCMBundle primary class.
*
* @author Redjan Ymeraj <[email protected]>
*/
class FCMClient
{
/**
* @var ClientInterface
*/
private $client;
/**
* FCMClient constructor.
*
* @param ClientInterface $client
*/
public function __construct(ClientInterface $client)
{
$this->client = $client;
}
/**
* Create a notification of type Device Notification
*
* @param null $title
* @param null $body
* @param null | array $token
* @return DeviceNotification
*/
public function createDeviceNotification($title = null, $body = null, $token = array())
{
$notification = new DeviceNotification();
$notification
->setTitle($title)
->setBody($body);
if(is_array($token)){
$notification->setDeviceTokens($token);
} else {
$notification->addDeviceToken($token);
}
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 \Psr\Http\Message\ResponseInterface
*/
public function sendNotification($notification)
{
if (!$notification instanceof DeviceNotification && !$notification instanceof TopicNotification) {
throw new \InvalidArgumentException('Notification must be of type DeviceNotification or TopicNotification');
}
$message = (new Message())
->setNotification($notification)
->setData($notification->getData())
->setPriority($notification->getPriority())
->setJsonData($notification->getJsonData())
->setContentAvailable($notification->getContentAvailable())
->setCollapseKey($notification->getCollapseKey());
// Check for the type of Notification
if($notification instanceof DeviceNotification){
foreach ($notification->getDeviceTokens() as $deviceToken) {
$message->addRecipient(new Device($deviceToken));
}
} else if ($notification instanceof TopicNotification) {
$message->addRecipient(new Topic($notification->getTopic()));
}
return $this->client->send($message);
}
}