public virtual async Task InsertPets(IList <Pet> pets) { var petsFromSource = await _petRepository.SearchAsync(new PetFilter { PetSource = _parser.Source, PerPage = int.MaxValue }); var petsToInsert = pets .Where(p => !petsFromSource.Any(pe => p.ExternalId == pe.ExternalId)); var petsRemovedFromSource = petsFromSource .Where(p => !pets.Any(pe => p.ExternalId == pe.ExternalId)); foreach (var pet in petsRemovedFromSource) { await _petHandler.SetPetStatus(pet.Id, PetStatus.Adopted); } foreach (var pet in petsToInsert) { pet.PetTraits ??= new List <PetTrait>(); pet.Source = _parser.Source; if (pet.Birthday != null) { await AddAgeTrait(pet); } await AddGenderTrait(pet); } foreach (var pet in petsToInsert) { await _petHandler.AddPet(pet); } await _unitOfWork.SaveChangesAsync(); foreach (var pet in petsToInsert) { await _petHandler.SetPetStatus(pet.Id, PetStatus.Created); await _petHandler.SetPetStatus(pet.Id, PetStatus.WaitingForAdoption); } await _unitOfWork.SaveChangesAsync(); }
public async Task <IActionResult> Post(PetDto pet) { try { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var petToInsert = new Pet { Name = pet.Name, Gender = pet.Gender, Birthday = pet.Birthday, Description = pet.Description, Source = pet.Source, SourceLink = pet.SourceLink, AnimalTypeId = pet.AnimalTypeId, UserId = pet.UserId }; petToInsert.MetaFileLinks = new List <MetaFileLink>(); foreach (var mflId in pet.MetaFileLinkIds) { MetaFileLink mfl = _mflRepository.GetByIdAsync(mflId).Result; petToInsert.MetaFileLinks.Add(mfl); } var traitsFilter = new TraitFilter { AnimalTypeId = pet.AnimalTypeId }; //get list of all traits by AnimalTypeId List <Trait> traitsByAnimal = _traitRepository.SearchAsync(traitsFilter).Result.ToList(); petToInsert.PetTraits = new List <PetTrait>(); foreach (KeyValuePair <string, string> entry in pet.Traits) { //Use entry.Value & entry.Key var foundTrait = traitsByAnimal.FirstOrDefault(traitItem => traitItem.Id == int.Parse(entry.Key)); var foundTraitOption = foundTrait.TraitOptions.FirstOrDefault(op => op.Id == int.Parse(entry.Value)); petToInsert.PetTraits.Add( new PetTrait { Trait = foundTrait, TraitOption = foundTraitOption }); } await _petHandler.AddPet(petToInsert); await _unitOfWork.SaveChangesAsync(); return(Ok(_mapper.Map <PetDto>(petToInsert))); } catch (Exception ex) { return(BadRequest()); } }