Este é um projeto ASP.NET 8.0 que pode ser executado utilizando Docker Compose ou diretamente em sua máquina local.
O Projeto é preparado para rodar em ambiente Windows e Linux
- Docker
- Docker Compose
- Em ambiente Windows, utilizei o Docker Desktop com WSL
- .NET 8.0 SDK
- MySQL
- Ao instalar, crie o banco
InventoryVenturusDb
- Ao instalar, crie o banco
Clone este repositório para sua máquina local:
git clone https://github.com/miguelkmarques/Inventory.git
cd Inventory/
No diretório raiz do projeto, execute os comandos abaixo para rodar o Build e iniciar os Containers:
docker-compose -f docker-compose.yml -f docker-compose.override.yml build
docker-compose up -d
- Após o Build e inicialização, a aplicação estará disponível em
http://localhost:8080
. - O Swagger da aplicação está disponível em
http://localhost:8080/swagger/index.html
Para parar e remover os containers, execute:
docker-compose down
Clone este repositório para sua máquina local:
git clone https://github.com/miguelkmarques/Inventory.git
cd Inventory/InventoryVenturus/
Certifique-se de que o MySQL está instalado e em execução. Atualize a string de conexão no arquivo appsettings.Development.json
:
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=InventoryVenturusDb;User=user;Password=password"
}
No diretório InventoryVenturus onde está o InventoryVenturus.csproj
, execute os seguintes comandos:
dotnet restore
dotnet build
dotnet run
- A aplicação estará disponível em
http://localhost:5129
. - O Swagger da aplicação está disponível em
http://localhost:5129/swagger/index.html
Volte para a pasta raiz do projeto e execute o comando:
dotnet test InventoryVenturus.Tests/InventoryVenturus.Tests.csproj
O projeto possui um workflow do GitHub Actions que executa os testes unitários e gera relatórios de testes e cobertura. Aqui estão os links para a última execução do workflow e seus respectivos relatórios:
- Última execução
- Relatório de Unit Tests
- Relatório de Cobertura
- Para visualizar o relatório de cobertura, extraia os arquivos do .zip e abra o arquivo
index.html
no navegador.
- Para visualizar o relatório de cobertura, extraia os arquivos do .zip e abra o arquivo
- Para o desenvolvimento do Projeto de Controle de Estoque, foi utilizada a biblioteca MediatR para seguir o padrão de arquitetura CQRS. Cada funcionalidade (
Product
,Stock
,Transaction
) foi separada emCommands
,Dtos
,Notifications
eQueries
. - Foram desenvolvidos Behaviors para serem adicionados na pipeline de execução do MediatR:
ValidationBehavior
: para cadaCommand
eNotification
, o input é validado para garantir a integridade dos dados, usando a bibliotecaFluentValidation
.RequestResponseLoggingBehavior
: para cadaCommand
, é realizado o log daRequest
e daResponse
.ExceptionLoggingBehavior
: cadaException
gerada dentro do MediatR é registrada no banco de dados, juntamente com aRequest
e aException
.
- Foi implementada uma
BaseException
e exceções customizadas para tratar erros originados na lógica da aplicação. - No middleware do AspNet, foi adicionada uma
GlobalExceptionHandler
para centralizar o tratamento de exceções e padronizar o retorno dos erros para requisições HTTP que não tiveram sucesso. Esse handler incrementa os dados do erro quando se trata deFluentValidation.ValidationException
eBaseException
. - Foi utilizado o Micro ORM Dapper e criada uma pasta de
Repository
para todas as operações de banco de dados. - Para os Commands que necessitam realizar mais de uma operação, como executar a operação principal e publicar uma notificação que pode desencadear outra operação usando um repositório, foi utilizado o
TransactionScope
. Caso alguma operação falhe dentro do escopo criado, as operações que anteriormente tiveram sucesso são revertidas. Exemplo: ao consumir o estoque de um produto, a operação de atualizar o estoque no repositório é executada e é enviada uma notificação para criar um registro na tabela deTransactions
. Se a operação de salvar aTransaction
falhar, o estoque do produto não será atualizado devido ao erro. Isso garante a integridade dos dados. - Cada componente de código da aplicação foi desenvolvido com foco na testabilidade, facilitando o desenvolvimento de testes unitários e seguindo o padrão TDD.
- Para o escopo deste desafio, os endpoints e as tabelas de banco de dados foram simplificados, apenas para demonstrar a aplicação dos conceitos e tecnologias, e não representam um sistema real.