Este projeto é um serviço de web crawler que busca por palavras-chave em websites. A aplicação permite iniciar buscas por palavras-chave e consultar os resultados através de uma API REST. O sistema rastreia páginas web a partir de uma URL base, identificando todas aquelas que contenham a palavra-chave especificada.
O projeto segue uma arquitetura hexagonal (também conhecida como Ports and Adapters), organizando o código em camadas bem definidas:
com.axreng.backend
├── application # Camada de aplicação (casos de uso)
│ ├── dto # Objetos de transferência de dados
│ └── service # Serviços da aplicação
├── domain # Camada de domínio (regras de negócio)
│ ├── entity # Entidades de domínio
│ ├── repository # Interfaces de repositórios
│ └── exception # Exceções de domínio
└── infrastructure # Camada de infraestrutura
├── adapter # Adaptadores
│ ├── driven # Adaptadores controlados (saída)
│ │ ├── persistence # Implementações de persistência
│ │ └── util # Utilitários
│ └── driving # Adaptadores controladores (entrada)
│ ├── web # Controladores web
│ └── task # Tarefas em background
└── config # Configurações
- Search: Entidade principal que representa uma busca, contendo ID, palavra-chave, status e URLs encontrados.
- SearchStatus: Enum que representa os possíveis estados de uma busca (ACTIVE, DONE).
- SearchRepository: Interface para operações de persistência relacionadas às buscas.
- SearchService: Serviço que implementa os casos de uso para iniciar e consultar buscas.
- SearchController: Controlador REST que expõe endpoints para iniciar e consultar buscas.
- WebCrawlerTask: Implementação do crawler que executa a busca em background, visitando páginas web a partir de uma URL base e identificando aquelas que contêm a palavra-chave.
- InMemorySearchRepository: Implementação do repositório que armazena as buscas em memória.
A aplicação expõe os seguintes endpoints:
-
POST /crawl
- Inicia uma nova busca
- Recebe um JSON com a palavra-chave a ser buscada
- Retorna um ID único para a busca
-
GET /crawl/:id
- Consulta o status e resultados de uma busca
- Retorna um JSON com status (ACTIVE ou DONE) e URLs encontrados
- Executa em background (thread separada) após iniciar uma busca
- Rastreia até 1000 páginas a partir da URL base
- Armazena até 100 URLs que contenham a palavra-chave
- Utiliza uma estratégia de busca em largura (BFS) para percorrer as páginas
- Java 14: Linguagem de programação
- Maven: Gerenciamento de dependências e build
- Spark Java: Framework web para criação da API REST
- Gson: Serialização/deserialização JSON
- JUnit, Mockito e Hamcrest: Frameworks para testes
- Java 14
- Maven
- Docker (opcional)
- PORT: Porta onde o serviço será executado (padrão: 4567)
- BASE_URL: URL base a partir da qual o crawler iniciará a busca
export BASE_URL="https://example.com/"
mvn clean verify exec:java
docker build -t crawler-service .
docker run -p 4567:4567 -e BASE_URL="https://example.com/" crawler-service
curl -X POST http://localhost:4567/crawl \
-H "Content-Type: application/json" \
-d '{"keyword": "exemplo"}'
Resposta:
{"id": "abc123"}
curl -X GET http://localhost:4567/crawl/abc123
Resposta:
{
"id": "abc123",
"keyword": "exemplo",
"status": "DONE",
"urls": [
"https://example.com/page1",
"https://example.com/page2"
]
}