Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
c0a70cd
:wrench: #34 Iniciado configuração e classe de RabbitmqService
Junior-Shyko Jul 8, 2025
6d7c03d
Merge pull request #35 from secultce/main
ronnyjohnti Jul 10, 2025
1103bcf
🚀 #34 - Ajuste de arquivos para ambiente local
Junior-Shyko Jul 15, 2025
53054ec
🔨 #34 - add supervisord ambiente local
Junior-Shyko Jul 15, 2025
85a2493
:hammer: Finalizando o teste unitário
Junior-Shyko Jul 22, 2025
b9df525
🧪 Arquivo .env.testing
Junior-Shyko Jul 22, 2025
454cd3e
:hammer: #34 - Criado consumidor OpinionManagement
Junior-Shyko Jul 23, 2025
bbb7003
:hammer: #34 - Arquivo de configuração do Sentry
Junior-Shyko Jul 23, 2025
9a7cbc8
:see_no_evil: #34 - add gitignore
Junior-Shyko Jul 24, 2025
3152655
🔨 #34 - add classe de envio de email para justificativa publicada
Junior-Shyko Jul 24, 2025
f0e40ce
:hammer: #34 - Enviando emails
Junior-Shyko Jul 25, 2025
59767c1
🔨 #34 - criando corretamente o consumer e enviando os emails
Junior-Shyko Jul 25, 2025
e2481ee
📝 #34 informando a criação do workers
Junior-Shyko Jul 25, 2025
a7a0bfa
🔧 #34 - Add variaveis de ambinete
Junior-Shyko Jul 25, 2025
0704c10
Merge branch 'develop' into feature/importRegistration
Junior-Shyko Jul 25, 2025
5f32f99
♻️ #34 - Refatorado para desenvolvimento localhost
Junior-Shyko Jul 28, 2025
c17b226
♻️ #34 - Alterando locais para logs dos workers
Junior-Shyko Jul 28, 2025
9af6171
♻️ #34 - Removido user no supervisord
Junior-Shyko Jul 29, 2025
5134dac
:poop: #34 alterado link dns do sentry
Junior-Shyko Aug 1, 2025
c2ea0e2
Merge pull request #36 from secultce/feature/importRegistration
Junior-Shyko Aug 1, 2025
ee759a2
:wrench: #37 Iniciado mudança na configuração
Junior-Shyko Aug 4, 2025
f1add10
:hammer: #37 Finalizado prestação de contas, produtor e consumidor
Junior-Shyko Aug 6, 2025
c41e6f5
:hammer: #37 mudando algumas configurações
Junior-Shyko Aug 8, 2025
4f94368
:hammer: #37 Configurando para publicar pareceres
Junior-Shyko Aug 11, 2025
47d27c6
:hammer: #37 - Add itens de variaveis de ambiente
Junior-Shyko Aug 11, 2025
da4fd05
🔧 #37 - Removendo composer.lock
Junior-Shyko Aug 11, 2025
bd96e63
:hammer: #37 - Removendo serviço rabbitmq_local
Junior-Shyko Aug 11, 2025
8c0be39
:hammer: #37 - Habilitando o servidor php do laravel
Junior-Shyko Aug 13, 2025
2d95848
:hammer: #37 - Habilitando a confirmacao do recebimento
Junior-Shyko Aug 13, 2025
fe71ff3
Merge pull request #38 from secultce/feature/configRabbitmq
Junior-Shyko Aug 19, 2025
f5e42ed
🚀 Arquivo para rodar em producao
Junior-Shyko Aug 20, 2025
c974083
🔨 #39 criado classes, arquivos e testes para salvar dados no bamnnco
Junior-Shyko Aug 26, 2025
fc87a2e
🧪 #39 - Finalizado classe de test
Junior-Shyko Aug 28, 2025
4e305c7
🔨 #39 - Removendo tabela sem necessidade
Junior-Shyko Aug 28, 2025
73d960d
🔨 #39 - Criado event, model, provider e migrate
Junior-Shyko Aug 28, 2025
e947388
🔨 #40 Corrigido teste SaveDataEmailDatabaseTest
Junior-Shyko Sep 11, 2025
89099cf
🔨 #40 Corrigido todos os testes
Junior-Shyko Sep 11, 2025
e390bff
🔨 #39 - Criado event e listener para opnionManagement
Junior-Shyko Sep 15, 2025
e2289a6
♻️ #39 - Criando eventos para salvar dados
Junior-Shyko Sep 19, 2025
0597432
:hammer: Add valores especifico em audits
Junior-Shyko Sep 22, 2025
047efc5
:test_tube: Testes execultado e passando
Junior-Shyko Sep 22, 2025
c58ab8e
:poop: Removendo codigo descencessario
Junior-Shyko Sep 22, 2025
32ee6dd
:poop: #39 Removendo classe sem uso
Junior-Shyko Sep 22, 2025
e8350d9
:poop: #39 Classe desnecessaria
Junior-Shyko Sep 22, 2025
08f1706
:poop: #39 Classe desnecessaria
Junior-Shyko Sep 22, 2025
1697338
💩 #39 - Removendo migration desnecessarias
Junior-Shyko Sep 25, 2025
d5d63e6
Merge pull request #41 from secultce/feature/saveDataEmailDatabase
Junior-Shyko Sep 25, 2025
50f9033
Adiciona arquivos de configuração do supervisor para build da imagem …
Nov 10, 2025
7c807a7
Atualiza Dockerfile da imagem de produção
Nov 10, 2025
13b91f6
Ajusta hierarquia dos arquivos da pasta docker
Nov 10, 2025
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
34 changes: 24 additions & 10 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,27 @@ MAPA_URL=

