예제 #1
0
        public async Task <UserViewModel> AddOrUpdateUserFields(UserAddFieldRequest request)
        {
            User user = await userRepository.GetByIdAsync(ObjectId.Parse(request.UserId));

            if (user != null)
            {
                FilterDefinition <ObjectLevel> buidler = Builders <ObjectLevel> .Filter.Eq("object_id", request.UserId);

                List <ObjectLevel> existObjectLevels = (await objectLevelRepository.FindListAsync(buidler)).ToList();

                foreach (string item in request.FieldId)
                {
                    var existObjectLevel = existObjectLevels.FirstOrDefault(x => x.FieldId == item);
                    if (existObjectLevel != null)
                    {
                        if (existObjectLevel.IsActive == false)
                        {
                            existObjectLevel.IsActive = true;
                        }

                        existObjectLevel.ModifiedDate = DateTime.Now;
                        await objectLevelRepository.UpdateAsync(existObjectLevel, existObjectLevel.Id);
                    }
                    else
                    {
                        ObjectLevel objectLevel = new ObjectLevel()
                        {
                            LevelId  = Constants.LevelConstants.LEVEL_0_ID,
                            FieldId  = item,
                            ObjectId = user.OId,
                            Point    = 0
                        };
                        await objectLevelRepository.AddAsync(objectLevel);
                    }
                }

                foreach (var ex in existObjectLevels)
                {
                    if (request.FieldId.FirstOrDefault(x => x == ex.FieldId) == null)
                    {
                        ex.IsActive     = false;
                        ex.ModifiedDate = DateTime.Now;
                        await objectLevelRepository.UpdateAsync(ex, ex.Id);
                    }
                }
                return(mapper.Map <UserViewModel>(user));
            }
            else
            {
                throw new Exception("Không tìm thấy user");
            }
        }
예제 #2
0
        public async Task AddPoint(string userId, string postId, int?customPoint)
        {
            var user = await userRepository.GetByIdAsync(ObjectId.Parse(userId));

            var post = await postRepository.GetByIdAsync(ObjectId.Parse(postId));

            if (post == null || post.Status != ItemStatus.Active)
            {
                return;
            }

            var builderUser = Builders <ObjectLevel> .Filter;
            var filterUser  = builderUser.Eq("object_id", userId)
                              & builderUser.Eq("is_active", true);
            var userObjectLevels = await objectLevelRepository.FindListAsync(filterUser);

            var builderPost = Builders <ObjectLevel> .Filter;
            var filterPost  = builderPost.Eq("object_id", postId)
                              & builderPost.Eq("is_active", true);
            var postObjectLevels = await objectLevelRepository.FindListAsync(filterPost);

            if (postObjectLevels.Count <= 0)
            {
                userObjectLevels.ForEach(async x =>
                {
                    await UpdateUserPoint(userId, x.FieldId, customPoint.HasValue ? customPoint.Value : 1);
                });
            }

            userObjectLevels.ForEach(x =>
            {
                postObjectLevels.ForEach(async y =>
                {
                    if (y.FieldId == x.FieldId)
                    {
                        var level = await levelRepository.GetByIdAsync(ObjectId.Parse(y.LevelId));
                        if (level != null)
                        {
                            switch (level.Order)
                            {
                            case 0:
                                await UpdateUserPoint(userId, x.FieldId, customPoint.HasValue ? customPoint.Value : PointLevel1);
                                break;

                            case 1:
                                await UpdateUserPoint(userId, x.FieldId, customPoint.HasValue ? customPoint.Value : PointLevel2);
                                break;

                            case 2:
                                await UpdateUserPoint(userId, x.FieldId, customPoint.HasValue ? customPoint.Value : PointLevel3);
                                break;

                            case 3:
                                await UpdateUserPoint(userId, x.FieldId, customPoint.HasValue ? customPoint.Value : PointLevel4);
                                break;

                            case 4:
                            case 5:
                                await UpdateUserPoint(userId, x.FieldId, customPoint.HasValue ? customPoint.Value : PointLevel5);
                                break;

                            default:
                                await UpdateUserPoint(userId, x.FieldId, customPoint.HasValue ? customPoint.Value : PointDefault);
                                break;
                            }
                        }
                    }
                });
            });
        }
예제 #3
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));
        }