Exemplo n.º 1
0
        public async Task <IActionResult> Put(int eventoId, EventoDto model)
        {
            try
            {
                var evento = await repo.GetEventoAsyncById(eventoId, false);

                if (evento == null)
                {
                    return(NotFound());
                }

                var idLotes        = new List <int>();
                var idRedesSociais = new List <int>();

                model.Lotes.ForEach(lote => idLotes.Add(lote.Id));
                model.RedesSocials.ForEach(rede => idRedesSociais.Add(rede.Id));

                var lotes = evento.Lotes.Where(lote => !idLotes.Contains(lote.Id)).ToArray();
                var redes = evento.RedesSocials.Where(rede => !idRedesSociais.Contains(rede.Id)).ToArray();

                if (lotes.Length > 0)
                {
                    repo.DeleteRange(lotes);
                }
                if (redes.Length > 0)
                {
                    repo.DeleteRange(redes);
                }


                mapper.Map(model, evento);

                repo.Update(evento);

                if (await repo.SaveChangesAsync())
                {
                    return(Created($"api/evento/{model.Id}", mapper.Map <EventoDto>(evento)));
                }
            }
            catch (Exception)
            {
                return(this.StatusCode(StatusCodes.Status500InternalServerError, "Banco de dados falhou!"));;
            }

            return(BadRequest());
        }
Exemplo n.º 2
0
        //public async Task<IActionResult> Put(int EventoId, Evento model)
        // Após a criação dos DTOs alteramos para receber o EventoDto.
        public async Task <IActionResult> Put(int EventoId, EventoDto model)
        {
            try
            {
                // Verifica se encontra algum elemento.
                // Aqui eliminamos que seja feito algum Join no banco de dados com Eventos com Palestrantes
                // procuramos saber somente se o evento foi encontrado.
                var evento = await _repo.GetAllEventoAsyncById(EventoId, false);

                // Se não foi encontrado elemento não é atualizado.
                if (evento == null)
                {
                    return(NotFound());
                }

                //

                // → Com esse código estava dando duplicidade ao inserir Lote e Rede Social, ao contrario
                //  do que foi apresentado em aula.

                // ↓ Deletando relacionamento, quando acontece de duplicar o registro de Lotes e Redes Sociais.
                var idLotes        = new List <int>();
                var idRedesSociais = new List <int>();

                // ↓ Verifica quem esta dentro do model dos Lotes.
                model.Lotes.ForEach(item => idLotes.Add(item.Id));
                // ↓ Verifica quem esta dentro do model das RedeSociais.
                model.RedesSociais.ForEach(item => idRedesSociais.Add(item.Id));

                // ↓ Verifica quem está dentro do evento.
                var lotes = evento.Lotes.Where(
                    lote => !idLotes.Contains(lote.Id)
                    ).ToArray();

                var redesSociais = evento.RedesSociais.Where(
                    rede => !idRedesSociais.Contains(rede.Id)
                    ).ToArray();

                // ↓ Verifica se existe algum registro "duplicado" para deletar dos Lotes.
                if (lotes.Length > 0)
                {
                    _repo.DeleteRange(lotes);
                }

                // ↓ Verifica se existe algum registro "duplicado" para deletar das Redes Sociais.
                if (redesSociais.Length > 0)
                {
                    _repo.DeleteRange(redesSociais);
                }

                // Faz o mapeamento recebendo o model e substituindo pelo evento.
                _mapper.Map(model, evento);

                // Caso encontre o elemento segue o código ↓

                // Na atualização do model ele não precisa ser assincrono.
                // Aqui ele muda um estado do EntityFramework.
                // _repo.Update(model);
                // Após o mapeamento faz a atualização dos campos.
                _repo.Update(evento);

                // Na hora de salvar ele precisa ser assincrono (await).
                // Aqui ele salva toda a mudança de estado.
                if (await _repo.SaveChangeAsync())
                {
                    // Aqui utilizamos o status code 201 que foi salvo com sucesso.
                    return(Created($"/api/evento/{model.Id}", _mapper.Map <EventoDto>(evento))); // _mapper.Map<EventoDto>(evento) → retorna fazendo o match entre o evento com EventoDto.
                }
            }
            catch (System.Exception)
            {
                return(this.StatusCode(StatusCodes.Status500InternalServerError, "Banco de dados falhou"));
            }

            // Caso não tenha dado certo o SaveChangeAsync retorna a mensagem de erro BadRequest.
            return(BadRequest());
        }