示例#1
0
        public async Task Test_04_FollowAsync()
        {
            using (KoalaBlogDbContext dbContext = new KoalaBlogDbContext())
            {
                PersonHandler perHandler = new PersonHandler(dbContext);
                GroupHandler groupHandler = new GroupHandler(dbContext);
                GroupMemberHandler gmHandler = new GroupMemberHandler(dbContext);

                //1. test normal.
                Person sam = CreatePerson("TestSam", "TestSam");
                Person joan = CreatePerson("TestJoan", "TestJoan");

                bool isSucceed = await perHandler.FollowAsync(sam.ID, joan.ID);

                sam = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == sam.ID);
                joan = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == joan.ID);

                Assert.IsTrue(isSucceed);
                Assert.AreEqual(sam.MyFollowingPersons.Count, 1);
                Assert.AreEqual(sam.MyFans.Count, 0);
                Assert.AreEqual(joan.MyFollowingPersons.Count, 0);
                Assert.AreEqual(joan.MyFans.Count, 1);

                //2. test one more time follow, and check it count was changed.
                isSucceed = await perHandler.FollowAsync(sam.ID, joan.ID);

                sam = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == sam.ID);
                joan = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == joan.ID);

                Assert.IsTrue(isSucceed);
                Assert.AreEqual(sam.MyFollowingPersons.Count, 1);
                Assert.AreEqual(sam.MyFollowingPersons.First().FollowingID, joan.ID);
                Assert.AreEqual(sam.MyFans.Count, 0);
                Assert.AreEqual(joan.MyFollowingPersons.Count, 0);
                Assert.AreEqual(joan.MyFans.Count, 1);
                Assert.AreEqual(joan.MyFans.First().FollowerID, sam.ID);

                //3. test black list.
                Person jay = CreatePerson("TestJay", "TestJay");
                Person ken = CreatePerson("TestKen", "TestKen");

                Group blackGroup = await groupHandler.CreateGroupAsync(ken.ID, "TestBGroup", GroupType.BlackList);

                GroupMember gm_sam = new GroupMember()
                {
                    PersonID = jay.ID,
                    GroupID = blackGroup.ID
                };
                gmHandler.Add(gm_sam);
                gmHandler.SaveChanges();

                bool isChecked = false;
                try
                {
                    isSucceed = await perHandler.FollowAsync(jay.ID, ken.ID);
                }
                catch (Exception ex)
                {
                    isChecked = true;
                    Assert.AreEqual(ex.GetType(), typeof(DisplayableException));
                    Assert.AreEqual(ex.Message, "由于用户设置,你无法关注。");
                }
                Assert.IsTrue(isChecked);

                jay = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == jay.ID);
                ken = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == ken.ID);

                Assert.AreEqual(jay.MyFollowingPersons.Count, 0);
                Assert.AreEqual(jay.MyFans.Count, 0);
                Assert.AreEqual(ken.MyFollowingPersons.Count, 0);
                Assert.AreEqual(ken.MyFans.Count, 0);
            }
        }
示例#2
0
        public async Task Test_05_UnFollowAsync()
        {
            using (KoalaBlogDbContext dbContext = new KoalaBlogDbContext())
            {
                PersonHandler perHandler = new PersonHandler(dbContext);

                //1. test normal and confirm follow succeed.

                Person kity = CreatePerson("TestKity", "TestKity");
                Person judy = CreatePerson("TestJudy", "TestJudy");

                bool isSucceed = await perHandler.FollowAsync(kity.ID, judy.ID);

                kity = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == kity.ID);
                judy = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == judy.ID);

                Assert.IsTrue(isSucceed);
                Assert.AreEqual(kity.MyFollowingPersons.Count, 1);
                Assert.AreEqual(kity.MyFans.Count, 0);
                Assert.AreEqual(judy.MyFollowingPersons.Count, 0);
                Assert.AreEqual(judy.MyFans.Count, 1);

                //2. unfollow now.
                bool isUnFollowSucceed = await perHandler.UnFollowAsync(kity.ID, judy.ID);

                kity = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == kity.ID);
                judy = await perHandler.Include(x => x.MyFollowingPersons, x => x.MyFans).SingleOrDefaultAsync(x => x.ID == judy.ID);

                Assert.IsTrue(isUnFollowSucceed);
                Assert.AreEqual(kity.MyFollowingPersons.Count, 0);
                Assert.AreEqual(kity.MyFans.Count, 0);
                Assert.AreEqual(judy.MyFollowingPersons.Count, 0);
                Assert.AreEqual(judy.MyFans.Count, 0);

                //3. unfollow again, it will be do nothing.
                isUnFollowSucceed = await perHandler.UnFollowAsync(kity.ID, judy.ID);

                Assert.IsTrue(isUnFollowSucceed);
            }
        }
