public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _produtoRepository.ObterPorId(produtoId); if (produto == null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); // TODO: Parametrizar quantidade de estoque mínimo if (produto.QuantidadeEstoque < 10) { // fazer algo: avisar, enviar email, abrir chamado, realizar compra // para não corromper a responsabilidade deste metodo, que é para debitar o estoque // vamos criar o evento de dominio // quem vai receber esse evento é a classe ProdutoEventHandler await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); } _produtoRepository.Atualizar(produto); return(await _produtoRepository.UnitOfWork.Commit()); }
public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade) { var produto = await _repository.ObterPorId(produtoId); if (produto is null) { return(false); } if (!produto.PossuiEstoque(quantidade)) { return(false); } produto.DebitarEstoque(quantidade); // TODO: Parametrizar a quantidade minima para lançamento do evento if (produto.QuantidadeEstoque < 10) { await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque)); } _repository.Atualizar(produto); return(await _repository.UnitOfWork.Commit()); }