C4 - Componentes (L3)
Introdução ao documento
Este documento descreve a arquitetura de componentes do serviço no nível C4 L3.
Versionamento
- Versão do documento: 1.0.0
- Última atualização: 2026-03-09
- Responsável: Marivaldo Vinicius
Referencial teórico
Escopo
- Serviço/app:
dhedalos-app-dashboard-laravel
Responsabilidade
Sistema de dashboard administrativo que fornece:
- Interface administrativa via Backpack for Laravel
- API REST para consumo de dados
- Processamento assíncrono de cache
- Integração com serviços externos (Gemini, AoVivo, WordPress)
- Análise de sentimento de textos
Dependências
- Banco: MySQL (principal), Redshift/PostgreSQL (analítico)
- Cache: Laravel Cache (Redis/Memcached/File)
- Fila: Laravel Queue (Redis/Sync)
- Storage: Laravel Filesystem (local/S3)
- Externos: Google Gemini API, AoVivo API, WordPress API
Detalhes de integrações: docs/overview.md
Componentes internos
Controllers API
12 controllers responsáveis por endpoints REST:
- SentimentController: Análise de sentimento via Google Gemini API
- InscricoesController: Dados de inscrições do Redshift
- AgendamentoController: Dados de agendamentos
- NPS Controllers: 4 controllers para NPS por produto (UP Marketing, UP Finanças, Decola MEI, Mulheres em Foco)
- AoVivoController: Estatísticas de cursos ao vivo via WordPress API
- AoVivoIntegracaoController: Integração direta com AoVivo API
- AdminLogsController: Logs administrativos
- ColunasController: Configuração de colunas visíveis
- CacheController: Gerenciamento de cache (endpoints autenticados)
Controllers Admin
24 controllers para painel administrativo Backpack, organizados por funcionalidade:
Relatórios e Dashboards:
GeneralController: Dashboard principalAgendaController,FacilitadoresController,NPSController,ProgressoCursoControllerAquisicaoTrafegoController,EngajamentoControllerCursoController,TurmaController: Detalhes de curso/turmaNewAoVivoController: Cursos ao vivoHistoricoController: Perfil de inscritos
Administração:
CacheController,ConfigController,ColunasController: ConfiguraçõesMaintenanceModeController: Modo de manutençãoAccessTokenController: Tokens de acessoAdminLogsController,LogsController: Visualização de logsPermissaoController: Gerenciamento de permissõesRoleCrudController,UsuariosController: CRUD de roles e usuários (via Backpack PermissionManager)
Utilitários:
ExportFileController: Exportação de dadosALIsController: Parceiros
Services
2 services para lógica de negócio e integrações:
-
EnrollmentStatsService: Integração com WordPress API para estatísticas de inscrições
- Métodos:
getEnrollmentStats(),getEnrollmentStatsWithShift(),getCycles(),getAvailableCourses(),getAvailableCyclesByCourse() - Autenticação via Svc token
- Cache com TTL variável (1 minuto a 4 horas)
- Métodos:
-
AdminLogsService: Processamento de logs administrativos
Jobs
8 jobs para processamento assíncrono via Laravel Queue:
-
RefreshData: Atualização de cache de inscrições, cursos e agendamentos
- Conecta ao Redshift (conexão
pgsql) para buscar dados - Comprime dados com gzip antes de armazenar no cache
- Métodos:
refreshInscricoes(),refreshCursos(),refreshAgendamento()
- Conecta ao Redshift (conexão
-
Cache Jobs específicos: 7 jobs dedicados para atualização de cache por domínio
InscricoesCacheJob,AgendamentoCacheJob,CursosCacheJobNPSUpMarketingCacheJob,NPSUpFinancasCacheJob,NPSDecolaMeiCacheJob,NPSMulheresEmFocoCacheJob
Models
4 models Eloquent:
-
User: Usuários do sistema com roles e permissões (Spatie Permissions)
- Traits:
HasRoles,HasApiTokens(Sanctum),CrudTrait(Backpack)
- Traits:
-
MaintenanceMode: Controle de modo de manutenção
-
PlainTextToken: Tokens de acesso simples
-
VisibleColumnsConfig: Configuração de colunas visíveis por usuário
Middlewares
7 middlewares customizados:
- ForceJsonResponse: Força resposta JSON em APIs
- GzipMiddleware: Compressão GZIP de respostas HTTP
- RedirectIfMaintenanceModeActive: Redireciona se modo manutenção ativo
- HydrateCacheView: Hidrata cache para views do Backpack
- RedirectApenasAoVivo: Redirecionamento específico para funcionalidade AoVivo
- CheckIfAdmin: Verificação de permissão admin
- ViewLogs: Controle de acesso para visualização de logs
Frontend React
Frontend React/TypeScript organizado em:
- Pages: 22 páginas principais correspondentes às rotas do admin
- Components: Componentes reutilizáveis (ButtonGroup, Calendar, ChartCard, SentimentAnalysis, etc.)
- Charts: 114 arquivos de componentes de gráficos (Highcharts)
- Tables: 33 arquivos de componentes de tabelas
- Contexts: 11 contextos React para gerenciamento de estado (InscricoesContext, NPSContexts, LiveContexts, etc.)
- Hooks: 25 hooks customizados
- Types: Definições TypeScript para tipos de dados
Fluxos críticos
1. Análise de Sentimento
Frontend → POST /api/v1/sentiment → SentimentController → Gemini API → Cache → Response
O SentimentController recebe texto, verifica cache, e se não existir ou for solicitado refresh, chama a Google Gemini API com prompt estruturado. Resultado é cacheado e retornado ao frontend.
2. Busca de Dados AoVivo via WordPress
Frontend → GET /api/v1/ao-vivo/* → AoVivoController → EnrollmentStatsService → WordPress API → Cache → Response
O AoVivoController utiliza o EnrollmentStatsService que faz requisições autenticadas ao WordPress API. Dados são cacheados com TTL variável (1 minuto a 4 horas) dependendo do tipo de informação.
3. Integração AoVivo API Direta
API → GET /api/v1/dhedalos/v1/live/* → AoVivoIntegracaoController → AoVivo API → Cache → Response
O AoVivoIntegracaoController faz requisições diretas à AoVivo API com autenticação Bearer token. Cache com TTL de 30 segundos para dados frequentemente atualizados.
4. Atualização de Cache via Jobs
Laravel Queue → RefreshData Job → Redshift (pgsql) → Processamento → Compressão GZIP → Laravel Cache
Jobs processam dados do Redshift, comprimem com gzip e armazenam no cache Laravel. Otimiza performance ao evitar consultas diretas ao data warehouse em cada requisição.
5. Autenticação API
Request → Middleware (auth:sanctum) → User (HasApiTokens) → Controller
Autenticação baseada em Laravel Sanctum. Middleware auth:sanctum verifica token, modelo User utiliza trait HasApiTokens. Decisão arquitetural: docs/adr/0001-architecture-overview.md