public async Task FunctionHandler(DynamoDBEvent dynamoEvent, ILambdaContext context) { foreach (var record in dynamoEvent.Records) { if (record.EventName == "INSERT") { var pedido = record.Dynamodb.NewImage.ToObject <Pedido>(); pedido.Status = StatusDoPedido.Coletado; try { await ProcessarValorDoPedido(pedido); await AmazonUtil.EnviarParaFila(EnumFilasSQS.pedido, pedido); context.Logger.LogLine($"Sucesso na coleta do pedido: '{pedido.Id}'"); } catch (Exception ex) { context.Logger.LogLine($"Erro: '{ex.Message}'"); pedido.JustificativaDeCancelamento = ex.Message; pedido.Cancelado = true; await AmazonUtil.EnviarParaFila(EnumFilasSNS.falha, pedido); } await pedido.SalvarAsync(); } } }
private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context) { var pedido = JsonConvert.DeserializeObject <Pedido>(message.Body); pedido.Status = StatusDoPedido.Reservado; foreach (var produto in pedido.Produtos) { try { await BaixarEstoque(produto.Id, produto.Quantidade); produto.Reservado = true; context.Logger.LogLine($"Produto baixado do estoque {produto.Id} - {produto.Nome}"); } catch (ConditionalCheckFailedException) { pedido.JustificativaDeCancelamento = $"Produto indisponível no estoque {produto.Id} - {produto.Nome}"; pedido.Cancelado = true; context.Logger.LogLine($"Erro: {pedido.JustificativaDeCancelamento}"); break; } } if (pedido.Cancelado) { foreach (var produto in pedido.Produtos) { if (produto.Reservado) { await DevolverAoEstoque(produto.Id, produto.Quantidade); produto.Reservado = false; context.Logger.LogLine($"Produto devolvido ao estoque {produto.Id} - {produto.Nome}"); } } await AmazonUtil.EnviarParaFila(EnumFilasSNS.falha, pedido); await pedido.SalvarAsync(); } else { await AmazonUtil.EnviarParaFila(EnumFilasSQS.reservado, pedido); await pedido.SalvarAsync(); } }