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));
        }
Exemplo n.º 2
0
        /// <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);
            }
        }