{"id":19009430,"url":"https://github.com/feltex/desafio-itau-backend","last_synced_at":"2025-10-08T11:02:09.168Z","repository":{"id":233605754,"uuid":"787532364","full_name":"feltex/desafio-itau-backend","owner":"feltex","description":"Desafio de vaga de emprego para o banco Itaú","archived":false,"fork":false,"pushed_at":"2024-04-22T23:05:00.000Z","size":23,"stargazers_count":179,"open_issues_count":2,"forks_count":32,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-17T14:37:24.396Z","etag":null,"topics":["desafio","desafio-feltex","desafios-resolvidos","itau","java","java21","maven","spring","spring-boot"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/feltexbr","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/feltex.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,"zenodo":null}},"created_at":"2024-04-16T17:49:00.000Z","updated_at":"2025-04-15T14:31:49.000Z","dependencies_parsed_at":"2024-04-23T00:25:33.573Z","dependency_job_id":null,"html_url":"https://github.com/feltex/desafio-itau-backend","commit_stats":null,"previous_names":["feltex/desafio-itau-backend"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feltex%2Fdesafio-itau-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feltex%2Fdesafio-itau-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feltex%2Fdesafio-itau-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feltex%2Fdesafio-itau-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/feltex","download_url":"https://codeload.github.com/feltex/desafio-itau-backend/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250337909,"owners_count":21414102,"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":["desafio","desafio-feltex","desafios-resolvidos","itau","java","java21","maven","spring","spring-boot"],"created_at":"2024-11-08T19:07:44.930Z","updated_at":"2025-10-08T11:02:09.026Z","avatar_url":"https://github.com/feltex.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# desafio-itau-backend\n\n# Itaú Unibanco - Desafio de Programação\n\nEste é 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\nVídeo no youtube https://youtu.be/uke3i4uOejs\n\n## 1. Introdução\n\nSua 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\nUm 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\nNeste 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\nSeu 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\nA 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\nEste é 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\nOs 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\nA API só aceitará transações que:\n\n1. Tenham os campos `valor` e `dataHora` preenchidos\n2. A transação **NÃO DEVE** acontecer no futuro\n3. A transação **DEVE** ter acontecido a qualquer momento no passado\n4. A transação **NÃO DEVE** ter valor negativo\n5. A transação **DEVE** ter valor igual ou maior que `0` (zero)\n\nComo 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\nEste endpoint simplesmente **apaga todos os dados de transações** que estejam armazenados.\n\nComo 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\nEste 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\nOs 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\nComo 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\nVamos 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\n1. **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.\n2. **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!_\n3. **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.\n4. **Observabilidade:** Sua API tem algum endpoint para verificação da saúde da aplicação (healthcheck)?\n5. **Performance:** Você consegue estimar quanto tempo sua aplicação gasta para calcular as estatísticas?\n6. **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?\n7. **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!\n8. **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?\n9. **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%2Ffeltex%2Fdesafio-itau-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffeltex%2Fdesafio-itau-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeltex%2Fdesafio-itau-backend/lists"}