API foi desenvolvida utilizando uma arquitetura bem definida e tentando deixar ao máximo desacoplada, utilizando TDD como metodologia de trabalho e seguindo um pouco as boas práticas do Clean Architecture para fazer a distribuição das responsabilidades em camadas, e sempre que possível utilizando os princípios do SOLID.
A utilização das tecnologias foi pensada a fim de facilitar o desenvolvimento, tais como: NodeJS e Typescript como stack principal, Express para roteamento das rotas e subir o servidor, Axios para chamadas a endpoits externos, Mongodb para a persistência dos dados, Husky, Eslint, Prettier, Linter-staged para configuração de linter, Jest para rodar os teste de unidade e integração, e Shelf/jest-mongodb para facilitar os teste de integração com o banco mocado em memória, Docker para facilitar o desenvolvimento e deploy.
- Composite
- Adapter
- Factory
- Dependency Injection
- Single Responsibility
Os requisitos necessários são:
- Node >= 16
- npm >= 8
- Mongodb > 4
- docker >= 20
- docker-compose >= 1.29
Faça o clone do projeto e rode o comando npm install
para instalar as dependências.
npm install
Configurar as variáveis de ambiente criando um arquivo .env
na raiz do projeto, e seguindo o exemplo do arquivo .env.example
.
Subir o container pra rodas as aplicações
docker-composer up
ou
npm run docker:up
Subir o servidor de desenvolvimento atravéz do comando npm run dev
npm run dev
npm run build
npm start
npm test
npm run test:unit
Cobertura de teste
npm run test:ci
- Conversão de moedas
- Listar transações por usuários
[POST] /convert
{
"userId": string,
"originCurrency": string,
"originAmount": number,
"destinationCurrency": string
}
{
"trasactionId": string,
"userId": string,
"originCurrency": string,
"originAmount": number,
"destinationCurrency": string,
"destinationValue": number,
"currencyTax": number,
"timeConvert": string
}
{
"error": "string"
}
[GET] /transactions/${userId}
{
"userId": string,
}
[
{
"userId": string,
"originCurrency": string,
"originAmount": number,
"destinationCurrency": string,
"currencyTax": number,
"timeConvert": string
}
]
{
"error": "string"
}