public IActionResult UpdatePerson([FromBody] PersonUpdateVm model) { var apiResult = Try(() => { return(_personService.UpdatePerson(model)); }); return(Ok(apiResult)); }
public ServiceResult <bool> UpdatePerson(PersonUpdateVm model) { model.Validate(); var person = _repository.Person.GetById(model.Id); if (person == null) { throw new DomainException("Person Not Found", ExceptionLevel.Error); } if (model.CityId.HasValue) { var city = _repository.City.GetById(model.CityId.Value); if (city == null) { throw new DomainException("City not found", ExceptionLevel.Error); } } person.Update(model.FirstName, model.LastName, model.Gender, model.PrivateNumber, model.BirthDate, model.CityId); _repository.Person.Update(person); var oldNumber = _repository.PhoneNumber.GetByPersonId(person.Id); var deletedNumbers = oldNumber.Where(x => model.PhoneNumbers.All(ph => x.Id != ph.Id)).ToList(); var newNumbers = model.PhoneNumbers.Where(x => !x.Id.HasValue || oldNumber.All(on => on.Id != x.Id)) .ToList(); var updatedNumbers = model.PhoneNumbers.Where(x => oldNumber.Any(old => old.Id == x.Id)).ToList(); foreach (var modelPhoneNumber in newNumbers) { var newPhoneNumber = PhoneNumber.Create(person.Id, modelPhoneNumber.NumberType, modelPhoneNumber.Number); _repository.PhoneNumber.Create(newPhoneNumber); } foreach (var deletedNumber in deletedNumbers) { var old = _repository.PhoneNumber.GetById(deletedNumber.Id, true); old?.Delete(); } foreach (var updatedNumber in updatedNumbers) { if (updatedNumber.Id != null) { var old = _repository.PhoneNumber.GetById(updatedNumber.Id.Value, true); old?.Update(updatedNumber.NumberType, updatedNumber.Number); } } _repository.Person.Save(); return(new ServiceResult <bool> { Status = ServiceResultStatus.Success }); }