Este projeto adota uma arquitetura baseada em camadas, onde cada camada tem sua responsabilidade, e sempre a camada mais alta irá se comunicar com a camada mais baixa.
interfaces
)
Camada de interfaces de entrada (pasta Esta pasta contém todos os pontos de entrada para a aplicação. É o início, é aqui que estarão os controllers e rotas do Express.
app
)
Camada de aplicação (pasta A camada de aplicação é responsável por fazer o intermédio entre a interface e a lógica de negócio. Nesta camada podemos criar operações e serviços que se comunicarão com a infraestrutura (Banco de dados ou outros serviços externos).
infra
)
Camada de infraestrutura (pasta Esta é a camada mais baixa. Na camada de infraestrutura sempre terá a comunicação com o que está fora da aplicação, como banco de dados, serviços de email e comunicação direta com frameworks.
Injeção de Dependência
Ideia central desse padrão é que cada dependência de um objeto que pode (e faz sentido) ser desacoplada deve ser injetada para torná-la mais flexível, reutilizável e facilmente testável. Neste projeto a injeção de dependências funciona usando a biblioteca Awilix. Artigo sobre esta biblioteca (escrito pelo autor), parte 1 , parte 2 e parte 3 . Para as injeções nos controladores, usamos o adaptador Express Awilix.
Repository
Este padrão parte do princípio de que não devemos tocar diretamente no banco de dados. Então temos repositórios que tratam da persistência internamente e os injetamos nas instâncias de operações e serviços que desejam utiliza-la. Referência.