public async Task <IActionResult> AtualizaRetornoMensagem(int idMensagem)
        {
            var mensagemToValidate = _operacionalContext.MensagemItems
                                     .OfType <MensagemItem>()
                                     .SingleOrDefault(e => e.Id_Mensagem == idMensagem && e.dt_RecebimentoMensagem == null);

            if (mensagemToValidate == null)
            {
                string msgStatus = _localizer["VALIDA_MENSAGEMCOMRETORNO"];
                return(BadRequest(msgStatus));
            }

            MensagemItem ObjMensagem = _operacionalContext.MensagemItems.Find(idMensagem);

            ObjMensagem.dt_RecebimentoMensagem = DateTime.Now;

            _operacionalContext.MensagemItems.Update(ObjMensagem);

            //Create Integration Event to be published through the Event Bus
            var mensagemRetornoEvent = new MensagemRetornoIE(mensagemToValidate.Id_Mensagem,
                                                             mensagemToValidate.Id_AtividadeAcomodacao,
                                                             mensagemToValidate.dt_EnvioMensagem,
                                                             mensagemToValidate.dt_RecebimentoMensagem,
                                                             mensagemToValidate.Id_Empresa,
                                                             mensagemToValidate.Id_Usuario_Emissor,
                                                             mensagemToValidate.Id_Usuario_Destinatario,
                                                             mensagemToValidate.TextoMensagem);

            try
            {
                // Achieving atomicity between original Catalog database operation and the IntegrationEventLog thanks to a local transaction
                await _operacionalIntegrationEventService.SaveEventAndMensagemRetornoContextChangesAsync(mensagemRetornoEvent, ObjMensagem);
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }

            // Publish through the Event Bus and mark the saved event as published
            await _operacionalIntegrationEventService.PublishThroughEventBusAsync(mensagemRetornoEvent);


            return(CreatedAtAction(nameof(AtualizaRetornoMensagem), mensagemToValidate.Id_Mensagem));
        }
        public async Task <IActionResult> IncluirMensagem([FromBody] MensagemItem mensagemToSave)
        {
            var atividadeToValidate = _operacionalContext.AtividadeItems
                                      .OfType <AtividadeItem>()
                                      .SingleOrDefault(e => e.Id_AtividadeAcomodacao == mensagemToSave.Id_AtividadeAcomodacao && e.dt_FimAtividadeAcomodacao == null);

            if (atividadeToValidate == null)
            {
                string msgStatus = _localizer["VALIDA_ATIVIDADEATIVA"];
                return(BadRequest(msgStatus));
            }

            _operacionalContext.MensagemItems.Add(mensagemToSave);

            //Create Integration Event to be published through the Event Bus
            var mensagemSaveEvent = new MensagemSaveIE(mensagemToSave.Id_Mensagem,
                                                       mensagemToSave.Id_AtividadeAcomodacao,
                                                       mensagemToSave.dt_EnvioMensagem,
                                                       mensagemToSave.dt_RecebimentoMensagem,
                                                       mensagemToSave.Id_Empresa,
                                                       mensagemToSave.Id_Usuario_Emissor,
                                                       mensagemToSave.Id_Usuario_Destinatario,
                                                       mensagemToSave.TextoMensagem);

            try
            {
                // Achieving atomicity between original Catalog database operation and the IntegrationEventLog thanks to a local transaction
                await _operacionalIntegrationEventService.SaveEventAndMensagemContextChangesAsync(mensagemSaveEvent, mensagemToSave);
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
            // Publish through the Event Bus and mark the saved event as published
            await _operacionalIntegrationEventService.PublishThroughEventBusAsync(mensagemSaveEvent);


            return(CreatedAtAction(nameof(IncluirMensagem), mensagemToSave.Id_Mensagem));
        }
Пример #3
0
 public async Task SaveEventAndMensagemRetornoContextChangesAsync(IntegrationEvent evt, MensagemItem mensagemToSave)
 {
     var strategy = _operacionalContext.Database.CreateExecutionStrategy();
     await strategy.ExecuteAsync(async() =>
     {
         using (var transaction = _operacionalContext.Database.BeginTransaction())
         {
             try
             {
                 await _operacionalContext.SaveChangesAsync();
                 //Tratamento de Identity
                 ((Events.MensagemRetornoIE)evt).id_Mensagem = mensagemToSave.Id_Mensagem;
                 await _eventLogService.SaveEventAsync(evt, _operacionalContext.Database.CurrentTransaction.GetDbTransaction());
                 transaction.Commit();
             }
             catch (Exception ex)
             {
                 transaction.Rollback();
                 var sqlException = ex.InnerException as System.Data.SqlClient.SqlException;
                 throw new Exception(sqlException.Number + "::" + sqlException.Message);
             }
         }
     });
 }