From 71baf2132e84fab35257216da07518ed113ba635 Mon Sep 17 00:00:00 2001 From: Mohammed Elhaouari Date: Sun, 22 Feb 2026 18:26:48 +0100 Subject: [PATCH 1/2] Add get message templates --- AGENTS.md | 15 +++++-- README.md | 8 +++- src/Api/Dto/MessageTemplate.php | 36 ++++++++++++++++ src/Api/GetContacts.php | 4 +- src/Api/GetMessageTemplates.php | 21 +++++++++ src/Api/GetMessageTemplatesData.php | 62 +++++++++++++++++++++++++++ src/helpers.php | 6 +-- tests/Api/GetContactsTest.php | 18 ++++---- tests/Api/GetMessageTemplatesTest.php | 40 +++++++++++++++++ 9 files changed, 189 insertions(+), 21 deletions(-) create mode 100644 src/Api/Dto/MessageTemplate.php create mode 100644 src/Api/GetMessageTemplates.php create mode 100644 src/Api/GetMessageTemplatesData.php create mode 100644 tests/Api/GetMessageTemplatesTest.php diff --git a/AGENTS.md b/AGENTS.md index 417635f..d8b9f9e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -36,9 +36,10 @@ $data = json_decode($response->getBody()->getContents(), true); ## Available API Classes -| Class | Method | Endpoint | -|---------------|--------|-----------------------| -| `GetContacts` | GET | `/api/v1/getContacts` | +| Class | Method | Endpoint | +|----------------------|--------|------------------------------| +| `GetContacts` | GET | `/api/v1/getContacts` | +| `GetMessageTemplates`| GET | `/api/v1/getMessageTemplates`| ## Testing @@ -53,7 +54,13 @@ composer types ``` src/ └── Api/ - └── GetContacts.php + ├── GetContacts.php + ├── GetContactsData.php + ├── GetMessageTemplates.php + ├── GetMessageTemplatesData.php + └── Dto/ + ├── Contact.php + └── MessageTemplate.php ``` ## Requirements diff --git a/README.md b/README.md index 1ec13e4..757903f 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,12 @@ class ContactController |---------------|--------|-----------------------| | `GetContacts` | GET | `/api/v1/getContacts` | +### Templates + +| Class | Method | Endpoint | +|-----------------------|--------|-------------------------------| +| `GetMessageTemplates` | GET | `/api/v1/getMessageTemplates` | + ## Usage ### Get Contacts @@ -112,7 +118,7 @@ use Wati\Api\GetContacts; $response = $client->send(new GetContacts()); // Get a specific page with a custom page size -$response = $client->send(new GetContacts(page: 2, pageSize: 100)); +$response = $client->send(new GetContacts(pageNumber: 2, pageSize: 100)); ``` ## Error Handling diff --git a/src/Api/Dto/MessageTemplate.php b/src/Api/Dto/MessageTemplate.php new file mode 100644 index 0000000..0d5b2e5 --- /dev/null +++ b/src/Api/Dto/MessageTemplate.php @@ -0,0 +1,36 @@ + $data + */ + public static function fromArray(array $data): self + { + return new self( + id: data_get_str($data, 'id', ''), + elementName: data_get_str($data, 'elementName', ''), + category: is_string($v = data_get_str($data, 'category')) ? $v : null, + status: is_string($v = data_get_str($data, 'status')) ? $v : null, + language: is_string($v = data_get_str($data, 'language')) ? $v : null, + body: is_string($v = data_get_str($data, 'body')) ? $v : null, + hsm: $data['hsm'] ?? null, + hsmOriginal: $data['hsmOriginal'] ?? null, + ); + } +} diff --git a/src/Api/GetContacts.php b/src/Api/GetContacts.php index 88ed04b..89e3058 100644 --- a/src/Api/GetContacts.php +++ b/src/Api/GetContacts.php @@ -9,12 +9,12 @@ final class GetContacts extends WatiRequest { public function __construct( - public readonly int $page = 1, + public readonly int $pageNumber = 1, public readonly int $pageSize = 50 ) { parent::__construct( 'GET', - "/api/v1/getContacts?page={$page}&pageSize={$pageSize}", + "/api/v1/getContacts?pageNumber={$pageNumber}&pageSize={$pageSize}", ['Accept' => 'application/json'] ); } diff --git a/src/Api/GetMessageTemplates.php b/src/Api/GetMessageTemplates.php new file mode 100644 index 0000000..7e45f15 --- /dev/null +++ b/src/Api/GetMessageTemplates.php @@ -0,0 +1,21 @@ + 'application/json'] + ); + } +} diff --git a/src/Api/GetMessageTemplatesData.php b/src/Api/GetMessageTemplatesData.php new file mode 100644 index 0000000..d1406ae --- /dev/null +++ b/src/Api/GetMessageTemplatesData.php @@ -0,0 +1,62 @@ + $messageTemplates + */ + public function __construct( + public string $result, + public int $total, + public int $pageNumber, + public int $pageSize, + public ?string $prevPage, + public ?string $nextPage, + public array $messageTemplates, + ) {} + + public static function fromResponse(ResponseInterface $response): self + { + /** + * @var array{ + * result?: string, + * messageTemplates?: array>, + * link?: array{ + * prevPage?: string|null, + * nextPage?: string|null, + * pageNumber?: int, + * pageSize?: int, + * total?: int + * } + * } $data + */ + $data = json_decode($response->getBody()->getContents(), true) ?? []; + + $link = $data['link'] ?? []; + + return new self( + result: is_string($data['result'] ?? null) ? $data['result'] : '', + total: (int) ($link['total'] ?? 0), + pageNumber: (int) ($link['pageNumber'] ?? 1), + pageSize: (int) ($link['pageSize'] ?? 50), + prevPage: is_string($link['prevPage'] ?? null) ? $link['prevPage'] : null, + nextPage: is_string($link['nextPage'] ?? null) ? $link['nextPage'] : null, + messageTemplates: array_map( + MessageTemplate::fromArray(...), + $data['messageTemplates'] ?? [] + ), + ); + } + + public function hasMore(): bool + { + return $this->nextPage !== null; + } +} diff --git a/src/helpers.php b/src/helpers.php index 2fa18ec..d290c33 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -11,16 +11,12 @@ */ function data_get_str(array $data, string $key, mixed $default = null): mixed { - if (! array_key_exists($key, $data)) { + if (! array_key_exists($key, $data) || $data[$key] === null) { return $default; } $value = $data[$key]; - if ($value === null) { - return $default; - } - if (is_string($value)) { $value = trim($value); diff --git a/tests/Api/GetContactsTest.php b/tests/Api/GetContactsTest.php index 6fb36a9..cc377a6 100644 --- a/tests/Api/GetContactsTest.php +++ b/tests/Api/GetContactsTest.php @@ -11,30 +11,30 @@ expect($request->getMethod())->toBe('GET') ->and($request->getUri()->getPath())->toBe('/api/v1/getContacts') - ->and($request->getUri()->getQuery())->toBe('page=1&pageSize=50') + ->and($request->getUri()->getQuery())->toBe('pageNumber=1&pageSize=50') ->and($request->getHeaderLine('Accept'))->toBe('application/json'); }); it('can create a get contacts with custom page', function (): void { - $request = new GetContacts(page: 2); + $request = new GetContacts(pageNumber: 2); - expect($request->page)->toBe(2) + expect($request->pageNumber)->toBe(2) ->and($request->pageSize)->toBe(50) - ->and($request->getUri()->getQuery())->toBe('page=2&pageSize=50'); + ->and($request->getUri()->getQuery())->toBe('pageNumber=2&pageSize=50'); }); it('can create a get contacts with custom page size', function (): void { $request = new GetContacts(pageSize: 100); - expect($request->page)->toBe(1) + expect($request->pageNumber)->toBe(1) ->and($request->pageSize)->toBe(100) - ->and($request->getUri()->getQuery())->toBe('page=1&pageSize=100'); + ->and($request->getUri()->getQuery())->toBe('pageNumber=1&pageSize=100'); }); it('can create a get contacts with custom page and page size', function (): void { - $request = new GetContacts(page: 3, pageSize: 25); + $request = new GetContacts(pageNumber: 3, pageSize: 25); - expect($request->page)->toBe(3) + expect($request->pageNumber)->toBe(3) ->and($request->pageSize)->toBe(25) - ->and($request->getUri()->getQuery())->toBe('page=3&pageSize=25'); + ->and($request->getUri()->getQuery())->toBe('pageNumber=3&pageSize=25'); }); diff --git a/tests/Api/GetMessageTemplatesTest.php b/tests/Api/GetMessageTemplatesTest.php new file mode 100644 index 0000000..4724a25 --- /dev/null +++ b/tests/Api/GetMessageTemplatesTest.php @@ -0,0 +1,40 @@ +getMethod())->toBe('GET') + ->and($request->getUri()->getPath())->toBe('/api/v1/getMessageTemplates') + ->and($request->getUri()->getQuery())->toBe('pageNumber=1&pageSize=50') + ->and($request->getHeaderLine('Accept'))->toBe('application/json'); +}); + +it('can create a get message templates with custom page number', function (): void { + $request = new GetMessageTemplates(pageNumber: 2); + + expect($request->pageNumber)->toBe(2) + ->and($request->pageSize)->toBe(50) + ->and($request->getUri()->getQuery())->toBe('pageNumber=2&pageSize=50'); +}); + +it('can create a get message templates with custom page size', function (): void { + $request = new GetMessageTemplates(pageSize: 100); + + expect($request->pageNumber)->toBe(1) + ->and($request->pageSize)->toBe(100) + ->and($request->getUri()->getQuery())->toBe('pageNumber=1&pageSize=100'); +}); + +it('can create a get message templates with custom page number and page size', function (): void { + $request = new GetMessageTemplates(pageNumber: 3, pageSize: 25); + + expect($request->pageNumber)->toBe(3) + ->and($request->pageSize)->toBe(25) + ->and($request->getUri()->getQuery())->toBe('pageNumber=3&pageSize=25'); +}); From f9620abd1e3fcf6811f6fa96ddae08efb8f87242 Mon Sep 17 00:00:00 2001 From: Mohammed Elhaouari Date: Sun, 22 Feb 2026 18:30:27 +0100 Subject: [PATCH 2/2] Remove unused variales --- src/Api/Dto/MessageTemplate.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Api/Dto/MessageTemplate.php b/src/Api/Dto/MessageTemplate.php index 0d5b2e5..45005a7 100644 --- a/src/Api/Dto/MessageTemplate.php +++ b/src/Api/Dto/MessageTemplate.php @@ -13,8 +13,6 @@ public function __construct( public ?string $status = null, public ?string $language = null, public ?string $body = null, - public mixed $hsm = null, - public mixed $hsmOriginal = null, ) {} /** @@ -29,8 +27,6 @@ public static function fromArray(array $data): self status: is_string($v = data_get_str($data, 'status')) ? $v : null, language: is_string($v = data_get_str($data, 'language')) ? $v : null, body: is_string($v = data_get_str($data, 'body')) ? $v : null, - hsm: $data['hsm'] ?? null, - hsmOriginal: $data['hsmOriginal'] ?? null, ); } }