Este repositório contém a solução para o desafio de programação proposto pelo Itaú Unibanco. O desafio consiste em criar uma API REST que recebe transações e retorna estatísticas baseadas nessas transações.
A aplicação foi desenvolvida utilizando Java com Spring Boot, e os dados são armazenados em memória utilizando a estrutura ConcurrentLinkedQueue.
A API implementa os seguintes endpoints:
-
POST
/transacao
Recebe transações e as armazena em memória. Cada transação contém um valor e uma data/hora de ocorrência. -
DELETE
/transacao
Limpa todos os dados de transações armazenados. -
GET
/estatistica
Retorna as estatísticas das transações do tipoDoubleSummaryStatistics
, que ocorreram nos últimos 60 segundos. As estatísticas incluem:- Quantidade de transações
- Soma total dos valores das transações
- Média dos valores
- Menor valor
- Maior valor
- Tecnologia: A aplicação foi desenvolvida utilizando Java 17 com Spring Boot 3.4.4.
- Armazenamento: Os dados são armazenados em memória utilizando uma ConcurrentLinkedQueue, que garante a segurança em acesso concorrente.
- Formato de dados: A API utiliza JSON para comunicação.
Envie uma transação no formato JSON:
{
"valor": 300.49,
"dataHora": "2025-03-30T20:15:10.789-03:00"
}
Resposta:
- 201 Created: Quando a transação for válida e armazenada.
- 422 Unprocessable Entity: Quando a transação for inválida.
- 400 Bad Request: Quando o formato JSON estiver errado.
Este endpoint limpa todas as transações armazenadas. Resposta:
- 200 OK: Quando as transações forem apagadas com sucesso.
Este endpoint retorna as estatísticas das transações do tipo DoubleSummaryStatistics
, realizadas nos últimos 60 segundos. Exemplo de resposta:
{
"count": 3,
"sum": 500.48,
"avg": 166.82666666666668,
"min": 49.99,
"max": 300.49
}
As transações são validadas com os seguintes critérios:
- O campo
valor
não pode ser negativo. - O campo
dataHora
não pode ser no futuro. - O valor da transação deve ser maior ou igual a 0.
As transações são armazenadas em memória utilizando uma ConcurrentLinkedQueue
. Essa estrutura permite um acesso seguro em ambientes multithreaded, o que é importante caso haja concorrência no armazenamento das transações.
As estatísticas são calculadas através de um pacote utilitário do java DoubleSummaryStatistics
, que através de um filtro retorna apenas transações realizadas nos últimos 60 segundos 1 minuto
. Se não houver transações no período, as estatísticas retornam valores zero.
Este projeto utiliza as seguintes dependências do Spring Boot:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Essas dependências garantem o funcionamento da API, validação dos dados, e ferramentas de desenvolvimento e teste para o projeto.
Sinta-se à vontade para abrir issues ou enviar pull requests com melhorias, correções ou novas funcionalidades.
Este projeto está licenciado sob a MIT License - veja o arquivo LICENSE para mais detalhes.