Este 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.
O meu processo de entrega do challenge foi documentado no arquivo takeaways (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.
Os requisitos para o desenvolvimento da API foram dividos em tres categorias: Requisitos Funcionais, Regras de Negócio e Requisitos Não Funcionais. Logo abaixo é descrito o que a aplicação visa entregar em cada categoria.
- Deve ser possível se cadastrar.
- Deve ser possível o usuário atualizar a sua renda.
- Deve ser possível o usuário solicitar um empréstimo.
- Deve ser possível buscar usuário pelo ID.
- Deve ser possível buscar todos os usuários criados na aplicação.
- Conceder o empréstimo pessoal se o salário do cliente for igual ou inferior a R$ 3000.
- 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).
- Conceder o empréstimo consignado se o salário do cliente for igual ou superior a R$ 5000.
- Conceder o empréstimo com garantia se o salário do cliente for igual ou inferior a R$ 3000.
- 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).
- A senha do usuário precisa estar criptografada
- O mesmo CPF não pode se cadastrar duas vezes no sistema.
- Os dados da aplicação precisam estar persistidos em um banco PostgreSQL.
- A aplicação deve ser conteinerizada via docker e deve conter o arquivo
docker-compose.yml
com todas as instruções pertinentes. - O usuário deve ser identificado por um ID (preferencialmente UUID).
[POST] {{host}}/customer-loans
{
"age": 26,
"cpf": "275.484.389-23",
"name": "Vuxaywua Zukiagou",
"income": 7000.00,
"location": "SP"
}
Seu serviço deve retornar uma resposta contendo o nome do cliente e uma lista de empréstimos aos quais ele tem acesso, com os respectivos tipos e taxas de juros.
HTTP/1.1 200 Ok
{
"customer": "Vuxaywua Zukiagou",
"loans": [
{
"type": "PERSONAL",
"interest_rate": 4
},
{
"type": "GUARANTEED",
"interest_rate": 3
},
{
"type": "CONSIGNMENT",
"interest_rate": 2
}
]
}
- Node.js: ^18.x
- TypeScript: ^5.5.4
- Express: ^4.19.2
- Docker: ^3.9.0
- Zod: ^3.23.8 (validação de entrada)
- PostgreSQL: ^8.12.0
- Jest e Supertest: Testes unitários e de integração
O 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.
-
Criação de usuário e persistencia dos dados no banco.
-
Atualização da renda inicial informado.
-
Estratégia de caching utilizando Redis...
-
Deploy da API
-
Utilização de ORM's como Sequeelize ou Prisma
-
Autenticação via JWT.
-
Clone o repositório:
https://github.com/samuelribeiroo/loan-service.git
-
Instale as dependências
npm install
- Configure as variáveis de ambiente no arquivo .env:
- DB_USER
- DB_PASSWORD
- DB_HOST (caso necessário)
- DB_DATABASE
- Entre outros
- Inicie o Docker para configurar o banco de dados PostgreSQL com Docker Compose:
docker-compose up -d
- Para rodar o servidor localmente, use o comando:
npm run dev
dev
: Roda a aplicação em modo de desenvolvimento.start
: Roda a aplicação em produção, após ser compilada.test
: Roda todos os teste unitários da aplicação.