public async Task <IEnumerable <ColidEntryContactInvalidUsersDto> > CollectAndPrepareContactMessagesForEntries() { var contactAndEntryList = new List <ColidEntryContactInvalidUsersDto>(); var adUserEmailSet = await _reportingService.GetContactsFromAllColidEntries(); var adUserValidEmailSet = RemoveInvalidEmailsByPattern(adUserEmailSet); var contactValidityList = await _appDataService.CheckUsersValidityAsync(adUserValidEmailSet); // ad invalid emails by pattern to invalid contacts -> allow any string in reporting service var invalidContacts = contactValidityList.Where(x => !x.AccountEnabled); var invalidContactsMails = invalidContacts.Select(c => c.Mail).ToHashSet(); foreach (var adUserDto in invalidContacts) { var entityList = await _reportingService.GetContactReferencedEntries(adUserDto.Mail); foreach (var colidEntryContactsDto in entityList) { if (IsTechnicalUserInEntry(colidEntryContactsDto, adUserDto.Mail)) { continue; // then skip message creation } var contactPerson = DetermineContactPerson(adUserDto.Mail, colidEntryContactsDto, invalidContactsMails); var contactAndEntries = contactAndEntryList.FirstOrDefault(c => c.ContactMail == contactPerson); if (contactAndEntries != null) { if (contactAndEntries.TryGetColidEntry(colidEntryContactsDto.PidUri, out ColidEntryInvalidUsersDto colidEntry)) { // append invalid user to existing users' colid entry colidEntry.InvalidUsers.Add(adUserDto.Mail); } else { // create new colid entry for user var ce = new ColidEntryInvalidUsersDto(colidEntryContactsDto.PidUri, colidEntryContactsDto.Label, new HashSet <string> { adUserDto.Mail }); contactAndEntries.ColidEntries.Add(ce); } } else { // create new contact message var invalidUserDto = new ColidEntryInvalidUsersDto(colidEntryContactsDto.PidUri, colidEntryContactsDto.Label, new HashSet <string> { adUserDto.Mail }); var contactDto = new ColidEntryContactInvalidUsersDto(); contactDto.ContactMail = contactPerson; contactDto.ColidEntries.Add(invalidUserDto); contactAndEntryList.Add(contactDto); } } } return(contactAndEntryList); }