Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -53,7 +54,13 @@ composer types
```
src/
└── Api/
└── GetContacts.php
├── GetContacts.php
├── GetContactsData.php
├── GetMessageTemplates.php
├── GetMessageTemplatesData.php
└── Dto/
├── Contact.php
└── MessageTemplate.php
```

## Requirements
Expand Down
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@ class ContactController
|---------------|--------|-----------------------|
| `GetContacts` | GET | `/api/v1/getContacts` |

### Templates

| Class | Method | Endpoint |
|-----------------------|--------|-------------------------------|
| `GetMessageTemplates` | GET | `/api/v1/getMessageTemplates` |

## Usage

### Get Contacts
Expand All @@ -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
Expand Down
32 changes: 32 additions & 0 deletions src/Api/Dto/MessageTemplate.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace Wati\Api\Dto;

final readonly class MessageTemplate
{
public function __construct(
public string $id,
public string $elementName,
public ?string $category = null,
public ?string $status = null,
public ?string $language = null,
public ?string $body = null,
) {}

/**
* @param array<string, mixed> $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,
);
}
}
4 changes: 2 additions & 2 deletions src/Api/GetContacts.php
Original file line number Diff line number Diff line change
Expand Up @@ -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']
);
}
Expand Down
21 changes: 21 additions & 0 deletions src/Api/GetMessageTemplates.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace Wati\Api;

use Wati\Http\WatiRequest;

final class GetMessageTemplates extends WatiRequest
{
public function __construct(
public readonly int $pageNumber = 1,
public readonly int $pageSize = 50
) {
parent::__construct(
'GET',
"/api/v1/getMessageTemplates?pageNumber={$pageNumber}&pageSize={$pageSize}",
['Accept' => 'application/json']
);
}
}
62 changes: 62 additions & 0 deletions src/Api/GetMessageTemplatesData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

declare(strict_types=1);

namespace Wati\Api;

use Psr\Http\Message\ResponseInterface;
use Wati\Api\Dto\MessageTemplate;

final readonly class GetMessageTemplatesData
{
/**
* @param array<MessageTemplate> $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<array<string, mixed>>,
* 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;
}
}
6 changes: 1 addition & 5 deletions src/helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
18 changes: 9 additions & 9 deletions tests/Api/GetContactsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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');
});
40 changes: 40 additions & 0 deletions tests/Api/GetMessageTemplatesTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

declare(strict_types=1);

namespace Tests\Api;

use Wati\Api\GetMessageTemplates;

it('can create a get message templates with default parameters', function (): void {
$request = new GetMessageTemplates;

expect($request->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');
});