Skip to content

Tests - API Resource. #5

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Apr 25, 2025
2 changes: 0 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@
"php": "^8.4",
"ext-curl": "*",
"ext-json": "*",
"guzzlehttp/guzzle": "7.x",
"illuminate/contracts": "^10.0||^11.0||^12.0",
"league/oauth2-client": "^2",
"spatie/laravel-data": "^4.15",
"spatie/laravel-package-tools": "^1.16"
},
Expand Down
82 changes: 82 additions & 0 deletions src/Concerns/InteractsWithHttpRequests.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php

namespace Coderflex\LaravelSendy\Concerns;

use Coderflex\LaravelSendy\Exceptions\InvalidApiKeyException;
use Coderflex\LaravelSendy\Exceptions\InvalidApiUrlException;
use Exception;
use Illuminate\Support\Facades\Http;

/**
* @method static \Illuminate\Http\Client\Response get(string $path, array $data = [], bool $async = false, array $headers = [])
* @method static \Illuminate\Http\Client\Response post(string $path, array $data = [], bool $async = false, array $headers = [])
* @method static \Illuminate\Http\Client\Response put(string $path, array $data = [], bool $async = false, array $headers = [])
* @method static \Illuminate\Http\Client\Response delete(string $path, array $data = [], bool $async = false, array $headers = [])
* @method static \Illuminate\Http\Client\Response patch(string $path, array $data = [], bool $async = false, array $headers = [])
*/
trait InteractsWithHttpRequests
{
public function __call(string $function, array $args): mixed
{
$options = ['get', 'post', 'put', 'delete', 'patch'];
$path = $args[0] ?? null;
$data = $args[1] ?? [];
$async = $args[2] ?? false;
$headers = $args[3] ?? [];

if (! in_array($function, $options)) {
throw new Exception("Method {$function} not found.");
}

return self::sendRequest(
type: $function,
request: $path,
data: $data,
headers: $headers,
async: $async
);
}

/**
* @throws \Exception
*/
protected function sendRequest(string $type, string $request, array $data = [], array $headers = [], bool $async = false): mixed
{
try {
$apiKey = config('laravel-sendy.api_key');
$apiUrl = config('laravel-sendy.api_url');

throw_if(
blank($apiKey),
InvalidApiKeyException::class,
);

throw_if(
blank($apiUrl),
InvalidApiUrlException::class,
);

$payload = array_merge($data, [
'api_key' => $apiKey,
]);

$url = rtrim($apiUrl, '/').'/'.ltrim($request, '/');

$client = Http::withHeaders(array_merge([
'Content-Type' => 'application/json',
'Accept' => 'application/json',
], $headers ?? []));

return $async
? $client->async()->{$type}($url, $payload)
: $client->{$type}($url, $payload);

} catch (InvalidApiKeyException $th) {
throw new InvalidApiKeyException('Error: '.$th->getMessage());
} catch (InvalidApiUrlException $th) {
throw new InvalidApiUrlException('Error: '.$th->getMessage());
} catch (Exception $th) {
throw new Exception('Error: '.$th->getMessage());
}
}
}
20 changes: 10 additions & 10 deletions src/DTOs/CompaignDTO.php → src/DTOs/Campaigns/CampaignDTO.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?php

namespace Coderflex\LaravelSendy\DTOs;
namespace Coderflex\LaravelSendy\DTOs\Campaigns;

use Spatie\LaravelData\Data;
use Spatie\LaravelData\Support\Validation\ValidationContext;

