public async Task Test_04_Normal_GetBlogsAsync() { using(KoalaBlogDbContext dbContext = new KoalaBlogDbContext()) { BlogHandler blogHandler = new BlogHandler(dbContext); GroupHandler groupHandler = new GroupHandler(dbContext); GroupMemberHandler gmHandler = new GroupMemberHandler(dbContext); PersonHandler perHandler = new PersonHandler(dbContext); PersonXPersonHandler pxpHandler = new PersonXPersonHandler(dbContext); //1. test normal. bool isChecked = false; try { List<Blog> invalidPersonIdBlogs = await blogHandler.GetBlogsAsync(999999999); } catch (Exception ex) { isChecked = true; Assert.AreEqual(ex.Message, "该用户不存在"); } Assert.IsTrue(isChecked); Person master = CreatePerson("TestMasterPer", "TestMasterMind"); Person mary = CreatePerson("TestMary", "TestMary"); Person nick = CreatePerson("TestNick", "TestNick"); Person tony = CreatePerson("TestTony", "TestTony"); //1. create some blog and test it. await blogHandler.CreateBlogAsync(master.ID, "TestContentByMaster", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(mary.ID, "TestContentByMaryOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(mary.ID, "TestContentByMaryTwo", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(nick.ID, "TestContentByNickOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(tony.ID, "TestContentByTonyOne", BlogInfoAccessInfo.All); Follow(master.ID, mary.ID, nick.ID, tony.ID); List<Blog> blogs = await blogHandler.GetBlogsAsync(master.ID); Assert.AreEqual(blogs.Count, 5); Assert.AreEqual(blogs.Count(x => x.PersonID == mary.ID), 2); Assert.AreEqual(blogs.Count(x => x.PersonID == nick.ID), 1); Assert.AreEqual(blogs.Count(x => x.PersonID == tony.ID), 1); Assert.AreEqual(blogs.Count(x => x.PersonID == master.ID), 1); //2. add a group and add some group member test it. Group masterGroup = new Group() { PersonID = master.ID, Name = "TestMasterGroup", Type = GroupType.GroupList }; groupHandler.Add(masterGroup); groupHandler.SaveChanges(); GroupMember GroupMemberByMary = new GroupMember() { GroupID = masterGroup.ID, PersonID = mary.ID }; GroupMember GroupMemberByNick = new GroupMember() { GroupID = masterGroup.ID, PersonID = nick.ID }; gmHandler.Add(GroupMemberByMary); gmHandler.Add(GroupMemberByNick); gmHandler.SaveChanges(); //3. test get blog by group. blogs = await blogHandler.GetBlogsAsync(master.ID, masterGroup.ID); Assert.AreEqual(blogs.Count, 4); Assert.AreEqual(blogs.Count(x => x.PersonID == mary.ID), 2); Assert.AreEqual(blogs.Count(x => x.PersonID == nick.ID), 1); Assert.AreEqual(blogs.Count(x => x.PersonID == master.ID), 1); //4. add shield group and test it. Person mike = CreatePerson("TestMike", "TestMike"); Person yoyo = CreatePerson("TestYOYO", "TestYOYO"); Person pipi = CreatePerson("TestPIPI", "TestPIPI"); Person poko = CreatePerson("TestPoko", "TestPoko"); Follow(master.ID, mike.ID, yoyo.ID, pipi.ID, poko.ID); await blogHandler.CreateBlogAsync(mike.ID, "TestContentByMikeOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(mike.ID, "TestContentByMikeTwo", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(yoyo.ID, "TestContentByYoyoOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(yoyo.ID, "TestContentByYoyoTwo", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(pipi.ID, "TestContentByPipiOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(poko.ID, "TestContentByPokoOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(poko.ID, "TestContentByPokoTwo", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(poko.ID, "TestContentByPokoThree", BlogInfoAccessInfo.All); Group masterShieldGroup = new Group() { PersonID = master.ID, Name = "TestMasterShield", Type = GroupType.ShieldList }; groupHandler.Add(masterShieldGroup); groupHandler.SaveChanges(); GroupMember GroupMemberByPoko = new GroupMember() { GroupID = masterShieldGroup.ID, PersonID = poko.ID }; gmHandler.Add(GroupMemberByPoko); gmHandler.SaveChanges(); blogs = await blogHandler.GetBlogsAsync(master.ID); Assert.AreEqual(blogs.Count, 10); foreach (var blog in blogs) { Assert.AreNotEqual(blog.PersonID, poko.ID); Assert.AreNotEqual(blog.Content, "TestContentByPokoOne"); Assert.AreNotEqual(blog.Content, "TestContentByPokoTwo"); Assert.AreNotEqual(blog.Content, "TestContentByPokoThree"); } //5. add group member to normal group and test it. GroupMember GroupMemberByPoko_Normal = new GroupMember() { GroupID = masterGroup.ID, PersonID = poko.ID }; gmHandler.Add(GroupMemberByMary); blogs = await blogHandler.GetBlogsAsync(master.ID, masterGroup.ID); Assert.AreEqual(blogs.Count, 4); Assert.AreEqual(blogs.Count(x => x.PersonID == mary.ID), 2); Assert.AreEqual(blogs.Count(x => x.PersonID == nick.ID), 1); Assert.AreEqual(blogs.Count(x => x.PersonID == master.ID), 1); } }
public async Task Test_05_AccessControl_GetBlogsAsync() { using (KoalaBlogDbContext dbContext = new KoalaBlogDbContext()) { BlogHandler blogHandler = new BlogHandler(dbContext); GroupHandler groupHandler = new GroupHandler(dbContext); GroupMemberHandler gmHandler = new GroupMemberHandler(dbContext); PersonHandler perHandler = new PersonHandler(dbContext); PersonXPersonHandler pxpHandler = new PersonXPersonHandler(dbContext); Person faker = CreatePerson("TestFaker", "TestFaker"); Person marin = CreatePerson("TestMarin", "TestMarin"); Person deft = CreatePerson("TestDeft", "TestDeft"); Follow(faker.ID, marin.ID, deft.ID); //1. test access info MySelfOnly. await blogHandler.CreateBlogAsync(faker.ID, "TestContentByFakerOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(marin.ID, "TestContentByMarinOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(marin.ID, "TestContentByMarinTwo", BlogInfoAccessInfo.MyselfOnly); await blogHandler.CreateBlogAsync(deft.ID, "TestContentByDeftOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(deft.ID, "TestContentByDeftTwo", BlogInfoAccessInfo.MyselfOnly); List<Blog> blogs = await blogHandler.GetBlogsAsync(faker.ID); Assert.AreEqual(blogs.Count, 3); foreach (var blog in blogs) { Assert.AreNotEqual(blog.Content, "TestContentByMarinTwo"); Assert.AreNotEqual(blog.Content, "TestContentByDeftTwo"); } //2. test access info GroupOnly. Person paul = CreatePerson("TestPaul", "TestPaul"); Person judy = CreatePerson("TestJudy", "TestJudy"); Person anne = CreatePerson("TestAnne", "TestAnne"); Person alisa = CreatePerson("TestAlisa", "TestAlisa"); Follow(paul.ID, judy.ID, anne.ID, alisa.ID); //judy group not include paul. Group judyGroup = await groupHandler.CreateGroupAsync(judy.ID, "TestJudyGroup", GroupType.GroupList); //anne group include paul. Group anneGroup = await groupHandler.CreateGroupAsync(anne.ID, "TestAnneGroup", GroupType.GroupList); GroupMember groupMemberByAnne = new GroupMember() { GroupID = anneGroup.ID, PersonID = paul.ID }; gmHandler.Add(groupMemberByAnne); gmHandler.SaveChanges(); //alisa group include judy, anne but not paul. Group alisaGroup = await groupHandler.CreateGroupAsync(alisa.ID, "TestAlisaGroup", GroupType.GroupList); GroupMember groupMemberByAlisaOne = new GroupMember() { GroupID = alisaGroup.ID, PersonID = judy.ID }; GroupMember groupMemberByAlisaTwo = new GroupMember() { GroupID = alisaGroup.ID, PersonID = anne.ID }; gmHandler.Add(groupMemberByAlisaOne); gmHandler.Add(groupMemberByAlisaTwo); gmHandler.SaveChanges(); await blogHandler.CreateBlogAsync(paul.ID, "TestContentByPaul", BlogInfoAccessInfo.MyselfOnly); await blogHandler.CreateBlogAsync(judy.ID, "TestContentByJudyOne", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(judy.ID, "TestContentByJudyTwo", BlogInfoAccessInfo.GroupOnly, judyGroup.ID); await blogHandler.CreateBlogAsync(anne.ID, "TestContentByAnne", BlogInfoAccessInfo.GroupOnly, anneGroup.ID); await blogHandler.CreateBlogAsync(alisa.ID, "TestContentByAlisa", BlogInfoAccessInfo.GroupOnly, alisaGroup.ID); blogs = await blogHandler.GetBlogsAsync(paul.ID); Assert.AreEqual(blogs.Count, 3); foreach (var blog in blogs) { Assert.AreNotEqual(blog.Content, "TestContentByJudyTwo"); Assert.AreNotEqual(blog.Content, "TestContentByAlisa"); } //3. test access info FriendOnly. Person sam = CreatePerson("TestSam", "TestSam"); Person joan = CreatePerson("TestJoan", "TestJoan"); Person lily = CreatePerson("TestLily", "TestLily"); Follow(sam.ID, joan.ID, lily.ID); //3.1 test joan and sam is friend but not lily. Follow(joan.ID, sam.ID); await blogHandler.CreateBlogAsync(joan.ID, "TestContentByJoanOne", BlogInfoAccessInfo.FriendOnly); await blogHandler.CreateBlogAsync(joan.ID, "TestContentByJoanTwo", BlogInfoAccessInfo.All); await blogHandler.CreateBlogAsync(lily.ID, "TestContentByLilyOne", BlogInfoAccessInfo.FriendOnly); await blogHandler.CreateBlogAsync(lily.ID, "TestContentByLilyTwo", BlogInfoAccessInfo.FriendOnly); blogs = await blogHandler.GetBlogsAsync(sam.ID); Assert.AreEqual(blogs.Count, 2); foreach (var blog in blogs) { Assert.AreNotEqual(blog.Content, "TestContentByLilyOne"); Assert.AreNotEqual(blog.Content, "TestContentByLilyTwo"); } //3.2 now lily follow sam too. Follow(lily.ID, sam.ID); blogs = await blogHandler.GetBlogsAsync(sam.ID); Assert.AreEqual(blogs.Count, 4); } }
/// <summary> /// 获取用户关注的人Blog /// </summary> /// <param name="personId">PersonID</param> /// <param name="groupId">GroupID</param> /// <param name="pageIndex">页码</param> /// <param name="pageSize">数量/页</param> /// <returns></returns> public async Task<List<BlogDTO>> GetBlogsAsync(long personId, long? groupId, int pageIndex, int pageSize) { using(KoalaBlogDbContext dbContext = new KoalaBlogDbContext()) { List<BlogDTO> blogDtoList = null; BlogHandler blogHandler = new BlogHandler(dbContext); //1. 获取正在关注的人Blog集合。 var blogs = await blogHandler.GetBlogsAsync(personId, groupId, pageIndex, pageSize); if (blogs.Count > 0) { PersonHandler perHandler = new PersonHandler(dbContext); AvatarHandler avatarHandler = new AvatarHandler(dbContext); CommentHandler commentHandler = new CommentHandler(dbContext); BlogXBlogHandler bxbHandler = new BlogXBlogHandler(dbContext); EntityLikeHandler likeHandler = new EntityLikeHandler(dbContext); BlogXContentHandler bxcHandler = new BlogXContentHandler(dbContext); blogDtoList = new List<BlogDTO>(); foreach (var blog in blogs) { BlogDTO blogDto = blog.ToDTO(); //2. 判断Person对象是否为空,如果为空则获取。 if (blogDto.Person == null) { var personEntity = await perHandler.GetByIdAsync(blog.PersonID); if (personEntity != null) { blogDto.Person = personEntity.ToDTO(); //3.1 判断头像Url是否已经获取。 if (string.IsNullOrEmpty(blogDto.Person.AvatarUrl)) { blogDto.Person.AvatarUrl = await avatarHandler.GetActiveAvatarUrlByPersonId(blogDto.Person.ID); } } } else { //2.2 如果Person对象不为空,判断头像Url是否已经获取。 if (string.IsNullOrEmpty(blogDto.Person.AvatarUrl)) { blogDto.Person.AvatarUrl = await avatarHandler.GetActiveAvatarUrlByPersonId(blogDto.Person.ID); } } //3. 判断Contents集合是否为空,如果为空则获取。 if (blogDto.Contents == null) { List<Content> contentList = await bxcHandler.GetContentsAsync(blogDto.ID); if (contentList != null && contentList.Count > 0) { blogDto.Contents = new List<ContentDTO>(); foreach (var content in contentList) { ContentDTO contentDto = content.ToDTO(); blogDto.Contents.Add(contentDto); } } } //4. 判断此Blog是否转发了其他Blog。 if(blogDto.BaseBlog == null) { Blog baseBlog = await bxbHandler.GetBaseBlogByBlogIdAsync(blogDto.ID); if(baseBlog != null) { blogDto.BaseBlog = baseBlog.ToDTO(); //4.1 判断转发的Blog的Person对象是否为空,如果为空则获取。不需要获取头像。 if (blogDto.BaseBlog.Person == null) { var personEntity = await perHandler.GetByIdAsync(baseBlog.PersonID); if (personEntity != null) { blogDto.BaseBlog.Person = personEntity.ToDTO(); } } //4.2 判断转发的Blog是否有发Contents。 if (blogDto.BaseBlog.Contents == null) { List<Content> contentList = await bxcHandler.GetContentsAsync(blogDto.BaseBlog.ID); if (contentList != null && contentList.Count > 0) { blogDto.BaseBlog.Contents = new List<ContentDTO>(); foreach (var content in contentList) { ContentDTO contentDto = content.ToDTO(); blogDto.BaseBlog.Contents.Add(contentDto); } } } //4.3 获取转发的Blog的转发数量。 blogDto.BaseBlog.RepostCount = await bxbHandler.GetRepostCountAsync(blogDto.BaseBlog.ID); //4.4 获取转发的Blog的评论数量。 blogDto.BaseBlog.CommentCount = await commentHandler.GetCommentCountAsync(blogDto.BaseBlog.ID); //4.5 获取转发的Blog的点赞数量 blogDto.BaseBlog.LikeCount = await likeHandler.GetBlogLikeCountAsync(blogDto.BaseBlog.ID); //4.6 获取转发的Blog是否已经点赞。 blogDto.BaseBlog.IsLike = await likeHandler.IsLikeAsync(personId, blogDto.BaseBlog.ID, typeof(Blog)); } } //5. 获取用户是否收藏了Blog的Task。 Task<bool> isFavoriteTask = IsFavoriteAsync(personId, blog.ID); //6. 获取评论数量的Task。 CommentManager commentManager = new CommentManager(); Task<int> commentCountTask = commentManager.GetCommentCountAsync(blog.ID); //7. 获取转发数量的Task。 Task<int> repostCountTask = GetRepostCountAsync(blog.ID); //8. 获取点赞数量和用户是否已经点赞的Task。 Task<Tuple<int, bool>> likeObjTask = GetLikeObjectAsync(personId, blog.ID); blogDto.IsFavorite = await isFavoriteTask; blogDto.CommentCount = await commentCountTask; blogDto.RepostCount = await repostCountTask; //9. 获取点赞数量和用户是否点赞的对象Tuple,赋值。 Tuple<int, bool> likeObj = await likeObjTask; blogDto.IsLike = likeObj.Item2; blogDto.LikeCount = likeObj.Item1; blogDtoList.Add(blogDto); } } return blogDtoList; } }