{"id":24550057,"url":"https://github.com/samuelribeiroo/challenge-backend-loans","last_synced_at":"2026-05-11T06:49:39.026Z","repository":{"id":255405003,"uuid":"842268544","full_name":"samuelribeiroo/challenge-backend-loans","owner":"samuelribeiroo","description":"Solution of a challenge from digital community BackEnd Brasil 🇧🇷","archived":false,"fork":false,"pushed_at":"2024-11-25T18:37:42.000Z","size":37,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-23T00:26:16.026Z","etag":null,"topics":["backend-testing","express","jest","node-api","nodemon","postgresql-database","typescript"],"latest_commit_sha":null,"homepage":"https://shorturl.at/bVD6M","language":"TypeScript","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/samuelribeiroo.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":"2024-08-14T02:29:05.000Z","updated_at":"2024-11-25T18:39:22.000Z","dependencies_parsed_at":"2024-08-29T20:27:50.777Z","dependency_job_id":"79bf3812-3be1-4489-8f28-b65297d704d1","html_url":"https://github.com/samuelribeiroo/challenge-backend-loans","commit_stats":null,"previous_names":["samuelribeiroo/loan-service","samuelribeiroo/challenge-backend-loans"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samuelribeiroo%2Fchallenge-backend-loans","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samuelribeiroo%2Fchallenge-backend-loans/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samuelribeiroo%2Fchallenge-backend-loans/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samuelribeiroo%2Fchallenge-backend-loans/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/samuelribeiroo","download_url":"https://codeload.github.com/samuelribeiroo/challenge-backend-loans/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243871307,"owners_count":20361325,"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":["backend-testing","express","jest","node-api","nodemon","postgresql-database","typescript"],"created_at":"2025-01-23T00:23:03.905Z","updated_at":"2026-05-11T06:49:38.997Z","avatar_url":"https://github.com/samuelribeiroo.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align='center'\u003eBackEndBR - Challenge Serviço de empréstimo\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://avatars3.githubusercontent.com/u/30732658?v=4\u0026s=200.jpg\" alt=\"BackEndBR\" width=\"230\" /\u003e\n\u003c/p\u003e\n\n## 🎯 Descrição\nEste projeto é um serviço que analisa quais modalidades de empréstimo estão disponíveis para um cliente com de acordo com a análise de alguns dados como: idade, salário e localização.\n\n## 📃 Documentação\nO meu processo de entrega do challenge foi documentado no arquivo [takeaways](caderno.md) (conclusões).  Ali, eu relato como foi pensar na solução, selecionar ferramentas (database, linguagem, infra) e alguns insights sobre aprendizados durante a codificação. \n\n## ✅ Requisitos do Sistema\n\u003cp align='left'\u003eOs requisitos para o desenvolvimento da API foram dividos em tres categorias: \u003cstrong\u003eRequisitos Funcionais, Regras de Negócio e Requisitos Não Funcionais\u003c/strong\u003e. Logo abaixo é descrito o que a aplicação visa entregar em cada categoria.\u003c/p\u003e\n\n## Requisitos Funcionais (RFs)\n\u003c!-- Funcionalidades da aplicação (o que o usuário poderá fazer) --\u003e\n\n- [x] Deve ser possível se cadastrar.\n- [x] Deve ser possível o usuário atualizar a sua renda.\n- [x] Deve ser possível o usuário solicitar um empréstimo.\n- [x] Deve ser possível buscar usuário pelo ID.\n- [x] Deve ser possível buscar todos os usuários criados na aplicação.\n\n## Regras de Negócio (RNs)\n\u003c!-- Condições aplicadas a cada Requisito Funcional (if) --\u003e\n\n- [x] Conceder o empréstimo pessoal se o salário do cliente for igual ou inferior a R$ 3000.\n- [x] Conceder o empréstimo pessoal se o salário do cliente estiver entre R$ 3000 e R$ 5000, se o cliente tiver menos de 30 anos e residir em São Paulo (SP).\n- [x] Conceder o empréstimo consignado se o salário do cliente for igual ou superior a R$ 5000.\n- [x] Conceder o empréstimo com garantia se o salário do cliente for igual ou inferior a R$ 3000.\n- [x] Conceder o empréstimo com garantia se o salário do cliente estiver entre R$ 3000 e R$ 5000, se o cliente tiver menos de 30 anos e residir em São Paulo (SP).\n\n## Requisitos Não Funcionais (RNFs)\n\u003c!-- Não parte do cliente --\u003e\n\u003c!-- Requisitos mais técnicos (BD, estratégias - cache, paginação, etc) --\u003e\n\n- [x] A senha do usuário precisa estar criptografada\n- [x] O mesmo CPF não pode se cadastrar duas vezes no sistema.\n- [x] Os dados da aplicação precisam estar persistidos em um banco PostgreSQL.\n- [x] A aplicação deve ser conteinerizada via docker e deve conter o arquivo `docker-compose.yml` com todas as instruções pertinentes.\n- [x] O usuário deve ser identificado por um ID (preferencialmente UUID).\n\n## Exemplo de Funcionamento\n\n### Requisição\n\n\n\n**[POST]** `{{host}}/customer-loans`\n\n```json\n{\n    \"age\": 26,\n    \"cpf\": \"275.484.389-23\",\n    \"name\": \"Vuxaywua Zukiagou\",\n    \"income\": 7000.00,\n    \"location\": \"SP\"\n}\n```\n\nSeu serviço deve retornar uma resposta contendo o nome do cliente e uma lista de empréstimos aos quais ele tem acesso,\ncom os respectivos tipos e taxas de juros.\n\n```\nHTTP/1.1 200 Ok\n```\n\n```json\n{\n    \"customer\": \"Vuxaywua Zukiagou\",\n    \"loans\": [\n        {\n            \"type\": \"PERSONAL\",\n            \"interest_rate\": 4\n        },\n        {\n            \"type\": \"GUARANTEED\",\n            \"interest_rate\": 3\n        },\n        {\n            \"type\": \"CONSIGNMENT\",\n            \"interest_rate\": 2\n        }\n    ]\n}\n```\n\n\n## Tecnologias e Ferramentas Utilizadas\n\u003cul\u003e\n  \u003cli\u003e\u003cstrong\u003eNode.js\u003c/strong\u003e: ^18.x\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003eTypeScript\u003c/strong\u003e: ^5.5.4\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003eExpress\u003c/strong\u003e: ^4.19.2\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003eDocker\u003c/strong\u003e: ^3.9.0\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003eZod\u003c/strong\u003e: ^3.23.8 (validação de entrada)\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003ePostgreSQL\u003c/strong\u003e: ^8.12.0\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003eJest\u003c/strong\u003e e \u003cstrong\u003eSupertest\u003c/strong\u003e: Testes unitários e de integração\u003c/li\u003e\n\u003c/ul\u003e\n\n\n## 🎖 Extra mile\nO que foi proposto no desafio era a validação de concessão de empréstimos baseado em condições informadas pelo usuário, porém, para treinar minhas habilidades adicioneis algumas features.\n\n- [X] Criação de usuário e persistencia dos dados no banco.\n- [X] Atualização da renda inicial informado.\n\n  ## ⏳ O que mais poderia ser adicionado....  \n- [ ] Estratégia de caching utilizando Redis...\n- [ ] Deploy da API\n- [ ] Utilização de ORM's como Sequeelize ou Prisma\n- [ ] Autenticação via JWT.\n\n## Instruções para rodar localmente o projeto.\n\n## Como Usar\n\n1. Clone o repositório:\n\n   ```bash\n   https://github.com/samuelribeiroo/loan-service.git\n\n2. Instale as dependências\n   \n ```bash\n   npm install\n ```\n\n3. Configure as variáveis de ambiente no arquivo .env:\n\n\u003cul\u003e\n  \u003cli\u003e\u003cstrong\u003eDB_USER\u003c/strong\u003e\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003eDB_PASSWORD\u003c/strong\u003e\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003eDB_HOST\u003c/strong\u003e (caso necessário)\u003c/li\u003e\n  \u003cli\u003e\u003cstrong\u003eDB_DATABASE\u003c/strong\u003e\u003c/li\u003e\n  \u003cli\u003eEntre outros\u003c/li\u003e\n\u003c/ul\u003e\n\n4. Inicie o Docker para configurar o banco de dados PostgreSQL com Docker Compose:\n ```bash\n  docker-compose up -d\n ```\n\n5. Para rodar o servidor localmente, use o comando:\n ```bash\nnpm run dev\n ```\n\n## Scripts\n- `dev`: Roda a aplicação em modo de desenvolvimento.\n- `start`: Roda a aplicação em produção, após ser compilada.\n- `test`: Roda todos os teste unitários da aplicação.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamuelribeiroo%2Fchallenge-backend-loans","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsamuelribeiroo%2Fchallenge-backend-loans","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamuelribeiroo%2Fchallenge-backend-loans/lists"}