Пример #1
0
        public async Task <IEnumerable <PostViewModel> > GetNewsFeed(NewsFeedRequest request)
        {
            var dataSource = new List <Post>();

            //Lấy danh sách post theo ngày
            if (request.FromDate.HasValue && request.ToDate.HasValue)
            {
                var fromDate    = request.FromDate.Value;
                var toDaTe      = request.ToDate.Value;
                var postBuilder = Builders <Post> .Filter;
                var postFilter  = postBuilder.Lt(CreatedDate, toDaTe)
                                  & postBuilder.Gt(CreatedDate, fromDate);
                var posts = await postRepository.FindListAsync(postFilter);

                // dataSource = posts;
            }

            //Lấy danh sách user_id đang theo dõi
            var currentUser = Feature.CurrentUser(httpContextAccessor, userRepository);
            var userBuilder = Builders <Follow> .Filter.Eq(FromId, currentUser.OId);

            var follows = await followRepository.FindListAsync(userBuilder);

            var followIds = follows.Select(x => x.ToId).Distinct();

            //Lấy danh sách post của chính mình
            var postByCurrentBuilder = Builders <Post> .Filter;
            var posytByCurrentFilter = postByCurrentBuilder.Eq(AuthorId, currentUser.OId);
            var postByCurrent        = await postRepository.FindListAsync(posytByCurrentFilter);

            dataSource.AddRange(postByCurrent);


            //Duyệt danh sách và lấy ra những post của người dùng đang theo dõi.
            foreach (var followId in followIds)
            {
                var postByAuthorBuilder = Builders <Post> .Filter;
                var postByAuthorFilter  = postByAuthorBuilder.Eq(AuthorId, followId)
                                          & postByAuthorBuilder.Eq(Status, ItemStatus.Active);
                var postByAuthor = await postRepository.FindListAsync(postByAuthorFilter);

                dataSource.AddRange(postByAuthor);
            }

            //Lấy danh sách field là những thế mạnh của người dùng
            var userForcesBuilder       = Builders <ObjectLevel> .Filter;
            var userForcesFilter        = userForcesBuilder.Eq(ObjectIdCs, currentUser.OId);
            var userForcesByObjectLevel = await objectLevelRepository.FindListAsync(userForcesFilter);

            var userForces = userForcesByObjectLevel.Select(x => x.FieldId).Distinct();

            //Lấy danh sách field_group từ danh sách field bên trên
            var fieldGroups      = fieldGroupRepository.GetAll();
            var fieldGroupsFinal = new List <FieldGroup>();

            foreach (var fieldId in userForces)
            {
                foreach (var fieldGroup in fieldGroups)
                {
                    if (fieldGroup.FieldId.Contains(fieldId))
                    {
                        fieldGroupsFinal.Add(fieldGroup);
                    }
                }
            }
            fieldGroupsFinal = fieldGroupsFinal.Distinct().ToList();

            //Duyệt danh sách field_group để lấy các field liên quan trong group.
            var fieldToFilter = new List <string>();

            fieldGroupsFinal.ForEach(x => fieldToFilter.AddRange(x.FieldId));
            fieldToFilter = fieldToFilter.Distinct().ToList();

            //Từ danh sách field mở rộng này, lấy dang sách các object thuộc về field đó
            var listObjectId = new List <string>();

            foreach (var x in fieldToFilter)
            {
                var objectLevelBuilder = Builders <ObjectLevel> .Filter;
                var objectLevelFilter  = objectLevelBuilder.Eq(FieldId, x)
                                         & objectLevelBuilder.Eq(IsActive, true);
                var objectLevels = await objectLevelRepository.FindListAsync(objectLevelFilter);

                listObjectId.AddRange(objectLevels.Select(x => x.ObjectId));
            }
            listObjectId = listObjectId.Distinct().ToList();

            //Lấy danh sách các post có id trong danh sách trên
            var _posts = new List <Post>();

            listObjectId.ForEach(async x =>
            {
                var post = await postRepository.GetByIdAsync(ObjectId.Parse(x));
                if (post != null)
                {
                    _posts.Add(post);
                }
            });
            var _postIds = _posts.Select(x => x.OId);

            //Kết hợp với datasoure ban đầu9
            //dataSource = dataSource.Where(x => _postIds.Contains(x.OId)).Distinct().ToList();
            dataSource.AddRange(_posts);
            dataSource = dataSource.GroupBy(x => x.OId).Select(grp => grp.FirstOrDefault()).ToList();
            dataSource = dataSource.Where(x => x.Status == ItemStatus.Active).ToList();
            if (request.Skip.HasValue && request.Count.HasValue)
            {
                dataSource = dataSource.Skip(request.Skip.Value).Take(request.Count.Value).ToList();
            }

            return(mapper.Map <List <PostViewModel> >(dataSource));
        }
Пример #2
0
        public async Task <IActionResult> GetNewsFeed(NewsFeedRequest request)
        {
            var data = await postService.GetNewsFeed(request);

            return(Ok(new ApiOkResponse(data)));
        }