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)); }
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); } } }); }