Skip to content

Commit 72b6e4d

Browse files
authored
Add webhook definitions in EventRequestParser (#556)
This change allows SDK user to use 6 webhook events defined in https://github.com/line/line-openapi/blob/988429c5737e464bb891b949a874d5f389476681/webhook.yml#L111-L116 by modifying `EventRequestParser`.
1 parent 69c7c85 commit 72b6e4d

File tree

2 files changed

+226
-2
lines changed

2 files changed

+226
-2
lines changed

src/parser/lib/EventRequestParser.php

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
use LINE\Webhook\Model\Mention;
3434
use LINE\Webhook\Model\Mentionee;
3535
use LINE\Webhook\Model\MessageContent;
36+
use LINE\Webhook\Model\ModuleContent;
37+
use LINE\Webhook\Model\ModuleEvent;
3638
use LINE\Webhook\Model\ScenarioResult;
3739
use LINE\Webhook\Model\ScenarioResultThingsContent;
3840
use LINE\Webhook\Model\Source;
@@ -60,6 +62,12 @@ class EventRequestParser
6062
'memberJoined' => \LINE\Webhook\Model\MemberJoinedEvent::class,
6163
'memberLeft' => \LINE\Webhook\Model\MemberLeftEvent::class,
6264
'things' => \LINE\Webhook\Model\ThingsEvent::class,
65+
'module' => \LINE\Webhook\Model\ModuleEvent::class,
66+
'activated' => \LINE\Webhook\Model\ActivatedEvent::class,
67+
'deactivated' => \LINE\Webhook\Model\DeactivatedEvent::class,
68+
'botSuspended' => \LINE\Webhook\Model\BotSuspendedEvent::class,
69+
'botResumed' => \LINE\Webhook\Model\BotResumedEvent::class,
70+
'delivery' => \LINE\Webhook\Model\PnpDeliveryCompletionEvent::class,
6371
];
6472

6573
private static $messageType2class = [
@@ -92,6 +100,13 @@ class EventRequestParser
92100
'left' => \LINE\Webhook\Model\LeftMembers::class,
93101
'unsend' => \LINE\Webhook\Model\UnsendDetail::class,
94102
'videoPlayComplete' => \LINE\Webhook\Model\VideoPlayComplete::class,
103+
'chatControl' => \LINE\Webhook\Model\ChatControl::class,
104+
'delivery' => \LINE\Webhook\Model\PnpDelivery::class,
105+
];
106+
107+
private static $moduleContentType2class = [
108+
'attached' => \LINE\Webhook\Model\AttachedModuleContent::class,
109+
'detached' => \LINE\Webhook\Model\DetachedModuleContent::class,
95110
];
96111