JWT_SECRET=

#### RABBITMW ####
RABBITMQ_DEFAULT_HOST=
RABBITMQ_DEFAULT_PORT=
RABBITMQ_DEFAULT_USER=
RABBITMQ_DEFAULT_PASS=
RABBITMQ_EXCHANGE_PLUGINS=
RABBITMQ_QUEUE_OPINIONS_PUBLISHED=
RABBITMQ_QUEUE_PC=
RABBITMQ_QUEUE_PC_ROUTE_KEY_PROP=
RABBITMQ_QUEUE_PC_ROUTE_KEY_ADM=
#### RABBITMQ ####
RABBITMQ_DEFAULT_HOST=ip_ou_host
RABBITMQ_DEFAULT_PORT=5672
RABBITMQ_DEFAULT_USER=user
RABBITMQ_DEFAULT_PASS=pass
RABBITMQ_ENABLED=true
RABBITMQ_EXCHANGE_DEFAULT=RABBITMQ_EXCHANGE_DEFAULT
RABBITMQ_QUEUE_PUBLISHED_RECOURSES=RABBITMQ_QUEUE_PUBLISHED_RECOURSES
QUEUE_OPINION_MANAGEMENT=QUEUE_OPINION_MANAGEMENT
QUEUE_PUBLISHED_RECOURSES=QUEUE_PUBLISHED_RECOURSES
QUEUE_IMPORT_REGISTRATION=QUEUE_IMPORT_REGISTRATION
MODULE_IMPORT_REGISTRATION_DRAFT=MODULE_IMPORT_REGISTRATION_DRAFT
QUEUE_ACCOUNTABILITY=QUEUE_ACCOUNTABILITY
MODULE_ACCOUNTABILITY_ADM=MODULE_ACCOUNTABILITY_ADM
MODULE_ACCOUNTABILITY_PROPONENT=MODULE_ACCOUNTABILITY_PROPONENT
PLUGIN_PUBLISHED_RECOURSES=PLUGIN_PUBLISHED_RECOURSES

## EMAIL
FORWARD_MAILPIT_DASHBOARD_PORT=8026
## SENTRY
SENTRY_LARAVEL_DSN=https://link_do_sentry
SENTRY_SEND_DEFAULT_PII=true
SENTRY_TRACES_SAMPLE_RATE=1.0

50 changes: 34 additions & 16 deletions .env.testing
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=pgsql
DB_HOST=db-email
DB_PORT=5432
DB_DATABASE=api_email_test
DB_USERNAME=api_email
DB_PASSWORD=pass
DB_HOST=ip_ou_servico
DB_PORT=5433
DB_DATABASE=api_email
DB_USERNAME=postgres
DB_PASSWORD=12345678

SESSION_DRIVER=database
SESSION_LIFETIME=120
Expand Down Expand Up @@ -82,17 +82,35 @@ NGINX_PHP_UPSTREAM_CONTAINER=php-fpm
NGINX_PHP_UPSTREAM_PORT=9000
NGINX_SSL_PATH=./docker/nginx/ssl/
### PARA AS FILAS
MAPA_URL=http://172.19.18.213:8088/
MAPA_URL=MAPA_URL

