public async Task <IActionResult> SalvarTipoSituacaoAcomodacao([FromBody] TipoSituacaoAcomodacaoItem tipoSituacaoAcomodacaoToSave) { //AREA DE VALIDACAO string msgRule = ""; if (!ruleValidaNomeTipoSituacaoAcomodacao(tipoSituacaoAcomodacaoToSave.Nome_TipoSituacaoAcomodacao, ref msgRule)) { return(BadRequest(msgRule)); } //FIM AREA DE VALIDACAO if (_configuracaoContext.Set <TipoSituacaoAcomodacaoItem>().Any(e => e.Id_TipoSituacaoAcomodacao == tipoSituacaoAcomodacaoToSave.Id_TipoSituacaoAcomodacao)) { _configuracaoContext.TipoSituacaoAcomodacaoItems.Update(tipoSituacaoAcomodacaoToSave); } else { _configuracaoContext.TipoSituacaoAcomodacaoItems.Add(tipoSituacaoAcomodacaoToSave); } //Create Integration Event to be published through the Event Bus var tipoSituacacoAcomodacaoSaveEvent = new TipoSituacaoAcomodacaoSaveIE(tipoSituacaoAcomodacaoToSave.Id_TipoSituacaoAcomodacao, tipoSituacaoAcomodacaoToSave.Nome_TipoSituacaoAcomodacao); try { // Achieving atomicity between original Catalog database operation and the IntegrationEventLog thanks to a local transaction await _configuracaoIntegrationEventService.SaveEventAndTipoSituacaoAcomodacaoContextChangesAsync(tipoSituacacoAcomodacaoSaveEvent, tipoSituacaoAcomodacaoToSave); } catch (Exception e) { //Validações das CONSTRAINTS do BANCO if (ruleValidaNomeTipoSituacaoAcomodacaoUnique(e.Message, ref msgRule)) { return(BadRequest(msgRule)); } else { return(BadRequest(e.Message)); } } // Publish through the Event Bus and mark the saved event as published await _configuracaoIntegrationEventService.PublishThroughEventBusAsync(tipoSituacacoAcomodacaoSaveEvent); return(CreatedAtAction(nameof(SalvarTipoSituacaoAcomodacao), tipoSituacaoAcomodacaoToSave.Id_TipoSituacaoAcomodacao)); }
public async Task SaveEventAndTipoSituacaoAcomodacaoContextChangesAsync(IntegrationEvent evt, TipoSituacaoAcomodacaoItem tipoSituacaoAcomodacaoToSave) { var strategy = _configuracaoContext.Database.CreateExecutionStrategy(); await strategy.ExecuteAsync(async() => { using (var transaction = _configuracaoContext.Database.BeginTransaction()) { try { await _configuracaoContext.SaveChangesAsync(); //Tratamento de Identity ((Events.TipoSituacaoAcomodacaoSaveIE)evt).TipoSituacaoAcomodacaoId = tipoSituacaoAcomodacaoToSave.Id_TipoSituacaoAcomodacao; await _eventLogService.SaveEventAsync(evt, _configuracaoContext.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); } } }); }