using System; using System.Collections.Generic; using System.Linq; using API.Data; using API.Entities; using API.Entities.Enums; namespace API.Helpers; public static class PersonHelper { /// /// Given a list of all existing people, this will check the new names and roles and if it doesn't exist in allPeople, will create and /// add an entry. For each person in name, the callback will be executed. /// /// This is used to add new people to a list without worrying about duplicating rows in the DB /// /// /// /// public static void UpdatePeople(ICollection allPeople, IEnumerable names, PersonRole role, Action action) { var allPeopleTypeRole = allPeople.Where(p => p.Role == role).ToList(); foreach (var name in names) { var normalizedName = Parser.Parser.Normalize(name); var person = allPeopleTypeRole.FirstOrDefault(p => p.NormalizedName.Equals(normalizedName)); if (person == null) { person = DbFactory.Person(name, role); allPeople.Add(person); } action(person); } } /// /// Remove people on a list for a given role /// /// Used to remove before we update/add new people /// Existing people on Entity /// People from metadata /// Role to filter on /// Callback which will be executed for each person removed public static void RemovePeople(ICollection existingPeople, IEnumerable people, PersonRole role, Action action = null) { var normalizedPeople = people.Select(Parser.Parser.Normalize).ToList(); foreach (var person in normalizedPeople) { var existingPerson = existingPeople.FirstOrDefault(p => p.Role == role && person.Equals(p.NormalizedName)); if (existingPerson == null) continue; existingPeople.Remove(existingPerson); action?.Invoke(existingPerson); } } /// /// Removes all people that are not present in the removeAllExcept list. /// /// /// /// Callback for all entities that was removed public static void KeepOnlySamePeopleBetweenLists(ICollection existingPeople, ICollection removeAllExcept, Action action = null) { var existing = existingPeople.ToList(); foreach (var person in existing) { var existingPerson = removeAllExcept.FirstOrDefault(p => p.Role == person.Role && person.NormalizedName.Equals(p.NormalizedName)); if (existingPerson == null) { existingPeople.Remove(person); action?.Invoke(person); } } } /// /// Adds the person to the list if it's not already in there /// /// /// public static void AddPersonIfNotExists(ICollection metadataPeople, Person person) { var existingPerson = metadataPeople.SingleOrDefault(p => p.NormalizedName == Parser.Parser.Normalize(person.Name) && p.Role == person.Role); if (existingPerson == null) { metadataPeople.Add(person); } } }