File: /var/www/quadcode/app/Console/Commands/SendGridUpdateLists.php
<?php
namespace App\Console\Commands;
use App\Models\SendGridList;
use Exception;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use SendGrid;
use Symfony\Component\Console\Command\Command as CommandAlias;
class SendGridUpdateLists extends Command
{
protected $signature = 'send-grid:update-lists';
protected $description = 'Updating SendGrid marketing lists';
const LOG_CHANNEL = 'sendGrid';
public function handle(): int
{
$apiKey = env('SENDGRID_API_KEY');
if (empty($apiKey)) {
$this->error('Need to fill SENDGRID_API_KEY in .env');
}
$this->info($this->description);
try {
$sendGrid = new SendGrid($apiKey);
$response = $sendGrid->client->marketing()->lists()->get();
$data = json_decode($response->body(), true);
if (JSON_ERROR_NONE != json_last_error()) {
throw new Exception('Json parse error: ' . json_last_error());
}
$code = $response->statusCode();
$responseData = [
'code' => $code,
'headers' => $response->headers(),
'body' => $data,
];
if (202 === $code) {
Log::channel(self::LOG_CHANNEL)->info('Get All Lists', $responseData);
} else {
Log::channel(self::LOG_CHANNEL)->error('Get All Lists', $responseData);
}
} catch (Exception $exception) {
Log::channel(self::LOG_CHANNEL)->error('Get All Lists error: ' . $exception->getMessage());
throw $exception;
}
if (empty($data['result'])) {
$this->error('Data result is empty');
}
$createdCount = 0;
foreach ($data['result'] as $list) {
/** @var SendGridList $sendGridList */
$sendGridList = SendGridList::query()->findOrNew($list['id']);
if (empty($sendGridList->attributesToArray())) {
$createdCount++;
}
$sendGridList->id = $list['id'];
$sendGridList->name = $list['name'];
$sendGridList->save();
}
if (empty($createdCount)) {
$this->info('Nothing created');
} else {
$this->info('Created: ' . $createdCount);
}
return CommandAlias::SUCCESS;
}
}