Skip to content

Commit

Permalink
Feature/verify custom templates (#502)
Browse files Browse the repository at this point in the history
* Custom template methods, list iterators pending

* Iterators completed

* Add the template ID in sms and voice
  • Loading branch information
SecondeJK authored Sep 19, 2024
1 parent f094c4a commit 4c10290
Show file tree
Hide file tree
Showing 21 changed files with 951 additions and 2 deletions.
110 changes: 110 additions & 0 deletions src/Verify2/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,15 @@
use Vonage\Client\APIResource;
use Vonage\Client\Exception\Exception;
use Vonage\Client\Exception\Request;
use Vonage\Entity\Hydrator\ArrayHydrator;
use Vonage\Entity\IterableAPICollection;
use Vonage\Verify2\Filters\TemplateFilter;
use Vonage\Verify2\Request\BaseVerifyRequest;
use Vonage\Verify2\Request\CreateCustomTemplateFragmentRequest;
use Vonage\Verify2\Request\SilentAuthRequest;
use Vonage\Verify2\Request\UpdateCustomTemplateRequest;
use Vonage\Verify2\VerifyObjects\Template;
use Vonage\Verify2\VerifyObjects\TemplateFragment;
use Vonage\Verify2\VerifyObjects\VerificationWorkflow;

class Client implements APIClient
Expand Down Expand Up @@ -74,4 +81,107 @@ public static function isSilentAuthRequest(BaseVerifyRequest $request): bool

return false;
}

public function listCustomTemplates(TemplateFilter $filter = null): IterableAPICollection
{
$collection = $this->api->search($filter, '/templates');
$collection->setNaiveCount(true);
$collection->setPageIndexKey('page');

if (is_null($filter)) {
$collection->setNoQueryParameters(true);
}

$hydrator = new ArrayHydrator();
$hydrator->setPrototype(new Template());
$collection->setHydrator($hydrator);

return $collection;
}

public function createCustomTemplate(string $name): Template
{
$response = $this->api->create([
'name' => $name,
], '/templates');

$template = new Template();
return $template->fromArray($response);
}

public function getCustomTemplate(string $templateId): Template
{
$response = $this->api->get('templates/' . $templateId);
$template = new Template();
return $template->fromArray($response);
}

public function deleteCustomTemplate(string $templateId): bool
{
$this->api->delete('templates/' . $templateId);
return true;
}

public function updateCustomTemplate($templateId, UpdateCustomTemplateRequest $request): Template
{
$response = $this->api->partiallyUpdate('templates/' . $templateId, $request->toArray());
$template = new Template();
return $template->fromArray($response);
}

public function createCustomTemplateFragment(string $templateId, CreateCustomTemplateFragmentRequest $createTemplateFragmentRequest): TemplateFragment
{
$response = $this->api->create($createTemplateFragmentRequest->toArray(), '/templates/' . $templateId . '/template_fragments');
$templateFragment = new TemplateFragment();
$templateFragment->fromArray($response);

return $templateFragment;
}

public function getCustomTemplateFragment(string $templateId, string $fragmentId): TemplateFragment
{
$response = $this->api->get('templates/' . $templateId . '/template_fragments/' . $fragmentId);
$templateFragment = new TemplateFragment();
return $templateFragment->fromArray($response);
}

public function updateCustomTemplateFragment(string $templateId, string $fragmentId, string $text): TemplateFragment
{
$response = $this->api->partiallyUpdate('templates/' . $templateId . '/template_fragments/' . $fragmentId, ['text' => $text]);
$templateFragment = new TemplateFragment();
return $templateFragment->fromArray($response);
}

public function deleteCustomTemplateFragment(string $templateId, string $fragmentId): bool
{
$this->api->delete('templates/' . $templateId . '/template_fragments/' . $fragmentId);
return true;
}

public function listTemplateFragments(string $templateId, TemplateFilter $filter = null): IterableAPICollection
{
$api = clone $this->getAPIResource();
$api->setCollectionName('template_fragments');

$collection = $api->search($filter, '/templates/' . $templateId . '/template_fragments');
$collection->setNaiveCount(true);
$collection->setPageIndexKey('page');

if (is_null($filter)) {
$collection->setNoQueryParameters(true);
}

if (!is_null($filter)) {
if ($filter->getQuery()['page']) {
$collection->setAutoAdvance(false);
$collection->setIndex($filter->getQuery()['page']);
}
}

$hydrator = new ArrayHydrator();
$hydrator->setPrototype(new TemplateFragment());
$collection->setHydrator($hydrator);

return $collection;
}
}
52 changes: 52 additions & 0 deletions src/Verify2/Filters/TemplateFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

declare(strict_types=1);

namespace Vonage\Verify2\Filters;

use Vonage\Entity\Filter\FilterInterface;

