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); } }
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); } }
/// <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; }