public void Handle(CreateDeepInternationalAffiliation command) { if (command == null) { throw new ArgumentNullException("command"); } var person = _entities.Get <Person>().SingleOrDefault(p => p.User.Name == command.Principal.Identity.Name); if (person == null) { string message = string.Format("Person {0} not found.", command.Principal.Identity.Name); throw new Exception(message); } var createExpertiseCommand = new CreateInternationalAffiliation(command.Principal) { From = command.From, To = command.To, OnGoing = command.OnGoing, Institution = command.Institution, Position = command.Position }; _createInternationalAffiliation.Handle(createExpertiseCommand); foreach (var placeId in command.PlaceIds) { var createExpertiseLocationCommand = new CreateInternationalAffiliationLocation( command.Principal, createExpertiseCommand.CreatedInternationalAffiliation.RevisionId, placeId); _createInternationalAffiliationLocation.Handle(createExpertiseLocationCommand); } if (!command.NoCommit) { _unitOfWork.SaveChanges(); } command.CreatedInternationalAffiliation = createExpertiseCommand.CreatedInternationalAffiliation; command.CreatedInternationalAffiliationId = command.CreatedInternationalAffiliation.RevisionId; }
public void Handle(UpdateInternationalAffiliation command) { if (command == null) { throw new ArgumentNullException("command"); } /* Retrieve the expertise to update. */ var target = _entities.Get <InternationalAffiliation>().SingleOrDefault(a => a.RevisionId == command.Id); if (target == null) { string message = String.Format("Affiliation Id {0} not found.", command.Id); throw new Exception(message); } var updated = new InternationalAffiliation { From = command.From, To = command.To, OnGoing = command.OnGoing, Institution = command.Institution, Position = command.Position, Locations = command.Locations }; /* If target fields equal new field values, we do not proceed. */ if (target.Equals(updated)) { return; } /* Run through all new locations and attempt to find same in target. If not found, create.*/ foreach (var location in command.Locations.ToList()) { var targetLocation = target.Locations.SingleOrDefault(x => x.PlaceId == location.PlaceId); if (targetLocation == null) { var createAffiliationLocation = new CreateInternationalAffiliationLocation( command.Principal, target.RevisionId, location.PlaceId) { NoCommit = true }; _createAffiliationLocation.Handle(createAffiliationLocation); } } /* Delete activity locations. Run through the targets list of locations and try to find * a matching one in the updated list. If not found, it must have been deleted. */ foreach (var location in target.Locations.ToList()) { var updateLocation = command.Locations.SingleOrDefault(x => x.PlaceId == location.PlaceId); if (updateLocation == null) { var deleteAffiliationLocationCommand = new DeleteInternationalAffiliationLocation( command.Principal, location.RevisionId) { NoCommit = true }; _deleteAffiliationLocation.Handle(deleteAffiliationLocationCommand); } } /* Update fields */ target.From = command.From; target.To = command.To; target.OnGoing = command.OnGoing; target.Institution = command.Institution; target.Position = command.Position; target.Locations = command.Locations; target.UpdatedOnUtc = command.UpdatedOn.ToUniversalTime(); target.UpdatedByPrincipal = command.Principal.Identity.Name; _entities.Update(target); if (!command.NoCommit) { _unitOfWork.SaveChanges(); } }