class CompaignDTO extends Data
class CampaignDTO extends Data
{
public function __construct(
public string $from_name,
Expand All @@ -15,15 +15,15 @@ public function __construct(
public string $subject,
public ?string $plain_text,
public string $html_text,
public string $list_ids,
public string $segment_ids,
public ?string $list_ids,
public ?string $segment_ids,
public ?string $exclude_list_ids,
public ?string $exclude_segment_ids,
public string $brand_id,
public ?string $brand_id,
public ?string $query_string,
public ?int $track_opens,
public ?int $track_clicks,
public ?int $send_compaign,
public ?int $send_campaign,
public ?string $schedule_date_time,
public ?string $schedule_timezone,
) {}
Expand All @@ -38,15 +38,15 @@ public static function rules(ValidationContext $context): array
'subject' => ['required', 'string'],
'plain_text' => ['string', 'nullable'],
'html_text' => ['required', 'string'],
'list_ids' => ['required', 'string'],
'segment_ids' => ['required', 'string'],
'list_ids' => ['required_if:send_campaign,1', 'string'],
'segment_ids' => ['required_if:send_campaign,1', 'string'],
'exclude_list_ids' => ['string', 'nullable'],
'exclude_segment_ids' => ['string', 'nullable'],
'brand_id' => ['required', 'string'],
'brand_id' => ['required_if:send_campaign,0', 'string'],
'query_string' => ['string', 'nullable'],
'track_opens' => ['integer', 'nullable', 'in:0,1,2'],
'track_clicks' => ['integer', 'nullable', 'in:0,1,2'],
'send_compaign' => ['integer', 'nullable', 'in:0,1'],
'send_campaign' => ['integer', 'nullable', 'in:0,1'],
'schedule_date_time' => ['date', 'nullable'],
'schedule_timezone' => ['date', 'nullable'],
];
Expand Down
21 changes: 21 additions & 0 deletions src/DTOs/Lists/ListsDTO.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace Coderflex\LaravelSendy\DTOs\Lists;

use Spatie\LaravelData\Data;
use Spatie\LaravelData\Support\Validation\ValidationContext;

class ListsDTO extends Data
{
public function __construct(
public string $brand_id,
public ?string $include_hidden = 'no',
) {}

public static function rules(ValidationContext $context): array
{
return [
'include_hidden' => ['in:yes,no'],
];
}
}
23 changes: 23 additions & 0 deletions src/DTOs/Subscribers/DeleteSubscriberDTO.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace Coderflex\LaravelSendy\DTOs\Subscribers;

use Spatie\LaravelData\Attributes\MergeValidationRules;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Support\Validation\ValidationContext;

#[MergeValidationRules]
class DeleteSubscriberDTO extends Data
{
public function __construct(
public string $list_id,
public string $email,
) {}

public static function rules(ValidationContext $context): array
{
return [
'email' => ['email'],
];
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
<?php

namespace Coderflex\LaravelSendy\DTOs;
namespace Coderflex\LaravelSendy\DTOs\Subscribers;

use Spatie\LaravelData\Attributes\MergeValidationRules;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Support\Validation\ValidationContext;

class SubscribersDTO extends Data
#[MergeValidationRules]
class SubscribeDTO extends Data
{
public function __construct(
public ?string $name,
Expand All @@ -22,15 +24,8 @@ public function __construct(
public static function rules(ValidationContext $context): array
{
return [
'name' => ['string', 'nullable'],
'email' => ['required', 'string', 'email'],
'list' => ['required', 'string'],
'country' => ['string', 'nullable'],
'ipaddress' => ['string', 'nullable', 'ip'],
'referrer' => ['string', 'nullable'],
'gdpr' => ['boolean', 'nullable'],
'silent' => ['boolean', 'nullable'],
'boolean' => ['boolean', 'nullable'],
'email' => ['email'],
'ipaddress' => ['ip'],
];
}
}
23 changes: 23 additions & 0 deletions src/DTOs/Subscribers/SubscriberStatusDTO.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace Coderflex\LaravelSendy\DTOs\Subscribers;

use Spatie\LaravelData\Attributes\MergeValidationRules;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Support\Validation\ValidationContext;

#[MergeValidationRules]
class SubscriberStatusDTO extends Data
{
public function __construct(
public string $list_id,
public string $email,
) {}

public static function rules(ValidationContext $context): array
{
return [
'email' => ['email'],
];
}
}
24 changes: 24 additions & 0 deletions src/DTOs/Subscribers/UnsubscribeDTO.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace Coderflex\LaravelSendy\DTOs\Subscribers;

use Spatie\LaravelData\Attributes\MergeValidationRules;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Support\Validation\ValidationContext;

#[MergeValidationRules]
class UnsubscribeDTO extends Data
{
public function __construct(
public string $list,
public string $email,
public ?bool $boolean = false, // plain text response
) {}

public static function rules(ValidationContext $context): array
{
return [
'email' => ['email'],
];
}
}
8 changes: 0 additions & 8 deletions src/Exceptions/CompaingException.php

This file was deleted.

10 changes: 10 additions & 0 deletions src/Exceptions/InvalidApiKeyException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Coderflex\LaravelSendy\Exceptions;

class InvalidApiKeyException extends \Exception
{
protected $message = 'The API key is invalid. Please check your configuration and try again.';

protected $code = 401;
}
10 changes: 10 additions & 0 deletions src/Exceptions/InvalidApiUrlException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Coderflex\LaravelSendy\Exceptions;

class InvalidApiUrlException extends \Exception
{
protected $message = 'The API URL is invalid. Please check your configuration and try again.';

protected $code = 401;
}
8 changes: 0 additions & 8 deletions src/Exceptions/SubscribersException.php

This file was deleted.

5 changes: 5 additions & 0 deletions src/Facades/LaravelSendy.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@

/**
* @see \Coderflex\LaravelSendy\LaravelSendy
*
* @method static \Coderflex\LaravelSendy\Resources\Subscribers subscribers()
* @method static \Coderflex\LaravelSendy\Resources\Lists lists()
* @method static \Coderflex\LaravelSendy\Resources\Brands brands()
* @method static \Coderflex\LaravelSendy\Resources\Campaigns campaigns()
*/
class LaravelSendy extends Facade
{
Expand Down
Loading
Loading