class TemplateFilter implements FilterInterface
{
protected ?int $pageSize = null;
protected ?int $page = null;

public function getQuery(): array
{
$return = [];

if ($this->getPage()) {
$return['page'] = $this->getPage();
}

if ($this->getPageSize()) {
$return['page_size'] = $this->getPageSize();
}

return $return;
}

public function getPageSize(): ?int
{
return $this->pageSize;
}

public function setPageSize(int $pageSize): self
{
$this->pageSize = $pageSize;

return $this;
}

public function getPage(): ?int
{
return $this->page;
}

public function setPage(int $page): self
{
$this->page = $page;

return $this;
}
}
83 changes: 83 additions & 0 deletions src/Verify2/Request/CreateCustomTemplateFragmentRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?php

namespace Vonage\Verify2\Request;

use Vonage\Entity\Hydrator\ArrayHydrateInterface;

class CreateCustomTemplateFragmentRequest implements ArrayHydrateInterface
{
protected const SMS_CHANNEL = 'sms';
protected const VOICE_CHANNEL = 'voice';
protected const EMAIL_CHANNEL = 'email';

protected array $permittedChannels = [
self::SMS_CHANNEL,
self::VOICE_CHANNEL,
self::EMAIL_CHANNEL,
];

public function __construct(
protected string $channel,
protected string $locale,
protected string $text,
) {
if (!in_array($channel, $this->permittedChannels)) {
throw new \InvalidArgumentException('Given channel not supported');
}
}

public function getChannel(): string
{
return $this->channel;
}

public function setChannel(string $channel): CreateCustomTemplateFragmentRequest
{
if (!in_array($channel, $this->permittedChannels)) {
throw new \InvalidArgumentException('Given channel not supported');
}

$this->channel = $channel;
return $this;
}

public function getLocale(): string
{
return $this->locale;
}

public function setLocale(string $locale): CreateCustomTemplateFragmentRequest
{
$this->locale = $locale;
return $this;
}

public function getText(): string
{
return $this->text;
}

public function setText(string $text): CreateCustomTemplateFragmentRequest
{
$this->text = $text;
return $this;
}

public function fromArray(array $data): static
{
$this->setChannel($data['channel']);
$this->setLocale($data['locale']);
$this->setText($data['text']);

return $this;
}

public function toArray(): array
{
return [
'channel' => $this->getChannel(),
'locale' => $this->getLocale(),
'text' => $this->getText(),
];
}
}
11 changes: 10 additions & 1 deletion src/Verify2/Request/SMSRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
namespace Vonage\Verify2\Request;

use InvalidArgumentException;
use Vonage\Verify2\Traits\CustomTemplateTrait;
use Vonage\Verify2\VerifyObjects\VerificationLocale;
use Vonage\Verify2\VerifyObjects\VerificationWorkflow;

class SMSRequest extends BaseVerifyRequest
{
use CustomTemplateTrait;

public function __construct(
protected string $to,
protected string $brand,
Expand Down Expand Up @@ -36,6 +39,12 @@ public function __construct(

public function toArray(): array
{
return $this->getBaseVerifyUniversalOutputArray();
$return = $this->getBaseVerifyUniversalOutputArray();

if (!is_null($this->getTemplateId())) {
$return['template_id'] = $this->getTemplateId();
}

return $return;
}
}
53 changes: 53 additions & 0 deletions src/Verify2/Request/UpdateCustomTemplateRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

namespace Vonage\Verify2\Request;

use InvalidArgumentException;
use Vonage\Verify2\VerifyObjects\VerificationLocale;
use Vonage\Verify2\VerifyObjects\VerificationWorkflow;

class UpdateCustomTemplateRequest extends BaseVerifyRequest
{
public function __construct(
protected ?string $name = null,
protected ?bool $isDefault = null,
) {
}

public function getName(): ?string
{
return $this->name;
}

public function setName(?string $name): UpdateCustomTemplateRequest
{
$this->name = $name;
return $this;
}

public function getIsDefault(): ?bool
{
return $this->isDefault;
}

public function setIsDefault(?bool $isDefault): UpdateCustomTemplateRequest
{
$this->isDefault = $isDefault;
return $this;
}

public function toArray(): array
{
$return = [];

if ($this->getName()) {
$return['name'] = $this->getName();
}

if ($this->getIsDefault()) {
$return['is_default'] = $this->getIsDefault();
}

return $return;
}
}
3 changes: 3 additions & 0 deletions src/Verify2/Request/VoiceRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
namespace Vonage\Verify2\Request;

use InvalidArgumentException;
use Vonage\Verify2\Traits\CustomTemplateTrait;
use Vonage\Verify2\VerifyObjects\VerificationLocale;
use Vonage\Verify2\VerifyObjects\VerificationWorkflow;

class VoiceRequest extends BaseVerifyRequest
{
use CustomTemplateTrait;

public function __construct(
protected string $to,
protected string $brand,
Expand Down
18 changes: 18 additions & 0 deletions src/Verify2/Traits/CustomTemplateTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace Vonage\Verify2\Traits;

trait CustomTemplateTrait
{
protected ?string $templateId = null;

public function getTemplateId(): ?string
{
return $this->templateId;
}

public function setTemplateId(string $templateId): string
{
return $this->templateId = $templateId;
}
}
Loading

0 comments on commit 4c10290

Please sign in to comment.