示例#3
0
        /// <summary>
        /// 获取当前用户关注的人Blog
        /// </summary>
        /// <param name="personId">用户ID</param>
        /// <param name="groupId">组ID</param>
        /// <returns></returns>
        public async Task<List<Blog>> GetBlogsAsync(long personId, long? groupId = null, int pageIndex = 1, int pageSize = int.MaxValue)
        {
            PersonHandler perHandler = new PersonHandler(_dbContext);
            GroupHandler groupHandler = new GroupHandler(_dbContext);
            BlogAccessControlHandler acHandler = new BlogAccessControlHandler(_dbContext);

            //1. 获取当前用户Person实体,并加载正在关注列表。
            Person per = await perHandler.Include(x => x.MyFollowingPersons).SingleOrDefaultAsync(x => x.ID == personId);

            if(per == null)
            {
                throw new DisplayableException("该用户不存在");
            }

            //2. 获取组成员或者已关注的用户ID集合,若指定了GroupID,则获取组里成员ID集合,反则获取已关注的人ID集合。
            List<long> perIds = new List<long>();

            if(groupId.HasValue)
            {
                Group normalGroup = await groupHandler.Include(x => x.GroupMembers).SingleOrDefaultAsync(x => x.ID == groupId);

                if(normalGroup != null)
                {
                    if(normalGroup.PersonID != personId)
                    {
                        throw new DisplayableException("该组不属于此用户");
                    }

                    //2.1 获取指定Group的用户ID集合。
                    if(normalGroup.GroupMembers.Count > 0)
                    {
                        perIds = normalGroup.GroupMembers.Select(x => x.PersonID).ToList();
                    }
                }
            }
            else
            {
                //2.2 获取当前用户已关注的用户ID集合。
                perIds = per.MyFollowingPersons.Select(x => x.FollowingID).ToList();
            }

            //2.3 加上当前用户的ID,提供查询当前用户的Blog。
            perIds.Add(personId);

            //3. 获取当前用户屏蔽名单Group。
            Group shieldGroup = await groupHandler.Include(x => x.GroupMembers).SingleOrDefaultAsync(x => x.PersonID == personId && x.Type == GroupType.ShieldList);

            if (shieldGroup != null && shieldGroup.GroupMembers.Count > 0)
            {
                List<long> shieldListIds = shieldGroup.GroupMembers.Select(x => x.PersonID).ToList();

                //3.1 过滤屏蔽名单上的用户,不加载屏蔽名单上用户的Blog。
                perIds = perIds.Except(shieldListIds).ToList();
            }

            //4. 获取过滤后的用户ID集合的Blog列表,以创建时间降序排序。
            List<Blog> blogs = await Fetch(x => perIds.Contains(x.PersonID) && !x.IsDeleted).OrderByDescending(x => x.CreatedDate).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();

            if(blogs.Count > 0)
            {
                //5.1 获取排除当前用户ID的BlogIDs集合。
                List<long> blogListIds = blogs.Where(x => x.PersonID != personId).Select(x => x.ID).ToList();

                //5.2 获取Blog列表的AccessControl(权限控制)列表,排除公开的权限控制。
                List<BlogAccessControl> blogAccessControls = await acHandler.Fetch(x => blogListIds.Contains(x.BlogID) && x.AccessLevel != BlogInfoAccessInfo.All).ToListAsync();

                foreach (var blogAccessControl in blogAccessControls)
                {
                    Blog acBlog = blogs.Single(x => x.ID == blogAccessControl.BlogID);

                    //5.3 如果权限控制为仅自己可见,且发表Blog的用户ID不等于当前用户ID,则过滤掉此Blog。
                    if (blogAccessControl.AccessLevel == BlogInfoAccessInfo.MyselfOnly)
                    {
                        blogs.Remove(acBlog);
                    }
                    //5.4 如果权限控制为群可见,判断此群的人员名单是否包含当前用户,没有则过滤此Blog。
                    else if (blogAccessControl.AccessLevel == BlogInfoAccessInfo.GroupOnly)
                    {
                        BlogAccessControlXGroupHandler acxgHandler = new BlogAccessControlXGroupHandler(_dbContext);

                        BlogAccessControlXGroup acxGroup = await acxgHandler.Include(x => x.Group, x => x.Group.GroupMembers).SingleOrDefaultAsync(x => x.BlogAccessControlID == blogAccessControl.ID);

                        if (acxGroup != null)
                        {
                            bool isInGroupMember = false;

                            if (acxGroup.Group != null && acxGroup.Group.GroupMembers.Count > 0)
                            {
                                isInGroupMember = acxGroup.Group.GroupMembers.Select(x => x.PersonID).Any(x => x == personId);
                            }

                            if (!isInGroupMember)
                            {
                                blogs.Remove(acBlog);
                            }
                        }
                    }
                    //5.5 如果权限控制为朋友圈可见,判断当前用户是否与互相关注(Friends),如果不是则过滤此Blog。
                    else if (blogAccessControl.AccessLevel == BlogInfoAccessInfo.FriendOnly)
                    {
                        PersonXPersonHandler pxpHandler = new PersonXPersonHandler(_dbContext);

                        bool isFriend = await pxpHandler.IsFriendAsync(personId, acBlog.PersonID);

                        if (!isFriend)
                        {
                            blogs.Remove(acBlog);
                        }
                    }
                }
            }
            return blogs;
        }