예제 #1
0
        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());
        }
예제 #2
0
        /// <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));
            }
        }
예제 #3
0
        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);
        }
예제 #5
0
        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;
            }));
        }
예제 #6
0
        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());
        }
예제 #7
0
        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
            });
        }
예제 #8
0
        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)
            });
        }