Este projeto foi desenvolvido com o objetivo de treinar o conhecimento em Design Patterns. O sistema em questão é um e-commerce que controla os pedidos realizados, considerando seus status e os métodos de envio disponíveis.
- Controle de Status do Pedido: O pedido passa por diferentes status, como "Aguardando Pagamento", "Pago", "Enviado" e "Cancelado".
- Métodos de Envio: O sistema possui métodos de envio por via terrestre (caminhão) e via aérea (avião), com o cálculo do valor do frete baseado no valor do pedido (5% para terrestre e 10% para aérea).
- Impossibilidade de mudanças de status após cancelamento: Uma vez que um pedido é cancelado, não pode mais ser alterado.
- Extensibilidade: O sistema permite a adição de novos métodos de envio no futuro sem alterar a estrutura existente.
O State foi utilizado para controlar o fluxo de estados do pedido, como "Aguardando Pagamento", "Pago", "Enviado" e "Cancelado". Cada status é representado por uma classe específica que define as ações permitidas em cada etapa.
O Strategy foi aplicado para implementar os diferentes métodos de cálculo do valor do frete. O cálculo do frete varia conforme o tipo de envio escolhido (terrestre ou aéreo). Cada tipo de cálculo foi encapsulado em uma estratégia específica, permitindo que o sistema seja facilmente expandido com novos métodos de envio no futuro.
O projeto é uma Web API construída utilizando ASP.NET Core e um banco de dados PostgreSQL. A API expõe endpoints para gerenciar pedidos e realizar transições de status.
A estrutura do projeto é dividida nas seguintes camadas:
A camada Repository é responsável pela comunicação com o banco de dados, servindo como uma abstração entre a aplicação e a fonte de dados. Seu principal objetivo é isolar a lógica de acesso a dados do restante da aplicação, facilitando a manutenção, testes e segurança.
A camada Service contém a lógica de negócios. Aqui, implementamos as transições de status do pedido e os cálculos de frete de acordo com os tipos de envio disponíveis. Além disso, é onde os Design Patterns foram aplicados:
- State: Implementação de diferentes estados do pedido em classes separadas e as ações permitidas em cada um.
- Strategy: Implementação das estratégias de cálculo de frete, permitindo a adição de novos métodos de envio sem a necessidade de alterar o código existente.
- É responsável por gerenciar os pedidos e realizar as conversões necessárias.
- Ao gerar o pedido, o estado é definido como "Aguardando Pagamento" e o valor do frete é calculado.
- Ao atualizar as informações do pedido, se ele ainda estiver "Aguardando pagamento", ela evita que o estado seja alterado diretamente pelo usuário e o frete é recalculado para cobrir possíveis mudanças nos preços. Se o pedido estiver em outro estado, a operação é cancelada.
- As demais operações cuidam da lógica de transição de estado por meio do padrão State e conversões.
- Há conversões entre classe Model e DTO, estado do padrão State com valor de enum EstadoPedido, e classe Frete do padrão Strategy de acordo com o valor do enum TipoFrete.
A camada Controller é responsável por lidar com as requisições recebidas e direcioná-las para os serviços apropriados. Ela atua como intermediária entre a entrada do usuário e a lógica de negócio da aplicação, realizando as validações necessárias para o funcionamento correto das operações.

