Skip to content

Commit 7624e2c

Browse files
committed
feat: added new MMS types
1 parent 6287ab4 commit 7624e2c

File tree

6 files changed

+285
-0
lines changed

6 files changed

+285
-0
lines changed

src/Messages/Channel/BaseMessage.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ abstract class BaseMessage implements Message
2727
public const MESSAGES_SUBTYPE_TEMPLATE = 'template';
2828
public const MESSAGES_SUBTYPE_STICKER = 'sticker';
2929
public const MESSAGES_SUBTYPE_CUSTOM = 'custom';
30+
public const MESSAGES_SUBTYPE_CONTENT = 'content';
3031

3132
public function getClientRef(): ?string
3233
{
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace Vonage\Messages\Channel\MMS;
4+
5+
use Vonage\Messages\MessageObjects\ContentObject;
6+
use Vonage\Messages\Channel\BaseMessage;
7+
use Vonage\Messages\MessageTraits\TtlTrait;
8+
9+
class MMSContent extends BaseMessage
10+
{
11+
use TtlTrait;
12+
13+
protected string $channel = 'mms';
14+
protected string $subType = BaseMessage::MESSAGES_SUBTYPE_CONTENT;
15+
protected bool $validatesE164 = true;
16+
17+
public function __construct(
18+
string $to,
19+
string $from,
20+
protected ContentObject $content,
21+
) {
22+
$this->to = $to;
23+
$this->from = $from;
24+
}
25+
26+
public function validatesE164(): bool
27+
{
28+
return $this->validatesE164;
29+
}
30+
31+
public function toArray(): array
32+
{
33+
$returnArray = $this->getBaseMessageUniversalOutputArray();
34+
$returnArray['content'] = $this->content->toArray();
35+
36+
if (!is_null($this->ttl)) {
37+
$returnArray['ttl'] = $this->ttl;
38+
}
39+
40+
return $returnArray;
41+
}
42+
}

src/Messages/Channel/MMS/MMSFile.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace Vonage\Messages\Channel\MMS;
4+
5+
use Vonage\Messages\MessageObjects\FileObject;
6+
use Vonage\Messages\Channel\BaseMessage;
7+
use Vonage\Messages\MessageTraits\TtlTrait;
8+
9+
class MMSFile extends BaseMessage
10+
{
11+
use TtlTrait;
12+
13+
protected string $channel = 'mms';
14+
protected string $subType = BaseMessage::MESSAGES_SUBTYPE_FILE;
15+
protected bool $validatesE164 = true;
16+
17+
public function __construct(
18+
string $to,
19+
string $from,
20+
protected FileObject $file
21+
) {
22+
$this->to = $to;
23+
$this->from = $from;
24+
}
25+
26+
public function validatesE164(): bool
27+
{
28+
return $this->validatesE164;
29+
}
30+
31+
public function toArray(): array
32+
{
33+
$returnArray = $this->getBaseMessageUniversalOutputArray();
34+
$returnArray['file'] = $this->file->toArray();
35+
36+
if (!is_null($this->ttl)) {
37+
$returnArray['ttl'] = $this->ttl;
38+
}
39+
40+
return $returnArray;
41+
}
42+
}

src/Messages/Channel/MMS/MMSText.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Vonage\Messages\Channel\MMS;
4+
5+
use Vonage\Messages\Channel\BaseMessage;
6+
use Vonage\Messages\MessageTraits\TtlTrait;
7+
8+
class MMSText extends BaseMessage
9+
{
10+
use TtlTrait;
11+
12+
protected string $channel = 'mms';
13+
protected string $subType = BaseMessage::MESSAGES_SUBTYPE_TEXT;
14+
protected bool $validatesE164 = true;
15+
protected string $text;
16+
17+
public function __construct(
18+
string $to,
19+
string $from,
20+
string $text,
21+
) {
22+
$this->to = $to;
23+
$this->from = $from;
24+
$this->text = $text;
25+
}
26+
27+
public function validatesE164(): bool
28+
{
29+
return $this->validatesE164;
30+
}
31+
32+
public function toArray(): array
33+
{
34+
$returnArray = $this->getBaseMessageUniversalOutputArray();
35+
$returnArray['text'] = $this->text;
36+
37+
if (!is_null($this->ttl)) {
38+
$returnArray['ttl'] = $this->ttl;
39+
}
40+
41+
return $returnArray;
42+
}
43+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
3+
namespace Vonage\Messages\MessageObjects;
4+
5+
use Vonage\Entity\Hydrator\ArrayHydrateInterface;
6+
7+
class ContentObject implements ArrayHydrateInterface
8+
{
9+
public const TYPE_IMAGE = 'image';
10+
public const TYPE_AUDIO = 'audio';
11+
public const TYPE_VIDEO = 'video';
12+
public const TYPE_VCARD = 'vcard';
13+
public const TYPE_FILE = 'file';
14+
15+
public function __construct(
16+
private string $url,
17+
private string $caption = '',
18+
private string $type = self::TYPE_IMAGE
19+
| self::TYPE_AUDIO
20+
| self::TYPE_VIDEO
21+
| self:: TYPE_VCARD
22+
| self::TYPE_FILE,
23+
) {
24+
}
25+
26+
public function fromArray(array $data): ContentObject
27+
{
28+
$this->url = $data['url'];
29+
$this->type = $data['type'];
30+
31+
if (isset($data['caption'])) {
32+
$this->caption = $data['caption'];
33+
}
34+
35+
return $this;
36+
}
37+
38+
public function toArray(): array
39+
{
40+
$returnArray = [
41+
'url' => $this->url,
42+
'type' => $this->type,
43+
];
44+
45+
if ($this->getCaption()) {
46+
$returnArray['caption'] = $this->getCaption();
47+
}
48+
49+
return $returnArray;
50+
}
51+
52+
public function getUrl(): string
53+
{
54+
return $this->url;
55+
}
56+
57+
public function getCaption(): string
58+
{
59+
return $this->caption;
60+
}
61+
62+
public function getType(): string
63+
{
64+
return $this->type;
65+
}
66+
}

test/Messages/ClientTest.php

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@
1010
use Vonage\Client;
1111
use Vonage\Client\APIResource;
1212
use Vonage\Messages\Channel\BaseMessage;
13+
use Vonage\Messages\Channel\MMS\MMSContent;
14+
use Vonage\Messages\Channel\MMS\MMSText;
1315
use Vonage\Messages\Channel\Messenger\MessengerAudio;
1416
use Vonage\Messages\Channel\Messenger\MessengerFile;
1517
use Vonage\Messages\Channel\Messenger\MessengerImage;
1618
use Vonage\Messages\Channel\Messenger\MessengerText;
1719
use Vonage\Messages\Channel\Messenger\MessengerVideo;
1820
use Vonage\Messages\Channel\MMS\MMSAudio;
21+
use Vonage\Messages\Channel\MMS\MMSFile;
1922
use Vonage\Messages\Channel\MMS\MMSImage;
2023
use Vonage\Messages\Channel\MMS\MMSvCard;
2124
use Vonage\Messages\Channel\MMS\MMSVideo;
@@ -42,6 +45,7 @@
4245
use Vonage\Messages\Client as MessagesClient;
4346
use Vonage\Messages\ExceptionErrorHandler;
4447
use Vonage\Messages\MessageObjects\AudioObject;
48+
use Vonage\Messages\MessageObjects\ContentObject;
4549
use Vonage\Messages\MessageObjects\FileObject;
4650
use Vonage\Messages\MessageObjects\ImageObject;
4751
use Vonage\Messages\MessageObjects\TemplateObject;
@@ -198,6 +202,93 @@ public function testCanSendSMSWtihFailover(): void
198202
$this->assertArrayHasKey('message_uuid', $result);
199203
}
200204

205+
public function testCanSendMMSContent(): void
206+
{
207+
$contentUrl = 'https://picsum.photos/200/300';
208+
$mmsContentObject = new ContentObject($contentUrl, 'Picture of a skateboarder', ContentObject::TYPE_IMAGE);
209+
210+
$payload = [
211+
'to' => '447700900000',
212+
'from' => '16105551212',
213+
'content' => $mmsContentObject
214+
];
215+
216+
$message = new MMSContent($payload['to'], $payload['from'], $mmsContentObject);
217+
$message->setTtl(400);
218+
219+
$this->vonageClient->send(Argument::that(function (Request $request) use ($payload) {
220+
$this->assertRequestJsonBodyContains('to', $payload['to'], $request);
221+
$this->assertRequestJsonBodyContains('from', $payload['from'], $request);
222+
$this->assertRequestJsonBodyContains('content', $payload['content']->toArray(), $request);
223+
$this->assertRequestJsonBodyContains('channel', 'mms', $request);
224+
$this->assertRequestJsonBodyContains('message_type', 'content', $request);
225+
$this->assertRequestJsonBodyContains('ttl', 400, $request);
226+
$this->assertEquals('POST', $request->getMethod());
227+
228+
return true;
229+
}))->willReturn($this->getResponse('sms-success', 202));
230+
$result = $this->messageClient->send($message);
231+
$this->assertIsArray($result);
232+
$this->assertArrayHasKey('message_uuid', $result);
233+
}
234+
235+
public function testCanSendMMSText(): void
236+
{
237+
$payload = [
238+
'to' => '447700900000',
239+
'from' => '16105551212',
240+
'text' => 'my cool message'
241+
];
242+
243+
$message = new MMSText($payload['to'], $payload['from'], $payload['text']);
244+
$message->setTtl(400);
245+
246+
$this->vonageClient->send(Argument::that(function (Request $request) use ($payload) {
247+
$this->assertRequestJsonBodyContains('to', $payload['to'], $request);
248+
$this->assertRequestJsonBodyContains('from', $payload['from'], $request);
249+
$this->assertRequestJsonBodyContains('text', $payload['text'], $request);
250+
$this->assertRequestJsonBodyContains('channel', 'mms', $request);
251+
$this->assertRequestJsonBodyContains('message_type', 'text', $request);
252+
$this->assertRequestJsonBodyContains('ttl', 400, $request);
253+
$this->assertEquals('POST', $request->getMethod());
254+
255+
return true;
256+
}))->willReturn($this->getResponse('sms-success', 202));
257+
$result = $this->messageClient->send($message);
258+
$this->assertIsArray($result);
259+
$this->assertArrayHasKey('message_uuid', $result);
260+
}
261+
262+
public function testCanSendMMSFile(): void
263+
{
264+
$fileUrl = 'https://picsum.photos/200/300';
265+
$mmsFileObject = new FileObject($fileUrl, 'Picture of a skateboarder');
266+
267+
$payload = [
268+
'to' => '447700900000',
269+
'from' => '16105551212',
270+
'file' => $mmsFileObject
271+
];
272+
273+
$message = new MMSFile($payload['to'], $payload['from'], $mmsFileObject);
274+
$message->setTtl(400);
275+
276+
$this->vonageClient->send(Argument::that(function (Request $request) use ($payload) {
277+
$this->assertRequestJsonBodyContains('to', $payload['to'], $request);
278+
$this->assertRequestJsonBodyContains('from', $payload['from'], $request);
279+
$this->assertRequestJsonBodyContains('file', $payload['file']->toArray(), $request);
280+
$this->assertRequestJsonBodyContains('channel', 'mms', $request);
281+
$this->assertRequestJsonBodyContains('message_type', 'file', $request);
282+
$this->assertRequestJsonBodyContains('ttl', 400, $request);
283+
$this->assertEquals('POST', $request->getMethod());
284+
285+
return true;
286+
}))->willReturn($this->getResponse('sms-success', 202));
287+
$result = $this->messageClient->send($message);
288+
$this->assertIsArray($result);
289+
$this->assertArrayHasKey('message_uuid', $result);
290+
}
291+
201292
public function testCanSendMMSImage(): void
202293
{
203294
$imageUrl = 'https://picsum.photos/200/300';

0 commit comments

Comments
 (0)