private async Task BaixarEstoque(PedidoAutorizadoIntegrationEvent message) { using (var scope = _serviceProvider.CreateScope()) { var produtosComEstoque = new List <Produto>(); var produtoRepository = scope.ServiceProvider.GetRequiredService <IProdutoRepository>(); var idsProdutos = string.Join(",", message.Itens.Select(c => c.Key)); var produtos = await produtoRepository.ObterProdutosPorId(idsProdutos); if (produtos.Count != message.Itens.Count) { CancelarPedidoSemEstoque(message); return; } foreach (var produto in produtos) { var quantidadeProduto = message.Itens.FirstOrDefault(p => p.Key == produto.Id).Value; if (produto.EstaDisponivel(quantidadeProduto)) { produto.RetirarEstoque(quantidadeProduto); produtosComEstoque.Add(produto); } } if (produtosComEstoque.Count != message.Itens.Count) { CancelarPedidoSemEstoque(message); return; } foreach (var produto in produtosComEstoque) { produtoRepository.Atualizar(produto); } if (!await produtoRepository.UnitOfWork.Commit()) { throw new DomainException($"Problemas ao atualizar estoque do pedido {message.PedidoId}"); } var pedidoBaixado = new PedidoBaixadoEstoqueIntegrationEvent(message.ClienteId, message.PedidoId); await _bus.PublishAsync(pedidoBaixado); } }
private async Task CapturarPagamento(PedidoBaixadoEstoqueIntegrationEvent message) { using var scope = _serviceProvider.CreateScope(); var pagamentoService = scope.ServiceProvider.GetRequiredService <IPagamentoService>(); var response = await pagamentoService.CapturarPagamento(message.PedidoId); if (!response.ValidationResult.IsValid) { throw new DomainException($"Falha ao capturar o pagamento do pedido {message.PedidoId}"); } await _bus.PublishAsync(new PedidoPagoIntegrationEvent(message.ClienteId, message.PedidoId)); }
private async Task FinalizarPedido(PedidoBaixadoEstoqueIntegrationEvent message) { using (var scope = _serviceProvider.CreateScope()) { var pedidoRepository = scope.ServiceProvider.GetRequiredService <IPedidoRepository>(); var pedido = await pedidoRepository.ObterPorId(message.PedidoId); pedido.FinalizarPedido(); pedidoRepository.Atualizar(pedido); if (!await pedidoRepository.UnitOfWork.Commit()) { throw new DomainException($"Falha ao finalizar pedido {message.PedidoId}"); } } }