Skip to content

Commit

Permalink
[Communication] Add support for Messages and Templates (#3)
Browse files Browse the repository at this point in the history
[Communication] Add support for Messages and Templates
  • Loading branch information
Anton Samofal authored Jun 14, 2023
1 parent d9255bc commit 826d3f1
Show file tree
Hide file tree
Showing 14 changed files with 441 additions and 23 deletions.
74 changes: 74 additions & 0 deletions src/Api/Communication/Communication.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

namespace Getsno\Relesys\Api\Communication;

use Getsno\Relesys\Api\Api;
use Getsno\Relesys\Api\BatchResponse;
use Getsno\Relesys\Api\ApiQueryParams;
use Getsno\Relesys\Api\Communication\Entities\Template;
use Getsno\Relesys\Api\Communication\Enums\MessageType;
use Getsno\Relesys\Exceptions\RelesysHttpClientException;
use Getsno\Relesys\Api\Communication\Enums\DeliveryMethod;
use Getsno\Relesys\Api\Communication\ValueObjects\MessageBody;

class Communication extends Api
{
/**
* @throws RelesysHttpClientException
*/
public function sendMessage(
string $userId,
DeliveryMethod $deliveryMethod,
?string $communicationTemplateId = null,
?MessageType $messageType = null,
?MessageBody $messageBody = null,
): void
{
$params = [
'deliveryMethod' => $deliveryMethod->value,
];

if ($communicationTemplateId !== null) {
$params['communicationTemplateId'] = $communicationTemplateId;
} elseif ($messageType !== null) {
$params['messageType'] = $messageType->value;
} else {
$params['messageBody'] = $messageBody;
}

$this->httpClient->post("communication/messages/$userId/send", $params);
}

/**
* @throws RelesysHttpClientException
*/
public function getTemplate(string $templateId): Template
{
$responseData = $this->httpClient->get("communication/templates/$templateId")['data'];

return Template::fromArray($responseData)->setSource($responseData);
}

/**
* @throws RelesysHttpClientException
*/
public function getTemplates(ApiQueryParams $queryParams = new ApiQueryParams(), int $page = 1): BatchResponse
{
$queryParams->offset($queryParams->getLimit() * ($page - 1));
$params = $queryParams->toArray();

$response = $this->httpClient->get('communication/templates', $params);

$users = array_map(
static fn(array $template) => Template::fromArray($template)->setSource($template),
$response['data']
);

return new BatchResponse(
$response['count'],
$users,
$response['nextUrl'] ?? null,
$response['previousUrl'] ?? null,
);
}
}
30 changes: 30 additions & 0 deletions src/Api/Communication/Entities/Template.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Getsno\Relesys\Api\Communication\Entities;

use Carbon\Carbon;
use Getsno\Relesys\Api\ApiEntity;
use Getsno\Relesys\Api\Communication\ValueObjects\TemplateCultures;

class Template extends ApiEntity
{
public string $id;
public string $name;

/**
* @var TemplateCultures[]
*/
public array $communicationTemplateCultures;
public Carbon $creationDateTime;
public ?Carbon $lastModifiedDateTime;

protected function setCreationDateTime(string $dateTime): void
{
$this->creationDateTime = Carbon::parse($dateTime);
}

protected function setLastModifiedDateTime(string $dateTime): void
{
$this->lastModifiedDateTime = Carbon::parse($dateTime);
}
}
10 changes: 10 additions & 0 deletions src/Api/Communication/Enums/DeliveryMethod.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Getsno\Relesys\Api\Communication\Enums;

enum DeliveryMethod: string
{
case Sms = 'sms';
case Email = 'email';
case Both = 'both';
}
10 changes: 10 additions & 0 deletions src/Api/Communication/Enums/MessageType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Getsno\Relesys\Api\Communication\Enums;

enum MessageType: string
{
case Welcome = 'welcome';
case LoginInfo = 'logininfo';
case ForgottenPassword = 'forgottenpassword';
}
25 changes: 25 additions & 0 deletions src/Api/Communication/ValueObjects/MessageBody.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Getsno\Relesys\Api\Communication\ValueObjects;

use Getsno\Relesys\Traits\CreatableFromArray;
use Getsno\Relesys\Traits\ConvertibleToArray;

class MessageBody
{
use CreatableFromArray;
use ConvertibleToArray;

public readonly ?TemplateSms $sms;
public readonly ?TemplateEmail $email;

protected function setSms(array $data): void
{
$this->sms = TemplateSms::fromArray($data);
}

protected function setEmail(array $data): void
{
$this->email = TemplateEmail::fromArray($data);
}
}
16 changes: 16 additions & 0 deletions src/Api/Communication/ValueObjects/TemplateCultures.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace Getsno\Relesys\Api\Communication\ValueObjects;

use Getsno\Relesys\Traits\CreatableFromArray;
use Getsno\Relesys\Traits\ConvertibleToArray;

class TemplateCultures
{
use CreatableFromArray;
use ConvertibleToArray;

public string $cultureCode;
public TemplateSms $sms;
public TemplateEmail $email;
}
15 changes: 15 additions & 0 deletions src/Api/Communication/ValueObjects/TemplateEmail.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Getsno\Relesys\Api\Communication\ValueObjects;

use Getsno\Relesys\Traits\CreatableFromArray;
use Getsno\Relesys\Traits\ConvertibleToArray;

class TemplateEmail
{
use CreatableFromArray;
use ConvertibleToArray;

public readonly string $subject;
public readonly string $body;
}
14 changes: 14 additions & 0 deletions src/Api/Communication/ValueObjects/TemplateSms.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Getsno\Relesys\Api\Communication\ValueObjects;

use Getsno\Relesys\Traits\CreatableFromArray;
use Getsno\Relesys\Traits\ConvertibleToArray;

class TemplateSms
{
use CreatableFromArray;
use ConvertibleToArray;

public readonly string $body;
}
2 changes: 2 additions & 0 deletions src/Facades/RelesysFacade.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
use Getsno\Relesys\Api\UserManagement\UserGroups;
use Getsno\Relesys\Api\UserManagement\Departments;
use Getsno\Relesys\Api\UserManagement\CustomFields;
use Getsno\Relesys\Api\Communication\Communication;

/**
* @method static Users users
* @method static Departments departments
* @method static UserGroups userGroups
* @method static CustomFields customFields
* @method static Communication communication
*/
class RelesysFacade extends Facade
{
Expand Down
8 changes: 7 additions & 1 deletion src/Relesys.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

namespace Getsno\Relesys;

use Getsno\Relesys\Api\UserManagement\Users;
use Getsno\Relesys\HttpClient\HttpClient;
use Getsno\Relesys\Api\UserManagement\Users;
use Getsno\Relesys\Api\UserManagement\UserGroups;
use Getsno\Relesys\Api\UserManagement\Departments;
use Getsno\Relesys\Api\Communication\Communication;
use Getsno\Relesys\Api\UserManagement\CustomFields;

class Relesys
Expand Down Expand Up @@ -33,4 +34,9 @@ public function customFields(): CustomFields
{
return new CustomFields($this->httpClient);
}

public function communication(): Communication
{
return new Communication($this->httpClient);
}
}
15 changes: 9 additions & 6 deletions src/RelesysServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Getsno\Relesys;

use Illuminate\Support\Str;
use Illuminate\Support\ServiceProvider;
use Getsno\Relesys\Exceptions\RelesysException;
use Getsno\Relesys\HttpClient\HttpClient;
Expand All @@ -15,7 +16,7 @@ public function boot(): void
{
if ($this->app->runningInConsole()) {
$this->publishes([
__DIR__.'/../config/relesys.php' => config_path('relesys.php'),
__DIR__ . '/../config/relesys.php' => config_path('relesys.php'),
], 'config');
}
}
Expand All @@ -26,17 +27,19 @@ public function boot(): void
public function register(): void
{
// Automatically apply the package configuration
$this->mergeConfigFrom(__DIR__.'/../config/relesys.php', 'relesys');
$this->mergeConfigFrom(__DIR__ . '/../config/relesys.php', 'relesys');

// Register the main class to use with the facade
$this->app->singleton('relesys.users', static function () {
$client_id = config('relesys.client_id');
$client_secret = config('relesys.client_secret');
if (empty($client_id) || empty($client_secret)) {
$clientId = config('relesys.client_id');
$clientSecret = config('relesys.client_secret');

/** @noinspection NotOptimalIfConditionsInspection */
if (!Str::isUuid($clientId) || empty($clientSecret)) {
throw RelesysException::invalidAuthCredentials();
}

return new Relesys(new HttpClient($client_id, $client_secret));
return new Relesys(new HttpClient($clientId, $clientSecret));
});
}
}
Loading

0 comments on commit 826d3f1

Please sign in to comment.