{"id":26742255,"url":"https://github.com/thiagooms/api-desafio-itau","last_synced_at":"2026-04-19T04:33:12.497Z","repository":{"id":284650331,"uuid":"955623755","full_name":"Thiagooms/api-desafio-itau","owner":"Thiagooms","description":"API REST para processamento de transações financeiras e cálculo de estatísticas em tempo real, este projeto foi desenvolvido como solução para o desafio técnico do Itaú Unibanco.","archived":false,"fork":false,"pushed_at":"2025-03-27T00:13:44.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-27T01:20:11.381Z","etag":null,"topics":["api","api-rest","backend","development","java","lombok","maven","spring-boot"],"latest_commit_sha":null,"homepage":"https://github.com/rafaellins-itau/desafio-itau-vaga-99-junior?tab=readme-ov-file","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Thiagooms.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-26T23:50:20.000Z","updated_at":"2025-03-27T00:15:42.000Z","dependencies_parsed_at":"2025-03-27T01:31:49.995Z","dependency_job_id":null,"html_url":"https://github.com/Thiagooms/api-desafio-itau","commit_stats":null,"previous_names":["thiagooms/api-desafio-itau"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thiagooms%2Fapi-desafio-itau","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thiagooms%2Fapi-desafio-itau/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thiagooms%2Fapi-desafio-itau/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thiagooms%2Fapi-desafio-itau/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Thiagooms","download_url":"https://codeload.github.com/Thiagooms/api-desafio-itau/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245978282,"owners_count":20703678,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","api-rest","backend","development","java","lombok","maven","spring-boot"],"created_at":"2025-03-28T06:17:15.239Z","updated_at":"2026-04-19T04:33:12.485Z","avatar_url":"https://github.com/Thiagooms.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n # desafio-itau-vaga-junior\n # Itaú Unibanco - Desafio de Programação\n \n Este é um desafio bacana tanto de desenvolvimento de software quanto de engenharia de software. Queremos testar sua capacidade de construir um software com várias partes diferentes funcionando em conjunto!\n \n ## 1. Introdução\n \n Sua missão, caso você aceite, é criar uma API REST que recebe Transações e retorna Estatísticas sob essas transações. Para este desafio, a API deve ser criada utilizando-se de Java ou [Kotlin](https://kotlinlang.org/) e Spring Boot.\n \n Um bom lugar para se começar é o [Spring Starter](https://start.spring.io/).\n \n \u003e**Dica:** Não existe uma forma certa ou errada de resolver o desafio! Vamos avaliar coisas como a qualidade do seu código, o quão fácil é de compreender o código, organização do projeto, quantidade e qualidade dos testes, preocupação com segurança e vários outros fatores :)\n \n ## 2. Definição do desafio\n \n Neste desafio você deve **criar uma API REST** no [GitHub](https://github.com/) ou [GitLab](https://gitlab.com/). **Leia com atenção todas as instruções a seguir!**\n \n ### 2.1. Restrições Técnicas\n \n Seu projeto:\n \n - **DEVE** estar no [GitHub](https://github.com/) ou [GitLab](https://gitlab.com/)\n - **NÃO DEVE** fazer _fork_ de nenhum outro projeto\n - **DEVE** ter pelo menos 1 commit por cada endpoint (mínimo de 3 commits)\n   - Queremos ver a evolução do seu projeto com o tempo ;)\n - Todos os commits **DEVEM** ser feitos pelo mesmo usuário que criou o projeto\n   - Entendemos que algumas pessoas tem usuários pessoais e profissionais, ou um usuário diferente usado para estudar. Atenção com isso se você for uma dessas pessoas!\n - **DEVE** seguir exatamente os _endpoints_ descritos a seguir\n   - Por exemplo, `/transacao` não é a mesma coisa que `/transacoes`\n - **DEVE** aceitar e responder com objetos exatamente como descritos a seguir\n   - Por exemplo, `dataHora` não é a mesma coisa que `data-hora` ou `dtTransacao`\n - **NÃO DEVE** utilizar quaisquer sistemas de banco de dados (como H2, MySQL, PostgreSQL, ...) ou cache (como Redis, Memcached, Infinispan, ...)\n - **DEVE** armazenar todos os dados **em memória**\n - **DEVE** aceitar e responder apenas com [JSON](https://www.json.org/json-pt.html)\n \n \u003e**Atenção!** Por motivos de segurança, não podemos aceitar projetos enviados como arquivos. Você **DEVE** disponibilizar seu projeto publicamente para que possamos acessá-lo e corrigi-lo! Após receber uma resposta de nós, sinta-se livre para tornar seu projeto **privado** :)\n \n ### 2.2. Endpoints da API\n \n A seguir serão especificados os endpoints que devem estar presentes na sua API e a funcionalidade esperada de cada um deles.\n \n #### 2.2.1. Receber Transações: `POST /transacao`\n \n Este é o endpoint que irá receber as Transações. Cada transação consiste de um `valor` e uma `dataHora` de quando ela aconteceu:\n \n ```json\n {\n     \"valor\": 123.45,\n     \"dataHora\": \"2020-08-07T12:34:56.789-03:00\"\n }\n ```\n \n Os campos no JSON acima significam o seguinte:\n \n | Campo      | Significado                                                   | Obrigatório? |\n |------------|---------------------------------------------------------------|--------------|\n | `valor`    | **Valor em decimal com ponto flutuante** da transação         | Sim          |\n | `dataHora` | **Data/Hora no padrão ISO 8601** em que a transação aconteceu | Sim          |\n \n \u003e**Dica:** O Spring Boot, por padrão, consegue compreender datas no padrão ISO 8601 sem problemas. Experimente utilizar um atributo do tipo `OffsetDateTime`!\n \n A API só aceitará transações que:\n \n 1. Tenham os campos `valor` e `dataHora` preenchidos\n 2. A transação **NÃO DEVE** acontecer no futuro\n 3. A transação **DEVE** ter acontecido a qualquer momento no passado\n 4. A transação **NÃO DEVE** ter valor negativo\n 5. A transação **DEVE** ter valor igual ou maior que `0` (zero)\n \n Como resposta, espera-se que este endpoint responda com:\n \n - `201 Created` sem nenhum corpo\n   - A transação foi aceita (ou seja foi validada, está válida e foi registrada)\n - `422 Unprocessable Entity` sem nenhum corpo\n   - A transação **não** foi aceita por qualquer motivo (1 ou mais dos critérios de aceite não foram atendidos - por exemplo: uma transação com valor menor que `0`)\n - `400 Bad Request` sem nenhum corpo\n   - A API não compreendeu a requisição do cliente (por exemplo: um JSON inválido)\n \n #### 2.2.2. Limpar Transações: `DELETE /transacao`\n \n Este endpoint simplesmente **apaga todos os dados de transações** que estejam armazenados.\n \n Como resposta, espera-se que este endpoint responda com:\n \n - `200 OK` sem nenhum corpo\n   - Todas as informações foram apagadas com sucesso\n \n #### 2.2.3. Calcular Estatísticas: `GET /estatistica`\n \n Este endpoint deve retornar estatísticas das transações que **aconteceram nos últimos 60 segundos (1 minuto)**. As estatísticas que devem ser calculadas são:\n \n ```json\n {\n     \"count\": 10,\n     \"sum\": 1234.56,\n     \"avg\": 123.456,\n     \"min\": 12.34,\n     \"max\": 123.56\n }\n ```\n \n Os campos no JSON acima significam o seguinte:\n \n |  Campo  | Significado                                                   | Obrigatório? |\n |---------|---------------------------------------------------------------|--------------|\n | `count` | **Quantidade de transações** nos últimos 60 segundos          | Sim          |\n | `sum`   | **Soma total do valor** transacionado nos últimos 60 segundos | Sim          |\n | `avg`   | **Média do valor** transacionado nos últimos 60 segundos      | Sim          |\n | `min`   | **Menor valor** transacionado nos últimos 60 segundos         | Sim          |\n | `max`   | **Maior valor** transacionado nos últimos 60 segundos         | Sim          |\n \n \u003e**Dica:** Há um objeto no Java 8+ chamado `DoubleSummaryStatistics` que pode lhe ajudar ou servir de inspiração.\n \n Como resposta, espera-se que este endpoint responda com:\n \n - `200 OK` com os dados das estatísticas\n   - Um JSON com os campos `count`, `sum`, `avg`, `min` e `max` todos preenchidos com seus respectivos valores\n   - **Atenção!** Quando não houverem transações nos últimos 60 segundos considere todos os valores como `0` (zero)\n \n ## 4. Extras\n \n Vamos propôr a seguir alguns desafios extras caso você queira testar seus conhecimentos ao máximo! Nenhum desses requisitos é obrigatório, mas são desejados e podem ser um diferencial!\n \n 1. **Testes automatizados:** Sejam unitários e/ou funcionais, testes automatizados são importantes e ajudam a evitar problemas no futuro. Se você fizer testes automatizados, atente-se na efetividade dos seus testes! Por exemplo, testar apenas os \"caminhos felizes\" não é muito efetivo.\n 2. **Containerização:** Você consegue criar meios para disponibilizar sua aplicação como um container? _OBS: Não é necessário publicar o container da sua aplicação!_\n 3. **Logs:** Sua aplicação informa o que está acontecendo enquanto ela trabalha? Isso é útil para ajudar as pessoas desenvolvedoras a solucionar eventuais problemas que possam ocorrer.\n 4. **Observabilidade:** Sua API tem algum endpoint para verificação da saúde da aplicação (healthcheck)?\n 5. **Performance:** Você consegue estimar quanto tempo sua aplicação gasta para calcular as estatísticas?\n 6. **Tratamento de Erros:** O Spring Boot dá às pessoas desenvolvedoras ferramentas para se melhorar o tratamento de erros padrão. Você consegue alterar os erros padrão para retornar _quais_ erros ocorreram?\n 7. **Documentação da API:** Você consegue documentar sua API? Existem [ferramentas](https://swagger.io/) e [padrões](http://raml.org/) que podem te ajudar com isso!\n 8. **Documentação do Sistema:** Sua aplicação provavelmente precisa ser construída antes de ser executada. Você consegue documentar como outra pessoa que pegou sua aplicação pela primeira vez pode construir e executar sua aplicação?\n 9. **Configurações:** Você consegue deixar sua aplicação configurável em relação a quantidade de segundos para calcular as estatísticas? Por exemplo: o padrão é 60 segundos, mas e se o usuário quiser 120 segundos?\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthiagooms%2Fapi-desafio-itau","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthiagooms%2Fapi-desafio-itau","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthiagooms%2Fapi-desafio-itau/lists"}