#### RABBITMW ####
RABBITMQ_DEFAULT_HOST=rabbitmq
RABBITMQ_DEFAULT_HOST=ip_ou_servico
RABBITMQ_DEFAULT_PORT=5672
RABBITMQ_DEFAULT_USER=mqadmin
RABBITMQ_DEFAULT_PASS=Admin123XX_
RABBITMQ_EXCHANGE_PLUGINS=pluginsTest
RABBITMQ_QUEUE_OPINIONS_PUBLISHED=opinionsPublishedTest
RABBITMQ_QUEUE_PC=msgs
RABBITMQ_QUEUE_PC_ROUTE_KEY_PROP=proponente
RABBITMQ_QUEUE_PC_ROUTE_KEY_ADM=resposta

JWT_SECRET=5l8Zu5i5HLFLtd1p4S8r5uk29hblJLLlr6P8jYsVj04n0354No5BtCqSudwk7sSM
RABBITMQ_DEFAULT_USER=user
RABBITMQ_DEFAULT_PASS=pass
RABBITMQ_ENABLED=true
RABBITMQ_EXCHANGE_DEFAULT=exchange_notification
QUEUE_OPINION_MANAGEMENT=queue_opinion_management
QUEUE_PUBLISHED_RECOURSES=queue_published_recourses
QUEUE_IMPORT_REGISTRATION=queue_import_registration
MODULE_IMPORT_REGISTRATION_DRAFT=module_import_registration_draft
QUEUE_ACCOUNTABILITY=queue_accountability
MODULE_ACCOUNTABILITY_ADM=module_accountability_adm
MODULE_ACCOUNTABILITY_PROPONENT=module_accountability_proponent
PLUGIN_PUBLISHED_RECOURSES=plugin_published_recourses

JWT_SECRET=JWT_SECRET

#### SENTRY ####
SENTRY_LARAVEL_DSN=https://dc2a046285a0767ee27902ea99506adc@o4508121592102912.ingest.us.sentry.io/4508160344915968
SENTRY_SEND_DEFAULT_PII=true
SENTRY_TRACES_SAMPLE_RATE=1.0

### auditing
AUDITING_ENABLED=false
AUDITING_USER_MODEL=App\Models\User
AUDITING_USER_MORPH_PREFIX=user
AUDITING_AUDIT_MODEL=App\Models\Audit
AUDITING_THRESHOLD=0
AUDITING_CONSOLE=true
52 changes: 33 additions & 19 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,29 +1,43 @@
FROM php:fpm-alpine3.20
FROM php:8.4-fpm

ENV TZ=America/Fortaleza

# Copia o código da aplicação para o contêiner
COPY . /var/www/html
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

RUN apk add --no-cache \
bash \
curl \
# Instala o Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

