2.7 KiB
2.7 KiB
Etapa 06 — API REST do backend
Objetivo
Expor os endpoints REST que o frontend vai consumir: autenticação, disparo de buscas, consulta/listagem de leads, exportação e curadoria de ramos.
Contexto
Esta etapa também implementa a persistência com deduplicação (que ainda não existia nas etapas anteriores) e o worker que processa buscas pendentes de forma assíncrona.
Tarefas
- Criar
security/com autenticação JWT:POST /auth/login— recebe email/senha, retorna token JWT- Proteger todos os demais endpoints exigindo o token
- Criar
worker/BuscaWorker:- Processo assíncrono (
@Scheduledcom polling, ou@Async) que busca registrosbuscascom statuspendente, executa oBuscaOrchestrator(etapas 03+05) e, ao final, aplica oLeadNormalizerService(etapa 04) em cada lead extraído - Antes de persistir, checar duplicidade por
hash_dedupeplace_id; se já existir, atualizar o vínculo com a nova busca em vez de duplicar - Atualizar
busca.status,busca.total_encontrados,busca.finalizado_emao concluir (ouerro+detalhe_erroem caso de falha)
- Processo assíncrono (
- Criar
controller/BuscaController:POST /buscas— cria uma nova busca (termo, localização, ramo opcional) com statuspendenteGET /buscas— lista buscas (paginado, filtrável por status)GET /buscas/{id}— detalhe de uma busca específica, incluindo status e total de leads encontrados
- Criar
controller/LeadController:GET /leads— lista leads paginada, com filtros por ramo, cidade/UF, status, busca de origemGET /leads/{id}— detalhe de um leadPATCH /leads/{id}/status— atualizar status do lead (novo, contatado, qualificado, convertido, descartado)GET /leads/export— exportação em CSV dos leads filtrados
- Criar
controller/RamoController:GET /ramos— lista ramos cadastradosPOST /ramos— cria novo ramo (curadoria manual)PATCH /ramos/{id}/aliases— adiciona um alias a um ramo existente (para a fila de curadoria de categorias sem mapeamento)GET /leads/sem-ramo— lista leads comramo_id = nullpendentes de curadoria
- Documentar a API (Swagger/OpenAPI via springdoc) para facilitar a integração do frontend
Critérios de aceite
- Login retorna JWT válido e endpoints protegidos rejeitam requisição sem token
- Criar uma busca via API resulta, em segundos/minutos, em leads persistidos sem duplicação
- Listagem de leads suporta paginação e os filtros definidos
- Exportação CSV funciona com os filtros aplicados
- Fila de curadoria de ramos (
/leads/sem-ramo) reflete corretamente os leads sem mapeamento - Documentação Swagger acessível e atualizada