public async Task <ActionResult <ContactSearchResult> > SearchContacts([FromBody] MembersSearchCriteria criteria) { if (criteria == null) { criteria = AbstractTypeFactory <MembersSearchCriteria> .TryCreateInstance(); } criteria.MemberType = typeof(Contact).Name; criteria.MemberTypes = new[] { criteria.MemberType }; if (!(await AuthorizeAsync(criteria, ModuleConstants.Security.Permissions.Read)).Succeeded) { return(Unauthorized()); } var searchResult = await _memberSearchService.SearchMembersAsync(criteria); var result = new ContactSearchResult { TotalCount = searchResult.TotalCount, Results = searchResult.Results.OfType <Contact>().ToList() }; return(Ok(result)); }
/// <summary> /// Returns a list of contacts that meet the specified search criteria. /// </summary> /// <param name="userId"></param> /// <param name="searchParms"></param> /// <returns></returns> public IEnumerable <ContactSearchResult> SearchContacts(int userId, ContactSearchParameters searchParms) { List <ContactSearchResult> results = new List <ContactSearchResult>(); // A malformed JSON string can result in a null searchParms argument if (searchParms == null) { return(results); } // Get out quick if called with no parms. Is there any need to call this with no parms? if (string.IsNullOrEmpty(searchParms.FirstName) && string.IsNullOrEmpty(searchParms.LastName) && string.IsNullOrEmpty(searchParms.PrimaryEmail)) { return(results); } // Change any null values to empty strings to make the query more forgiving if (searchParms.FirstName == null) { searchParms.FirstName = string.Empty; } if (searchParms.LastName == null) { searchParms.LastName = string.Empty; } if (searchParms.PrimaryEmail == null) { searchParms.PrimaryEmail = string.Empty; } using (var db = new CSET_Context()) { var email = db.USERS.Where(x => x.UserId == userId).FirstOrDefault(); if (email == null) { return(results); } // create a list of user emails already attached to the assessment var attachedEmails = db.ASSESSMENT_CONTACTS.Where(x => x.Assessment_Id == searchParms.AssessmentId).ToList().Select(x => x.PrimaryEmail); var query = from ac in db.ASSESSMENT_CONTACTS join a in db.ASSESSMENTS on ac.Assessment_Id equals a.Assessment_Id join myac in db.ASSESSMENT_CONTACTS on a.Assessment_Id equals myac.Assessment_Id where ac.FirstName.Contains(searchParms.FirstName) && ac.LastName.Contains(searchParms.LastName) && ac.PrimaryEmail.Contains(searchParms.PrimaryEmail) && myac.PrimaryEmail == email.PrimaryEmail // don't include anyone already attached to the current assessment && !attachedEmails.Contains(ac.PrimaryEmail) select new { ac.UserId, ac.FirstName, ac.LastName, ac.PrimaryEmail }; // Generate a distinct, case-insensitive result list var candidates = query.ToList(); var filteredCandidates = query.ToList(); filteredCandidates.Clear(); foreach (var candidate in candidates) { if (!filteredCandidates.Exists(x => String.Equals(x.FirstName, candidate.FirstName, StringComparison.InvariantCultureIgnoreCase) && String.Equals(x.LastName, candidate.LastName, StringComparison.InvariantCultureIgnoreCase) && String.Equals(x.PrimaryEmail, candidate.PrimaryEmail, StringComparison.InvariantCultureIgnoreCase))) { filteredCandidates.Add(candidate); ContactSearchResult r = new ContactSearchResult { UserId = (int)candidate.UserId, FirstName = candidate.FirstName, LastName = candidate.LastName, PrimaryEmail = candidate.PrimaryEmail }; results.Add(r); } } return(results); } }