📰 Publique Sua Notícia Popular - Documentação Técnica Completa
🚀 Visão Geral
O Publique Sua Notícia Popular é uma plataforma full-stack para criação, edição, publicação e consumo de notícias, com autenticação social via Google, suporte administrativo e recursos de inteligência artificial para aceleração editorial.
O projeto foi implementado com foco em separação de responsabilidades, adotando módulos por domínio no backend (estilo Clean Architecture) e frontend Angular com componentes standalone, estado reativo com signals e experiência moderna de publicação.
🎯 Proposta de Valor
- Publicação rápida de notícias com editor em blocos
- Fluxo social completo: comentários e curtidas em notícias/comentários
- Autenticação Google + JWT com controle de acesso por papel (USUARIO/ADMIN)
- Assistente de IA editorial para gerar/refinar texto, título e submanchete
- Operação containerizada para desenvolvimento e produção
🏗️ Arquitetura de Alto Nível
%%{title: "Publique Sua Noticia Popular - High-Level Architecture"}%%
graph TB
A[Angular 21 Frontend] --> B[Spring Boot 3.4 API]
B --> C[PostgreSQL 16]
B --> D[Google OAuth Validation]
B --> E[Gemini API]
B --> F[Storage Local /uploads]
G[Admin e Editor] --> A
H[Leitores e Autores] --> A
subgraph Frontend
A
end
subgraph Backend
B
F
end
subgraph Integracoes Externas
D
E
end
subgraph Dados
C
end
Fluxo Principal do Sistema
1. Usuário acessa o frontend Angular
2. Login Google é realizado no browser
3. Backend valida token Google e emite JWT (access + refresh)
4. Usuário navega no feed público de notícias
5. Usuário autenticado publica/edita notícia via editor em blocos
6. Notícias podem receber curtidas e comentários
7. IA pode auxiliar na escrita e refinamento de conteúdo
8. Administradores gerenciam usuários, categorias e indicadores
🔄 Arquitetura de Comunicação
Fluxo de Autenticação e Sessão
%%{title: "Publique Sua Noticia Popular - Authentication and Session Flow"}%%
sequenceDiagram
participant U as Usuario (Browser)
participant F as Angular Frontend
participant G as Google Identity
participant B as Spring Boot API
participant DB as PostgreSQL
U->>F: Clica em "Entrar com Google"
F->>G: Inicializa GSI e recebe credential
F->>B: POST /api/v1/auth/google
B->>G: Valida Google ID Token
G-->>B: Claims validas (sub, email, nome, avatar)
B->>DB: Cria/atualiza usuario
B-->>F: accessToken + refreshToken
F->>B: GET /api/v1/auth/perfil (Bearer)
B-->>F: PerfilUsuarioDTO
Fluxo de Publicação e Interação
%%{title: "Publique Sua Noticia Popular - Publishing and Interaction Flow"}%%
sequenceDiagram
participant E as Editor Angular
participant B as Backend API
participant IA as Gemini API
participant DB as PostgreSQL
E->>B: POST /api/v1/upload/imagem (multipart)
B-->>E: URL publica /uploads/{arquivo}
E->>B: POST /api/v1/noticias
B->>DB: Persiste noticia (PUBLICADA ou RASCUNHO)
B-->>E: NoticiaDTO
E->>B: POST /api/v1/ia/reescrever-noticia
B->>IA: Prompt estruturado
IA-->>B: Texto refinado
B-->>E: TextoGeradoResponse
E->>B: POST /api/v1/noticias/{id}/comentarios
E->>B: POST /api/v1/reacoes/toggle
B->>DB: Atualiza comentarios/reacoes
🧱 Stack Tecnológica
Backend (Java + Spring)
- Java 21
- Spring Boot 3.4.1
- Spring Web + Validation + Security + Actuator
- Spring Data JPA + Hibernate
- Liquibase para versionamento de schema
- JWT com
jjwt - WebClient (Spring WebFlux) para integração Gemini
- Validação de token Google com
google-api-client
Frontend (Angular)
- Angular 21.2 (standalone components)
- TypeScript 5.9
- Signals + zoneless change detection
- HttpClient com interceptors de auth/erro
- UI com tema dark glassmorphism
Banco e Infraestrutura
- PostgreSQL 16
- Docker / Docker Compose (dev e prod)
- Nginx para entrega do frontend em produção
🧩 Organização de Código
Backend por Módulos de Domínio
Estrutura recorrente por módulo:
<modulo>/
application/
dtos/
ports/
usecases/
domain/
entities/
valueobjects/
exceptions/
infrastructure/
web/
persistence/
adapters/
Módulos principais:
autenticacaonoticiascategoriascomentariosreacoesinteligenciaartificialadminkernel(segurança, CORS, exceções globais, filtros)
Frontend por Features
components/feed(home, filtros e paginação)components/editor(criação/edição com blocos e IA)components/noticia-detalhe(leitura + reação)components/comentarios(CRUD + likes)components/admin/*(dashboard, usuários, categorias)services/*(integração com API)core/guardsecore/interceptors
🎯 Funcionalidades Principais
1. Autenticação e Autorização
- Login via Google Identity Services
- Backend valida ID token Google e emite JWT
- Access token + refresh token
- Políticas de papel:
USUARIOpor padrão- promoção para
ADMINpor e-mail configurado emADMIN_GOOGLE_EMAILS
- Rotas administrativas protegidas por role ADMIN
2. Gestão de Notícias
- Feed público com filtros por categoria, busca e ordenação:
MAIS_RECENTEMAIS_ANTIGOMAIS_VISTOMAIS_CURTIDO
- Criação de notícia com opção de publicar imediatamente
- Edição e exclusão por autor ou admin
- Incremento de visualizações no acesso ao detalhe
- Área "Minhas Publicações" com paginação
3. Editor em Blocos
- Blocos de conteúdo:
- parágrafo
- títulos (h1/h2/h3)
- citação
- lista
- imagem inline
- Upload de capa e imagens inline
- Ajuste de posição vertical da imagem de capa (
coverY) - Slash menu para formatação e ações de IA
4. Comentários e Reações
- Comentários por notícia
- Ordenação de comentários por:
- mais recentes
- mais antigos
- mais curtidos
- Curtidas com toggle para:
- notícia
- comentário
- Permissão de exclusão de comentário:
- autor do comentário
- administrador
5. Inteligência Artificial (Gemini)
Endpoints de IA disponíveis:
- gerar imagem
- gerar texto
- refinar texto
- reescrever notícia
- melhorar título
- melhorar submanchete
Comportamentos observados:
- Geração de texto usa Gemini via WebClient
- Geração de imagem hoje retorna URL fallback (
picsum) no adapter atual
6. Módulo Administrativo
- Dashboard consolidado:
- total de usuários
- total de notícias
- notícias publicadas
- notícias em rascunho
- total de categorias
- Listagem de usuários e ativação/desativação
- CRUD essencial de categorias (criar, atualizar, desativar)
🔐 Segurança, Validação e Resiliência
Segurança HTTP
- API stateless com JWT Bearer
- Rotas públicas:
/api/v1/auth/**GET /api/v1/categorias/**GET /api/v1/noticias/**/uploads/**/actuator/health,/actuator/info
- Rotas protegidas:
/api/v1/admin/**requer role ADMIN- demais exigem autenticação
Validações de Entrada
- DTOs com Bean Validation (
@NotBlank,@Size,@NotNull) - Exemplos:
- título da notícia até 255 chars
- resumo até 500 chars
- comentário até 1000 chars
Tratamento de Erros
GlobalExceptionHandlercentralizado com payload padronizado- Códigos específicos para:
- entidade não encontrada
- regra de negócio
- validação
- acesso negado
- erro interno
Observabilidade
X-Request-Idem todas as respostas viaRequestIdFilter- Actuator habilitado para health/info/metrics
🗄️ Modelo de Dados e Migrations
Tabelas Principais
usuariosrefresh_tokenscategoriasnoticiascomentariosreacoes
Destaques de Modelagem
categoriasseeded via Liquibase data changelognoticiaspossui status (RASCUNHO,PUBLICADA,ARQUIVADA)reacoespossui unicidade por(usuario_id, alvo_tipo, alvo_id)comentarios.noticia_idcom delete cascade
🌐 Superfície de API (Resumo)
Autenticação
POST /api/v1/auth/googlePOST /api/v1/auth/refreshGET /api/v1/auth/perfil
Notícias
GET /api/v1/noticiasGET /api/v1/noticias/{id}GET /api/v1/noticias/minhasPOST /api/v1/noticiasPUT /api/v1/noticias/{id}DELETE /api/v1/noticias/{id}
Comentários e Reações
GET /api/v1/noticias/{noticiaId}/comentariosPOST /api/v1/noticias/{noticiaId}/comentariosDELETE /api/v1/noticias/{noticiaId}/comentarios/{comentarioId}POST /api/v1/reacoes/toggle
Categorias
GET /api/v1/categoriasPOST /api/v1/categorias(ADMIN)PUT /api/v1/categorias/{id}(ADMIN)DELETE /api/v1/categorias/{id}(ADMIN)
IA
POST /api/v1/ia/gerar-imagemPOST /api/v1/ia/gerar-textoPOST /api/v1/ia/refinar-textoPOST /api/v1/ia/reescrever-noticiaPOST /api/v1/ia/melhorar-tituloPOST /api/v1/ia/melhorar-submanchete
Admin
GET /api/v1/admin/dashboardGET /api/v1/admin/usuariosPATCH /api/v1/admin/usuarios/{id}
Upload
POST /api/v1/upload/imagemDELETE /api/v1/upload/imagem/{nomeArquivo}
🐳 Execução e Deploy
Desenvolvimento Local
Arquivos principais:
docker-compose.ymlbackend/Dockerfile.devfrontend/Dockerfile.dev
Serviços:
- PostgreSQL
- Backend Spring Boot (com debug port 5005)
- Frontend Angular (porta 4300 no host)
- pgAdmin (profile opcional
tools)
Produção
Arquivos principais:
docker-compose.prod.ymlbackend/Dockerfile(multi-stage)frontend/Dockerfile(build Angular + nginx)
Características:
- limites de memória por serviço
- frontend servido por nginx
- healthcheck de backend via actuator
⚙️ Variáveis de Ambiente Relevantes
- Banco:
PG_DATABASE,PG_USER,PG_PASSWORD,PG_HOST_PORT
- Backend:
BACKEND_HOST_PORT,CORS_ORIGINS
- Segurança:
JWT_SECRET,JWT_EXPIRATION
- Google OAuth:
GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,ADMIN_GOOGLE_EMAILS
- IA:
GEMINI_API_KEY
- Frontend runtime/build:
NG_APP_API_URLNG_APP_GOOGLE_CLIENT_ID
🧪 Qualidade e Testes
O backend está preparado com dependências de teste para:
- Spring Boot Test
- Spring Security Test
- ArchUnit
- Testcontainers (incluindo PostgreSQL)
O frontend utiliza:
- Runner de testes via Angular builder
- Vitest como dependência de projeto
📈 Pontos Fortes Técnicos
- Boa separação por domínio e casos de uso
- Segurança consistente entre frontend e backend
- Feed e comentários com ordenação por popularidade (likes)
- Editor rico com fluxo de publicação eficiente
- Infra Docker pronta para dev/prod
⚠️ Observações Técnicas Atuais
- O adapter de geração de imagem IA retorna fallback randômico no estado atual.
- JWT secret deve estar em Base64 válido para assinatura HMAC funcionar corretamente.
- O frontend depende de
environment.generated.ts(gerado por script) para API URL e Google Client ID.