97112
/**
@@ -141,6 +156,11 @@ private static function parseEvent($eventData): Event
141156
$event->setThings($content);
142157
}
143158

159+
if ($event instanceof ModuleEvent) {
160+
$content = self::parseModuleContent($eventData);
161+
$event->setModule($content);
162+
}
163+
144164
foreach (array_keys($eventData) as $key) {
145165
$contentClass = self::$contentType2class[$key] ?? null;
146166
if (!isset($contentClass)) {
@@ -214,6 +234,9 @@ private static function parseMessageContent($eventData): MessageContent
214234
*/
215235
private static function parseSource($eventData): Source
216236
{
237+
if (!isset($eventData['source'])) {
238+
return new Source([]);
239+
}
217240
$sourceType = $eventData['source']['type'];
218241
if (!isset(self::$sourceType2class[$sourceType])) {
219242
return new Source($eventData['source']);
@@ -231,7 +254,7 @@ private static function parseThingsContent($eventData): ThingsContent
231254
{
232255
$thingsContentType = $eventData['things']['type'];
233256
if (!isset(self::$thingsContentType2class[$thingsContentType])) {
234-
return new ThingsContent($eventData['source']);
257+
return new ThingsContent($eventData['things']);
235258
}
236259

237260
$thingsContentClass = self::$thingsContentType2class[$thingsContentType];
@@ -247,4 +270,19 @@ private static function parseThingsContent($eventData): ThingsContent
247270
$content->setResult($result);
248271
return $content;
249272
}
273+
274+
/**
275+
* @param array $eventData
276+
* @return ModuleContent
277+
*/
278+
private static function parseModuleContent($eventData): ModuleContent
279+
{
280+
$moduleContentType = $eventData['module']['type'];
281+
282+
if (!isset(self::$moduleContentType2class[$moduleContentType])) {
283+
return new ModuleContent($eventData['module']);
284+
}
285+
$moduleContentClass = self::$moduleContentType2class[$moduleContentType];
286+
return new $moduleContentClass($eventData['module']);
287+
}
250288
}

src/parser/test/EventRequestParserTest.php

Lines changed: 187 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,97 @@ class EventRequestParserTest extends TestCase
840840
}
841841
]
842842
}
843+
},
844+
{
845+
"type": "activated",
846+
"timestamp": 12345678901234,
847+
"mode": "active",
848+
"source": {
849+
"type": "user",
850+
"userId": "userid"
851+
},
852+
"chatControl": {
853+
"expireAt": 1462629479860
854+
},
855+
"webhookEventId": "testwebhookeventid",
856+
"deliveryContext": {
857+
"isRedelivery": false
858+
}
859+
},
860+
{
861+
"type": "deactivated",
862+
"timestamp": 12345678901234,
863+
"mode": "active",
864+
"source": {
865+
"type": "user",
866+
"userId": "userid"
867+
},
868+
"webhookEventId": "testwebhookeventid",
869+
"deliveryContext": {
870+
"isRedelivery": false
871+
}
872+
},
873+
{
874+
"type": "botSuspended",
875+
"timestamp": 12345678901234,
876+
"mode": "active",
877+
"webhookEventId": "testwebhookeventid",
878+
"deliveryContext": {
879+
"isRedelivery": false
880+
}
881+
},
882+
{
883+
"type": "botResumed",
884+
"timestamp": 12345678901234,
885+
"mode": "active",
886+
"webhookEventId": "testwebhookeventid",
887+
"deliveryContext": {
888+
"isRedelivery": false
889+
}
890+
},
891+
{
892+
"type": "delivery",
893+
"timestamp": 12345678901234,
894+
"mode": "active",
895+
"source": {
896+
"type": "user",
897+
"userId": "userid"
898+
},
899+
"delivery": {
900+
"data": "deliverydata"
901+
},
902+
"webhookEventId": "testwebhookeventid",
903+
"deliveryContext": {
904+
"isRedelivery": false
905+
}
906+
},
907+
{
908+
"type": "module",
909+
"timestamp": 12345678901234,
910+
"mode": "active",
911+
"module": {
912+
"type": "attached",
913+
"botId": "botid",
914+
"scopes": ["a", "b"]
915+
},
916+
"webhookEventId": "testwebhookeventid",
917+
"deliveryContext": {
918+
"isRedelivery": false
919+
}
920+
},
921+
{
922+
"type": "module",
923+
"timestamp": 12345678901234,
924+
"mode": "active",
925+
"module": {
926+
"type": "detached",
927+
"botId": "botid",
928+
"reason": "bot deleted"
929+
},
930+
"webhookEventId": "testwebhookeventid",
931+
"deliveryContext": {
932+
"isRedelivery": false
933+
}
843934
}
844935
]
845936
}
@@ -862,7 +953,7 @@ public function testParseEventRequest()
862953
$this->assertEquals($parsedEvents->getDestination(), 'U0123456789abcdef0123456789abcd');
863954

864955
$events = $parsedEvents->getEvents();
865-
$this->assertEquals(count($events), 39);
956+
$this->assertEquals(count($events), 46);
866957