RUN apt-get update && apt-get install -y \
git \
nano \
curl \
supervisor \
libpng-dev \
libpq \
libjpeg-dev \
libfreetype6-dev \
libonig-dev \
libzip-dev \
zlib-dev \
linux-headers \
postgresql-dev \
# Extensões do PHP
&& docker-php-ext-install \
gd \
unzip \
zip \
pdo_pgsql \
sockets \
# Composer Install
&& composer install \
&& chown -R www-data:www-data /var/www/html \
# Limpeza dos pacotes
&& docker-php-source delete
libxml2-dev \
libpq-dev \
libicu-dev \
ca-certificates \
xz-utils \
gnupg \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd \
&& docker-php-ext-install pdo pdo_mysql mbstring exif pcntl bcmath opcache intl zip sockets \
&& /usr/bin/composer install \
&& rm -rf /var/lib/apt/lists/* \
&& chown -R www-data:www-data /var/www/html

COPY ./docker/production/supervisor/conf.d/* /etc/supervisor/conf.d/
COPY ./docker/production/supervisor/supervisord.conf /etc/supervisor/supervisord.conf

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]

EXPOSE 9000
6 changes: 1 addition & 5 deletions app/Console/Commands/ConsumePublishedOpinions.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,7 @@ class ConsumePublishedOpinions extends Command

protected $description = 'Consome fila com usuários que deverão ser notificados que os pareceres foram publicados';

public function __construct(
private readonly AmqpService $amqpService,
) {
parent::__construct();
}


/**
* @throws \Exception
Expand Down
50 changes: 39 additions & 11 deletions app/Console/Commands/ConsumePublishedRecourseEmails.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use App\Mail\PublishedRecourse;
use Exception;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
Expand Down Expand Up @@ -32,17 +33,44 @@ class ConsumePublishedRecourseEmails extends Command
*/
public function handle(): void
{
$queue = config('app.rabbitmq.queues.published_recourses_queue');
$queue = config('rabbitmq.queues.queue_published_recourses');
$connection = new AMQPStreamConnection(
config('app.rabbitmq.host'),
config('app.rabbitmq.port'),
config('app.rabbitmq.user'),
config('app.rabbitmq.pass'),
config('rabbitmq.host'),
config('rabbitmq.port'),
config('rabbitmq.user'),
config('rabbitmq.pass'),
'/',
);
$channel = $connection->channel();
$channel->queue_declare($queue, false, true, false, false);

$this->info('🎯 Aguardando e-mails para envio...');
$channel->exchange_declare(
config('rabbitmq.exchange_default'),
'direct',
false,
true,
false
);

$channel->queue_declare(
$queue,
false, // passive: false (cria se não existir)
true, // durable: true (igual à fila existente)
false, // exclusive: false (não deve ser exclusiva)
false, // auto_delete: false (não deletar automaticamente)
false, // nowait: false (espera confirmação)
null, // arguments: null (igual aos argumentos existentes)
null // ticket: null
);
// Vinculando
$channel->queue_bind(
$queue,
config('rabbitmq.exchange_default'),
config('rabbitmq.routing.plugin_published_recourses')
);


$this->info('🔄 Consumer iniciado. Aguardando mensagens...');
Log::info('🔄 Consumer iniciado. Aguardando mensagens...');

$channel->basic_consume(queue: $queue, callback: $this->processMessage(...));

Expand All @@ -58,11 +86,10 @@ private function sendEmail($data): bool
{
try {
Mail::to($data['email'])->send(new PublishedRecourse($data));

return true;
} catch (Exception $e) {
logger($e->getMessage());

\Sentry\captureMessage($e, \Sentry\Severity::info());
Log::error('Erro ao processar a mensagem');
return false;
}
}
Expand All @@ -74,10 +101,11 @@ protected function processMessage(AMQPMessage $msg): void
if ($this->sendEmail($data)) {
$msg->ack(); // Confirma o processamento
$this->info("📧 E-mail enviado para: {$data['email']}");

Log::info("📧 E-mail enviado para: {$data['email']}");
return;
}

$this->error("❌ Falha ao enviar e-mail para: {$data['email']}");
Log::error("❌ Falha ao enviar e-mail para: {$data['email']}");
}
}
16 changes: 9 additions & 7 deletions app/Console/Commands/ConsumerCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,16 @@ class ConsumerCommand extends Command
*/
public function handle(): int
{
$queue = config('app.rabbitmq.queues.accountability');
$queue = config('rabbitmq.queues.queue_accountability');

$connection = new AMQPStreamConnection(
config('app.rabbitmq.host'),
config('app.rabbitmq.port'),
config('app.rabbitmq.user'),
config('app.rabbitmq.pass'),
config('rabbitmq.host'),
config('rabbitmq.port'),
config('rabbitmq.user'),
config('rabbitmq.pass'),
'/',
);

$channel = $connection->channel();
$channel->queue_declare($queue, false, true, false, false);

Expand All @@ -60,15 +62,15 @@ protected function processMessage(AMQPMessage $msg): void
{
$data = json_decode($msg->body);

if ($msg->getRoutingKey() == config('app.rabbitmq.route_key_prop')) {
if ($msg->getRoutingKey() == config('rabbitmq.routing.module_accountability_proponent')) {
Mail::to($data->email)->send(new EmailRegistrationOpp(
$data->name,
$data->number,
$data->days
));
}

if ($msg->getRoutingKey() == config('app.rabbitmq.route_key_adm')) {
if ($msg->getRoutingKey() == config('rabbitmq.routing.module_accountability_adm')) {
Mail::to($data->comission)->cc($data->owner)->send(new AnswerNotification(
$data->registration
));
Expand Down
71 changes: 71 additions & 0 deletions app/Console/Commands/ImportRegistrationCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
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
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'rabbitmq:import-registration-command';

/**
* The console command description.
*
* @var string
*/
protected $description = 'Comando para consumir a fila des imports de inscrição';

protected $queueService;

public function __construct(RabbitMQService $queueService)
{
parent::__construct();
$this->queueService = $queueService;
}
/**
* Execultando 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);
});
}

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');
return;
}

foreach ($registrations as $registration) {
Mail::to($registration['agent_email'])->send(new ImporteRegistrationMail($registration));
Log::info('Email enviado para ' . $registration['agent_email']);

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