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)); }
public async Task <IActionResult> GetNewsFeed(NewsFeedRequest request) { var data = await postService.GetNewsFeed(request); return(Ok(new ApiOkResponse(data))); }