Esse projeto tem como objetivo resolver o desafio proposto em um processo seletivo.
- Clonar projeto do github.
- Executar o
docker compose up -d --build
- Acessar a api via
http://localhost
nas rotas a seguir:-
POST -
/orders/upload
- rota para carregar os arquivos do sistema legado. Chamar conforme exemplo a seguir com o curl:# data_1.txt curl -v -F orders=@data/data_1.txt http://localhost/orders/upload # data_2.txt curl -v -F orders=@data/data_2.txt http://localhost/orders/upload
-
GET -
/orders/:id
- rota para recuperar os dados de um pedido pelo id -
GET -
/orders
- rota para filtrar os pedidos. Filtros disponíveis:/orders?order_id=1
- filtro pelo id do pedido/orders?start_date=2021-11-01&end_date=2021-11-20
- filtro pela data do pedido
-
O projeto foi desenvolvido utilizando o typescript
e o nestjs
como framework web.
O typescript foi escolhido por trazer a tipagem ao javascript. Essa abordagem traz mais qualidade ao código, informando ao desenvolvedor o que é esperado e retornado por cada função além de trazer o poder da compilação que consegue prevenir erros no projeto em tempo de código.
O nestjs é um framework web que vem ganhando popularidade e traz algumas ferramentas interessantes para um código de boa qualidade, como injeção de dependência, o que possibilita utilizar bons padrões de desenvolvimento.
A arquitetura adota no projeto foi a de três camadas: controller, service, repository.
-
O controller é responsável por manipular as requisições HTTP. Nessa camada que encontramos o tratamento dos dados recebidos no request, e definimos a resposta. Essa é a camada que o usuário tem acesso. E a partir dela são acessada a camada de service.
-
O service é a camada responsável por conter as regras de negócio. Nesse projeto foi onde foi implementado o tratamento dos dados recebidos dos arquivos (data_1 e data_2), além de orquestrar as chamadas para os repositórios. Essa é a camada que faz o meio campo entre controller e repository.
-
A camada repository é onde encontramos a integração com sistemas externos. No caso desse projeto temos a integração com o banco de dados.
Essa separação em três camadas melhora a organização do projeto e facilita a manutenção, pois essa arquitetura favorece a adoção dos princípios de responsabilidade única e inversão de dependência.
Esse projeto teve uma adoção baixa de interfaces, pois não senti a necessidade de explorar múltiplas implementação pra nenhuma das possíveis interfaces que o projeto necessitava. Mas caso houvesse alguma necessidade nesse sentido, seria esse o caminho adotado.
Para armazenamento dos dados, foi escolhido o banco de dados mysql, que é um banco robusto e bem testado. Para tal foi adotado a modelagem a seguir:
Essa versão do projeto está sendo executada através de container orquestrados pelo docker. O projeto está utilizando o docker compose
para subir os container do mysql, e do app.
Essa abordagem de conteinerização padroniza o ambiente de execução além de facilitar a implantação em ambiente produtivo. Outra vantagem da abordagem de container é isolação que cada container tem em relação aos demais e ao host.
Por fim, foi adicionado o nginx como proxy/loadBalance que faz com que o sistema possa ser escalável além de garantir alta disponibilidade, graças a possibilidade de ter mais de um pod do app.