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
60 changes: 45 additions & 15 deletions app/Console/Commands/ImportRegistrationCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
use App\Services\RabbitMQService;
use Illuminate\Support\Facades\Log;
use PhpAmqpLib\Message\AMQPMessage;
use Illuminate\Support\Facades\Mail;
USE App\Mail\ImporteRegistrationMail;

class ImportRegistrationCommand extends Command
{
Expand All @@ -24,45 +22,77 @@ class ImportRegistrationCommand extends Command
*
* @var string
*/
protected $description = 'Comando para consumir a fila des imports de inscrição';
protected $description = 'Comando para consumir a fila de importação de inscrições';

protected $queueService;

public function __construct(RabbitMQService $queueService)
{
parent::__construct();

$this->queueService = $queueService;
}

/**
* Execultando o comando no console
* Executa o comando no console.
*/
public function handle()
{
$queue = config('rabbitmq.queues.queue_import_registration');
$exchange = config('rabbitmq.exchange_default');
$routingKey = config('rabbitmq.routing.module_import_registration_draft');
$this->queueService->consume($queue, $exchange, $routingKey, function (AMQPMessage $msg) {
$this->processMessage($msg);
});

$this->queueService->consume(
$queue,
$exchange,
$routingKey,
function (AMQPMessage $msg) {
$this->processMessage($msg);
}
);
}

protected function processMessage(AMQPMessage $msg)
{
Log::info('Mensagem recebida: ' . $msg->getBody());

try {
$registrations = json_decode($msg->getBody(), true);
if (!is_array($registrations)) {
Log::error('Formato de mensagem inválido');
$registration = json_decode($msg->getBody(), true);

// Verifica se a mensagem contém uma única inscrição.
if (
!is_array($registration) ||
!array_key_exists('registration', $registration)
) {
Log::error(
'Formato de mensagem inválido. Esperada uma única inscrição.',
[
'body' => $msg->getBody(),
]
);

// Descarta a mensagem inválida.
$msg->ack();

return;
}

event(new ImportRegistrationEvent($registrations));
// Confirmar a mensagem após processamento
event(new ImportRegistrationEvent($registration));

// Confirma a mensagem após o processamento.
$msg->ack();
} catch (\Exception $e) {
\Sentry\captureMessage($e, \Sentry\Severity::info());
Log::error('Erro ao processar a mensagem');

Log::info(
'Mensagem processada com sucesso para a inscrição: '
. $registration['registration']
);
} catch (\Throwable $e) {
\Sentry\captureException($e);

Log::error('Erro ao processar a mensagem de importação de inscrição.', [
'exception' => $e->getMessage(),
'body' => $msg->getBody(),
]);
}
}
}
15 changes: 10 additions & 5 deletions app/Events/ImportRegistrationEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,23 @@ class ImportRegistrationEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public $registrations;
/**
* Dados da inscrição que será processada.
*
* @var array
*/
public $registration;

/**
* Create a new event instance.
* Cria uma nova instância do evento.
*/
public function __construct($registrations)
public function __construct(array $registration)
{
$this->registrations = $registrations;
$this->registration = $registration;
}

/**
* Get the channels the event should broadcast on.
* Retorna os canais em que o evento seria transmitido.
*
* @return array<int, \Illuminate\Broadcasting\Channel>
*/
Expand Down
72 changes: 42 additions & 30 deletions app/Listeners/ImportRegistrationListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,53 +11,65 @@
class ImportRegistrationListener
{
/**
* Create the event listener.
* Cria uma nova instância do listener.
*/
public function __construct()
{
//
}

/**
* Handle the event.
* Processa uma única inscrição.
*/
public function handle(ImportRegistrationEvent $event): void
{
foreach ($event->registrations as $registration) {
if (!$this->isValidRegistration($registration)) {
Log::error('Chaves obrigatórias ausentes na inscrição: ' . json_encode($registration));
continue;
}
$registration = $event->registration;

Log::info('Enviando e-mail para: ' . $registration['agent_email']);
// Valida os dados da inscrição.
if (!$this->isValidRegistration($registration)) {
Log::error(
'Chaves obrigatórias ausentes na inscrição: '
. json_encode($registration)
);

// Cria o Mailable
$mailable = new ImporteRegistrationMail($registration);
return;
}

Log::info(
'Enviando e-mail para: ' . $registration['agent_email']
);

// Audita em EmailDispatch com o conteúdo renderizado
EmailDispatch::create([
'to' => $registration['agent_name'],
'subject' => $mailable->envelope()->subject,
'content' => $mailable->render(),
'mailable_type' => ImporteRegistrationMail::class,
'meta' => [
'registration' => $registration['registration'],
'opp_id' => $registration['opp_id'],
'opp_name' => $registration['opp_name'],
'number' => $registration['number'],
'agent_name' => $registration['agent_name'],
'agent_email' => $registration['agent_email'],
],
'dispatched_at' => now(),
]);
// Cria o Mailable para a inscrição.
$mailable = new ImporteRegistrationMail($registration);

Mail::to($registration['agent_email'])->send($mailable);
Log::info('Email enviado e auditado para: ' . $registration['agent_email']);
}
// Registra a auditoria do e-mail em EmailDispatch.
EmailDispatch::create([
'to' => $registration['agent_name'],
'subject' => $mailable->envelope()->subject,
'content' => $mailable->render(),
'mailable_type' => ImporteRegistrationMail::class,
'meta' => [
'registration' => $registration['registration'],
'opp_id' => $registration['opp_id'],
'opp_name' => $registration['opp_name'],
'number' => $registration['number'],
'agent_name' => $registration['agent_name'],
'agent_email' => $registration['agent_email'],
],
'dispatched_at' => now(),
]);

// Envia o e-mail para o responsável pela inscrição.
Mail::to($registration['agent_email'])->send($mailable);

Log::info(
'E-mail enviado e auditado para: '
. $registration['agent_email']
);
}

/**
* Valida se a inscrição possui as chaves obrigatórias
* Valida se a inscrição possui todas as chaves obrigatórias.
*/
protected function isValidRegistration(array $registration): bool
{
Expand Down
Loading
Loading