public async Task <IEnumerable <object> > GetGroups(Guid contactId) { var request = new MemberSearchRequest { ContactId = contactId }; var json = JsonConvert.SerializeObject(request); _logger.LogInformation($"groups.by.query ${json}"); var data = (await _repository.SearchAsync(request)).ToList(); _logger.LogInformation($"found.groups {data.Count}"); var groupIds = data.Select(it => it.GroupId); var groups = await _groupRepository.SearchByIdsAsync(groupIds.ToList()); var dict = groups.ToImmutableDictionary(x => x.Id, x => x); return(data.Select(it => new { it.Id, it.GroupId, it.ContactId, it.Role, dict.SafeGet(it.GroupId).Name, dict.SafeGet(it.GroupId).Description }).ToList()); }
/// <summary> /// Search the account or a specific list for members that match the specified query terms. /// </summary> /// <param name="request"></param> /// <returns></returns> public async Task <MemberSearchResult> SearchAsync(MemberSearchRequest request = null) { using (var client = CreateMailClient($"search-members{request?.ToQueryString()}")) { var response = await client.GetAsync("").ConfigureAwait(false); await response.EnsureSuccessMailChimpAsync().ConfigureAwait(false); return(await response.Content.ReadAsAsync <MemberSearchResult>().ConfigureAwait(false)); } }
public ActionResult SearchMember(string query, string listId) { Task <MemberSearchResult> result = null; MemberSearchRequest request = new MemberSearchRequest { Query = query, ListId = listId }; if (request != null) { result = mailChimpManager.Members.SearchAsync(request); } return(View(result.Result)); }
public MemberSearchResponse PointCard_MemberSearch(MemberSearchRequest req) { MemberSearchResponse ret = null; try { MemberSearchClass item = new MemberSearchClass(httpClient) { Req = req }; item.Communication(); ret = (MemberSearchResponse)item.Res; } catch { throw; } return(ret); }
public async Task <IEnumerable <MemberViewModel> > Search(MemberSearchRequest request) { var json = JsonConvert.SerializeObject(request); _logger.LogInformation($"members.by.query ${json}"); var data = (await _repository.SearchAsync(request)).ToList(); _logger.LogInformation($"found.members {data.Count}"); var contactIds = data.Select(it => it.ContactId); var contactsMap = await _contactService.GetNamesByIdAsync(contactIds.ToList()); return(data.Select(it => { var contact = contactsMap[it.ContactId]; var view = _mapper.Map <MemberViewModel>(it); view.ContactName = contact.FullName; view.ContactAvatar = contact.Avatar; return view; })); }
public async Task <IEnumerable <Member> > SearchAsync(MemberSearchRequest request, bool fullQuery = false) { var builder = Builders <Member> .Filter; var filter = builder.Empty; if (request.ContactId.HasValue) { filter &= builder.Eq(x => x.ContactId, request.ContactId); } if (request.GroupId.HasValue) { filter &= builder.Eq(x => x.GroupId, request.GroupId); } if (request.Roles?.Any() ?? false) { filter &= builder.Where(q => request.Roles.Contains(q.Role)); } return(await _context.GroupMembers.Find(filter).ToListAsync()); }
public async Task <FabricAuthUserSearchResponse> Search(MemberSearchRequest request) { var searchResults = new List <MemberSearchResponse>(); var rolesToSearch = !string.IsNullOrEmpty(request.ClientId) ? await _roleService.GetRoles(await _clientService.GetClient(request.ClientId)) : await _roleService.GetRoles(request.Grain, request.SecurableItem); var roleEntities = rolesToSearch.ToList(); _logger.Debug($"roleEntities = {string.Join(Environment.NewLine, roleEntities)}"); if (roleEntities.Count == 0) { return(new FabricAuthUserSearchResponse { HttpStatusCode = HttpStatusCode.OK, Results = new List <MemberSearchResponse>() }); } var groupEntities = roleEntities .SelectMany(r => r.Groups) .Where(g => !g.IsDeleted) .Distinct().ToList(); _logger.Debug($"groupEntities = {string.Join(Environment.NewLine, groupEntities)}"); // add groups to the response searchResults.AddRange(groupEntities.Select(g => new MemberSearchResponse { SubjectId = g.Name, GroupName = g.Name, DisplayName = string.IsNullOrWhiteSpace(g.DisplayName) ? g.Name : g.DisplayName, Roles = g.Roles .Where(r => string.IsNullOrWhiteSpace(request.Grain) || string.Equals(request.Grain, r.Grain, StringComparison.OrdinalIgnoreCase)) .Where(r => string.IsNullOrWhiteSpace(request.SecurableItem) || string.Equals(request.SecurableItem, r.SecurableItem, StringComparison.OrdinalIgnoreCase)) .Select(r => r.ToRoleApiModel()).ToList(), EntityType = string.Equals(g.Source, GroupConstants.CustomSource, StringComparison.OrdinalIgnoreCase) ? MemberSearchResponseEntityType.CustomGroup.ToString() : MemberSearchResponseEntityType.DirectoryGroup.ToString(), IdentityProvider = g.IdentityProvider, TenantId = g.TenantId })); // get users directly mapped to client roles var users = roleEntities.SelectMany(r => r.Users).Where(u => !u.IsDeleted).Distinct(new UserComparer()); var userList = new List <MemberSearchResponse>(); foreach (var user in users) { // add user to response userList.Add(new MemberSearchResponse { SubjectId = user.SubjectId, DisplayName = string.IsNullOrWhiteSpace(user.IdentityProviderUserPrincipalName) ? user.SubjectId : user.IdentityProviderUserPrincipalName, IdentityProvider = user.IdentityProvider, Roles = user.Roles.Intersect(roleEntities).Select(r => r.ToRoleApiModel()).ToList(), EntityType = MemberSearchResponseEntityType.User.ToString() }); } var fabricIdentityUserResponse = await _identityServiceProvider.Search(request.ClientId, userList.Select(u => $"{u.SubjectId}:{u.IdentityProvider}")); if (fabricIdentityUserResponse != null && fabricIdentityUserResponse.HttpStatusCode == System.Net.HttpStatusCode.OK) { // update user details with Fabric.Identity response foreach (var user in fabricIdentityUserResponse.Results) { var userSearchResponse = userList.FirstOrDefault(u => string.Equals(u.SubjectId, user.SubjectId, StringComparison.OrdinalIgnoreCase)); if (userSearchResponse == null) { continue; } userSearchResponse.FirstName = user.FirstName; userSearchResponse.MiddleName = user.MiddleName; userSearchResponse.LastName = user.LastName; userSearchResponse.LastLoginDateTimeUtc = user.LastLoginDate; } } searchResults.AddRange(userList); _logger.Debug($"searchResults = {string.Join(Environment.NewLine, searchResults)}"); var pageSize = request.PageSize ?? 100; var pageNumber = request.PageNumber ?? 1; var filteredResults = searchResults.Filter(request).ToList(); return(new FabricAuthUserSearchResponse { HttpStatusCode = fabricIdentityUserResponse != null && fabricIdentityUserResponse.HttpStatusCode != System.Net.HttpStatusCode.OK ? HttpStatusCode.PartialContent : HttpStatusCode.OK, Results = filteredResults .Sort(request) .Skip((pageNumber - 1) * pageSize) .Take(pageSize), TotalCount = filteredResults.Count }); }
public async Task <FabricAuthUserSearchResponse> Search(MemberSearchRequest request) { var searchResults = new List <MemberSearchResponse>(); if (string.IsNullOrWhiteSpace(request.ClientId)) { throw new BadRequestException <MemberSearchRequest>("Client ID is required."); } var client = await _clientService.GetClient(request.ClientId); var clientRoles = await _roleService.GetRoles(client); var clientRoleEntities = clientRoles.ToList(); _logger.Debug($"clientRoles = {clientRoleEntities.ToString(Environment.NewLine)}"); if (clientRoleEntities.Count == 0) { return(new FabricAuthUserSearchResponse { HttpStatusCode = Nancy.HttpStatusCode.OK, Results = new List <MemberSearchResponse>() }); } // get all groups tied to clientRoles var groupIds = clientRoleEntities.SelectMany(r => r.Groups).Distinct().ToList(); _logger.Debug($"groupIds = {groupIds.ToString(Environment.NewLine)}"); if (groupIds.Count == 0) { return(new FabricAuthUserSearchResponse { HttpStatusCode = Nancy.HttpStatusCode.OK, Results = new List <MemberSearchResponse>() }); } var groupEntities = new List <Group>(); foreach (var groupId in groupIds) { try { var group = await _groupService.GetGroup(groupId, request.ClientId); groupEntities.Add(group); } catch (NotFoundException <Group> ex) { _logger.Error($"{ex.Message} (Group is mapped to at least 1 valid role)"); } } _logger.Debug($"groupEntities = {groupEntities.ToString(Environment.NewLine)}"); var groupsMappedToClientRoles = groupEntities.Where(g => g.Roles.Any(r => clientRoleEntities.Contains(r))).ToList(); _logger.Debug($"groupsMappedToClientRoles = {groupsMappedToClientRoles.ToString(Environment.NewLine)}"); // add all non-custom groups to the response searchResults.AddRange(groupsMappedToClientRoles.Select(g => new MemberSearchResponse { GroupName = g.Name, Roles = g.Roles.Select(r => r.Name), EntityType = MemberSearchResponseEntityType.Group.ToString() })); // get all users mapped to groups in client roles var users = groupsMappedToClientRoles .Where(g => g.Users != null && g.Users.Count > 0) .SelectMany(g => g.Users) .DistinctBy(u => u.SubjectId); var userList = new List <MemberSearchResponse>(); foreach (var user in users) { // get groups for user var userGroups = user.Groups; var userGroupEntities = groupEntities.Where(g => userGroups.Contains(g.Name, StringComparer.OrdinalIgnoreCase)); // get roles for user var userRoles = userGroupEntities.SelectMany(g => g.Roles).Select(r => r.Name).ToList(); userRoles.AddRange(clientRoleEntities .Where(r => r.Users.Any(u => u.IdentityProvider.Equals(user.IdentityProvider, StringComparison.OrdinalIgnoreCase) && u.SubjectId.Equals(user.SubjectId, StringComparison.OrdinalIgnoreCase))) .Select(r => r.Name) .ToList()); // add user to response userList.Add(new MemberSearchResponse { SubjectId = user.SubjectId, IdentityProvider = user.IdentityProvider, Roles = userRoles, EntityType = MemberSearchResponseEntityType.User.ToString() }); } var fabricIdentityUserResponse = await _identityServiceProvider.Search(request.ClientId, userList.Select(u => $"{u.SubjectId}:{u.IdentityProvider}")); if (fabricIdentityUserResponse != null && fabricIdentityUserResponse.HttpStatusCode == System.Net.HttpStatusCode.OK) { // update user details with Fabric.Identity response foreach (var user in fabricIdentityUserResponse.Results) { var userSearchResponse = userList.FirstOrDefault(u => string.Equals(u.SubjectId, user.SubjectId, StringComparison.OrdinalIgnoreCase)); if (userSearchResponse == null) { continue; } userSearchResponse.FirstName = user.FirstName; userSearchResponse.MiddleName = user.MiddleName; userSearchResponse.LastName = user.LastName; userSearchResponse.LastLoginDateTimeUtc = user.LastLoginDate; } } searchResults.AddRange(userList); _logger.Debug($"searchResults = {searchResults.ToString(Environment.NewLine)}"); var pageSize = request.PageSize ?? 100; var pageNumber = request.PageNumber ?? 1; return(new FabricAuthUserSearchResponse { HttpStatusCode = fabricIdentityUserResponse != null && fabricIdentityUserResponse.HttpStatusCode != System.Net.HttpStatusCode.OK ? Nancy.HttpStatusCode.PartialContent : Nancy.HttpStatusCode.OK, Results = searchResults .Filter(request) .Sort(request) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) }); }