public GetCommentRespond Get(string targetUserId, string requestByUserId, string classRoomId) { var noDataRespond = new GetCommentRespond { Comments = Enumerable.Empty<CommentInformation>() }; var areArgumentsValid = !string.IsNullOrEmpty(targetUserId) && !string.IsNullOrEmpty(requestByUserId); if (!areArgumentsValid) return noDataRespond; var isSelftRequest = requestByUserId == targetUserId; var isFriend = false; if (!isSelftRequest) { var friends = _friendRequestRepo.GetFriendRequestByUserProfileId(requestByUserId); if (friends == null || !friends.Any()) return noDataRespond; isFriend = friends .Where(it => !it.DeletedDate.HasValue) .Where(it => it.Status == FriendRequest.RelationStatus.Friend) .Any(it => it.ToUserProfileId.Equals(targetUserId)); if (!isFriend && !isSelftRequest) { var targetUserProfile = _userprofileRepo.GetUserProfileById(targetUserId); if (requestByUserId == null) return noDataRespond; if (targetUserProfile.IsPrivateAccount) return new GetCommentRespond { IsPrivateAccount = true }; } } var userComments = _commentRepo.GetCommentsByUserProfileId(targetUserId, classRoomId).ToList(); if (userComments == null || !userComments.Any()) return noDataRespond; var selectedClassRoom = _classRoomRepo.GetClassRoomById(classRoomId); if (selectedClassRoom == null) return noDataRespond; var lessonIds = userComments.Select(it => it.LessonId).Distinct(); var lessonQry = from it in selectedClassRoom.Lessons where it != null where lessonIds.Contains(it.id) select new { LessonId = it.id, LessonCatalogId = it.LessonCatalogId, LessonCatalog = _lessonCatalogRepo.GetLessonCatalogById(it.LessonCatalogId) }; var lessons = lessonQry.Where(it => it.LessonCatalog != null).ToList(); var comments = userComments .Where(it => lessons.Any(lesson => lesson.LessonId == it.LessonId)) .Select(it => { var selectedLessonCatalog = lessons.FirstOrDefault(l => l.LessonId == it.LessonId); if (selectedLessonCatalog == null) return null; var order = 1; return new CommentInformation { ClassRoomId = it.ClassRoomId, CreatedByUserProfileId = it.CreatedByUserProfileId, CreatedDate = it.CreatedDate, CreatorDisplayName = it.CreatorDisplayName, CreatorImageUrl = it.CreatorImageUrl, Description = it.Description, id = it.id, Order = order++, LessonId = it.LessonId, LessonWeek = selectedLessonCatalog.LessonCatalog.Order, TotalDiscussions = it.Discussions.Count(), TotalLikes = it.TotalLikes }; }) .Where(it => it != null) .OrderByDescending(it => it.LessonWeek) .ThenByDescending(it => it.CreatedDate) .ToList(); var canCreateADiscussion = isFriend || isSelftRequest; return new GetCommentRespond { IsDiscussionAvailable = canCreateADiscussion, Comments = comments }; }
public GetCommentRespond Comments(string id, string classRoomId, string userId) { var areArgumentsValid = !string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(classRoomId) && !string.IsNullOrEmpty(userId); if (!areArgumentsValid) return null; UserProfile userprofile; var canAccessToTheClassRoom = _userprofileRepo.CheckAccessPermissionToSelectedClassRoom(userId, classRoomId, out userprofile); if (!canAccessToTheClassRoom) return null; var userSubscription = userprofile.Subscriptions .Where(it=>!it.DeletedDate.HasValue) .FirstOrDefault(it => it.ClassRoomId == classRoomId); if (userSubscription == null) return null; var isTeacher = userSubscription.Role == UserProfile.AccountRole.Teacher; var now = _dateTime.GetCurrentTime(); var canAccessToTheClassLesson = isTeacher || _classCalendarRepo.CheckAccessPermissionToSelectedClassLesson(classRoomId, id, now); if (!canAccessToTheClassLesson) return null; var allUsersInCourse = _userprofileRepo.GetUserProfilesByClassRoomId(classRoomId) .Where(it => !it.DeletedDate.HasValue) .ToList(); var filterByCreatorNames = Enumerable.Empty<string>(); if (isTeacher) { filterByCreatorNames = allUsersInCourse.Select(it => it.id).ToList(); } else { var friendRequests = _friendRequestRepo.GetFriendRequestByUserProfileId(userId); if (friendRequests == null) return null; var teacherIds = allUsersInCourse .Where(it => it.Subscriptions.Any(s => s.ClassRoomId == classRoomId && s.Role == UserProfile.AccountRole.Teacher)) .Select(it => it.id); var friendIds = friendRequests .Where(it => !it.DeletedDate.HasValue) .Where(it => it.Status == FriendRequest.RelationStatus.Friend) .Select(it => it.ToUserProfileId); filterByCreatorNames = friendIds.Union(new string[] { userId }).Union(teacherIds).Distinct(); } var order = 1; var comments = _commentRepo.GetCommentsByLessonId(id, filterByCreatorNames) .Where(it => !it.DeletedDate.HasValue) .OrderByDescending(it => it.CreatedDate) .Select(it => new CommentInformation { id = it.id, Order = order++, Description = it.Description, TotalLikes = it.TotalLikes, CreatorImageUrl = it.CreatorImageUrl, CreatorDisplayName = it.CreatorDisplayName, ClassRoomId = it.ClassRoomId, LessonId = it.LessonId, CreatedByUserProfileId = it.CreatedByUserProfileId, TotalDiscussions = (it.Discussions ?? Enumerable.Empty<Comment.Discussion>()) .Where(dit => !dit.DeletedDate.HasValue).Count(), CreatedDate = it.CreatedDate }).ToList(); var result = new GetCommentRespond { Comments = comments, IsDiscussionAvailable = true, }; return result; }