Exemplo n.º 1
0
        public async Task <IActionResult> SalvarCaracteristicaAcomodacao([FromBody] CaracteristicaAcomodacaoItem caracteristicaAcomodacaoToSave)
        {
            //AREA DE VALIDACAO
            string msgRule = "";

            if (!ruleValidaNomeCaracteristica(caracteristicaAcomodacaoToSave.nome_CaracteristicaAcomodacao, ref msgRule))
            {
                return(BadRequest(msgRule));
            }

            //FIM AREA DE VALIDACAO

            if (_administrativoContext.Set <CaracteristicaAcomodacaoItem>().Any(e => e.id_CaracteristicaAcomodacao == caracteristicaAcomodacaoToSave.id_CaracteristicaAcomodacao))
            {
                _administrativoContext.CaracteristicaAcomodacaoItems.Update(caracteristicaAcomodacaoToSave);
            }
            else
            {
                _administrativoContext.CaracteristicaAcomodacaoItems.Add(caracteristicaAcomodacaoToSave);
            }

            //Create Integration Event to be published through the Event Bus
            var caracteristicaAcomodacaoSaveEvent = new CaracteristicaAcomodacaoSaveIE(caracteristicaAcomodacaoToSave.id_CaracteristicaAcomodacao, caracteristicaAcomodacaoToSave.nome_CaracteristicaAcomodacao);

            try
            {
                // Achieving atomicity between original Catalog database operation and the IntegrationEventLog thanks to a local transaction
                await _administrativoIntegrationEventService.SaveEventAndCaracteristicaAcomodacaoContextChangesAsync(caracteristicaAcomodacaoSaveEvent, caracteristicaAcomodacaoToSave);
            }
            catch (Exception e)
            {
                //Validações das CONSTRAINTS do BANCO
                if (ruleValidaNomeCaracteristicaAcomodacaoUnique(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 _administrativoIntegrationEventService.PublishThroughEventBusAsync(caracteristicaAcomodacaoSaveEvent);


            return(CreatedAtAction(nameof(SalvarCaracteristicaAcomodacao), caracteristicaAcomodacaoToSave.id_CaracteristicaAcomodacao));
        }
 public async Task SaveEventAndCaracteristicaAcomodacaoContextChangesAsync(IntegrationEvent evt, CaracteristicaAcomodacaoItem caracteristicaAcomodacaoToSave)
 {
     var strategy = _administrativoContext.Database.CreateExecutionStrategy();
     await strategy.ExecuteAsync(async() =>
     {
         using (var transaction = _administrativoContext.Database.BeginTransaction())
         {
             try
             {
                 await _administrativoContext.SaveChangesAsync();
                 //Tratamento de Identity
                 ((Events.CaracteristicaAcomodacaoSaveIE)evt).CaracteristicaAcomodacaoId = caracteristicaAcomodacaoToSave.id_CaracteristicaAcomodacao;
                 await _eventLogService.SaveEventAsync(evt, _administrativoContext.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);
             }
         }
     });
 }