public IActionResult UpdateTurmaForEscola(Guid escolaId, Guid id, [FromBody] TurmaForUpdateDto turma)
        {
            if (turma == null)
            {
                return(BadRequest());
            }

            if (!_elevaRepository.EscolaExists(escolaId))
            {
                return(NotFound());
            }

            var turmaForEscolaFromRepo = _elevaRepository.GetTurmaForEscola(escolaId, id);

            if (turmaForEscolaFromRepo == null)
            {
                var turmaToAdd = Mapper.Map <Turma>(turma);
                turmaToAdd.Id = id;

                _elevaRepository.AddTurmaForEscola(escolaId, turmaToAdd);
                if (!_elevaRepository.Save())
                {
                    throw new Exception("Creating a turma with upserting failed to save.");
                }

                var turmaToReturn = Mapper.Map <TurmaDto>(turmaToAdd);

                return(CreatedAtRoute("GetTurmaForEscola", new { escolaId = escolaId, id = turmaToReturn.Id },
                                      turmaToReturn));
            }

            Mapper.Map(turma, turmaForEscolaFromRepo);

            _elevaRepository.UpdateTurmaForEscola(turmaForEscolaFromRepo);

            if (!_elevaRepository.Save())
            {
                throw new Exception($"Updating turma {id} for escola {escolaId} failed on save");
            }

            return(NoContent());
        }
        public IActionResult PartialUpdateTurmaForEscola(Guid escolaId, Guid id,
                                                         [FromBody] JsonPatchDocument <TurmaForUpdateDto> patchDoc)
        {
            if (patchDoc == null)
            {
                return(BadRequest());
            }

            if (!_elevaRepository.EscolaExists(escolaId))
            {
                return(NotFound());
            }

            var turmaForEscolaFromRepo = _elevaRepository.GetTurmaForEscola(escolaId, id);

            if (turmaForEscolaFromRepo == null)
            {
                var turmaDto = new TurmaForUpdateDto();
                patchDoc.ApplyTo(turmaDto, ModelState);

                if (turmaDto.Etapa != "Ensino Médio" && turmaDto.Etapa != "Ensino Fundamental")
                {
                    ModelState.AddModelError(nameof(TurmaForCreationDto), "A etapa não está correta");
                }

                TryValidateModel(turmaDto);

                if (!ModelState.IsValid)
                {
                    return(new UnprocessableEntityObjectResult(ModelState));
                }

                var turmaToAdd = Mapper.Map <Turma>(turmaDto);
                turmaToAdd.Id = id;

                _elevaRepository.AddTurmaForEscola(escolaId, turmaToAdd);

                if (!_elevaRepository.Save())
                {
                    throw new Exception("Creating a turma with upserting failed to save.");
                }

                var turmaToReturn = Mapper.Map <TurmaDto>(turmaToAdd);

                return(CreatedAtRoute("GetTurmaForEscola", new { escolaId = escolaId, id = turmaToReturn.Id },
                                      turmaToReturn));
            }

            var turmaToPatch = Mapper.Map <TurmaForUpdateDto>(turmaForEscolaFromRepo);

            patchDoc.ApplyTo(turmaToPatch, ModelState);


            if (turmaToPatch.Etapa != "Ensino Médio" && turmaToPatch.Etapa != "Ensino Fundamental")
            {
                ModelState.AddModelError(nameof(TurmaForCreationDto), "A etapa não está correta");
            }

            TryValidateModel(turmaToPatch);

            if (!ModelState.IsValid)
            {
                return(new UnprocessableEntityObjectResult(ModelState));
            }

            // add validation

            Mapper.Map(turmaToPatch, turmaForEscolaFromRepo);

            _elevaRepository.UpdateTurmaForEscola(turmaForEscolaFromRepo);

            if (!_elevaRepository.Save())
            {
                throw new Exception($"Patching turma {id} for escola {escolaId} failed on save");
            }

            return(NoContent());
        }