867958
{
868959
// text
@@ -1512,6 +1603,101 @@ public function testParseEventRequest()
15121603
$this->assertEquals('5ac1bfd5040ab15980c9b435', $emojiInfo->getProductId());
15131604
$this->assertEquals('001', $emojiInfo->getEmojiId());
15141605
}
1606+
1607+
{
1608+
// activated
1609+
$event = $events[39];
1610+
$source = $event->getSource();
1611+
$this->assertEquals(12345678901234, $event->getTimestamp());
1612+
$this->assertEquals('active', $event->getMode());
1613+
$this->assertTrue($source instanceof UserSource);
1614+
$this->assertEquals('userid', $source->getUserId());
1615+
$this->assertInstanceOf(\LINE\Webhook\Model\ActivatedEvent::class, $event);
1616+
$this->assertInstanceOf(\LINE\Webhook\Model\ChatControl::class, $event->getChatControl());
1617+
$this->assertEquals(1462629479860, $event->getChatControl()->getExpireAt());
1618+
$this->assertEquals('testwebhookeventid', $event->getWebhookEventId());
1619+
$this->assertFalse($event->getDeliveryContext()->getIsRedelivery());
1620+
}
1621+
1622+
{
1623+
// deactivated
1624+
$event = $events[40];
1625+
$source = $event->getSource();
1626+
$this->assertEquals(12345678901234, $event->getTimestamp());
1627+
$this->assertEquals('active', $event->getMode());
1628+
$this->assertTrue($source instanceof UserSource);
1629+
$this->assertEquals('userid', $source->getUserId());
1630+
$this->assertInstanceOf(\LINE\Webhook\Model\DeactivatedEvent::class, $event);
1631+
$this->assertEquals('testwebhookeventid', $event->getWebhookEventId());
1632+
$this->assertFalse($event->getDeliveryContext()->getIsRedelivery());
1633+
}
1634+
1635+
{
1636+
// botSuspended
1637+
$event = $events[41];
1638+
$this->assertEquals(12345678901234, $event->getTimestamp());
1639+
$this->assertEquals('active', $event->getMode());
1640+
$this->assertInstanceOf(\LINE\Webhook\Model\BotSuspendedEvent::class, $event);
1641+
$this->assertEquals('testwebhookeventid', $event->getWebhookEventId());
1642+
$this->assertFalse($event->getDeliveryContext()->getIsRedelivery());
1643+
}
1644+
1645+
{
1646+
// botResumed
1647+
$event = $events[42];
1648+
$this->assertEquals(12345678901234, $event->getTimestamp());
1649+
$this->assertEquals('active', $event->getMode());
1650+
$this->assertInstanceOf(\LINE\Webhook\Model\BotResumedEvent::class, $event);
1651+
$this->assertEquals('testwebhookeventid', $event->getWebhookEventId());
1652+
$this->assertFalse($event->getDeliveryContext()->getIsRedelivery());
1653+
}
1654+
1655+
{
1656+
// delivery
1657+
$event = $events[43];
1658+
$source = $event->getSource();
1659+
$this->assertEquals(12345678901234, $event->getTimestamp());
1660+
$this->assertEquals('active', $event->getMode());
1661+
$this->assertTrue($source instanceof UserSource);
1662+
$this->assertEquals('userid', $source->getUserId());
1663+
$this->assertInstanceOf(\LINE\Webhook\Model\PnpDeliveryCompletionEvent::class, $event);
1664+
$this->assertInstanceOf(\LINE\Webhook\Model\PnpDelivery::class, $event->getDelivery());
1665+
$this->assertEquals('deliverydata', $event->getDelivery()->getData());
1666+
$this->assertEquals('testwebhookeventid', $event->getWebhookEventId());
1667+
$this->assertFalse($event->getDeliveryContext()->getIsRedelivery());
1668+
}
1669+
1670+
{
1671+
// module (attached)
1672+
$event = $events[44];
1673+
$this->assertEquals(12345678901234, $event->getTimestamp());
1674+
$this->assertEquals('active', $event->getMode());
1675+
$this->assertInstanceOf(\LINE\Webhook\Model\ModuleEvent::class, $event);
1676+
/** @var \LINE\Webhook\Model\AttachedModuleContent $module */
1677+
$module = $event->getModule();
1678+
1679+
$this->assertInstanceOf(\LINE\Webhook\Model\AttachedModuleContent::class, $module);
1680+
$this->assertEquals('botid', $module->getBotId());
1681+
$this->assertEquals('b', $module->getScopes()[1]);
1682+
$this->assertEquals('testwebhookeventid', $event->getWebhookEventId());
1683+
$this->assertFalse($event->getDeliveryContext()->getIsRedelivery());
1684+
}
1685+
1686+
{
1687+
// module (detached)
1688+
$event = $events[45];
1689+
$this->assertEquals(12345678901234, $event->getTimestamp());
1690+
$this->assertEquals('active', $event->getMode());
1691+
$this->assertInstanceOf(\LINE\Webhook\Model\ModuleEvent::class, $event);
1692+
/** @var \LINE\Webhook\Model\DetachedModuleContent $module */
1693+
$module = $event->getModule();
1694+
1695+
$this->assertInstanceOf(\LINE\Webhook\Model\DetachedModuleContent::class, $event->getModule());
1696+
$this->assertEquals('botid', $module->getBotId());
1697+
$this->assertEquals('bot deleted', $module->getReason());
1698+
$this->assertEquals('testwebhookeventid', $event->getWebhookEventId());
1699+
$this->assertFalse($event->getDeliveryContext()->getIsRedelivery());
1700+
}
15151701
}
15161702

15171703
private static function getSignature(string $secret): string

0 commit comments

Comments
 (0)