public PostHeaderListVM Search(ClaimsPrincipal contextUser, HeaderSearchVM searchModel) { var user = _userService.GetUserWithRoles(contextUser); var model = new PostHeaderListVM(); var query = _headerRepository.Where(x => x.Title.Contains(searchModel.SearchText) && !user.BlockedUserIds.Contains(x.UserId), new List <string> { "Category", "Posts", "User" }); if (searchModel.StartDate.HasValue) { query = query.Where(x => x.CreateDate >= searchModel.StartDate.Value); } if (searchModel.EndDate.HasValue) { query = query.Where(x => x.CreateDate <= searchModel.EndDate.Value); } if (searchModel.InvertOrder) { query = query.OrderByDescending(x => x.Title); } else { query = query.OrderBy(x => x.Title); } if (!user.IsAdmin) { query = query.OrderByDescending(x => x.IsAdminOnly == false); } query.ToList().ForEach(x => { var header = new PostHeaderVM() { HeaderCode = x.IdCode, CategoryCode = x.Category.IdCode, ClickCount = x.ClickCount, HeaderTitle = x.Title, UserId = x.UserId, Username = x.User.UserName, HeaderDate = x.UpdateDate ?? x.CreateDate }; model.Headers.Add(header); }); return(model); }
//ToDo: OK! categortId 'categoryId' olarak değiştirelim. public PostHeaderListVM GetPopularHeaders(ClaimsPrincipal contextUser, string categoryCode = "") { var user = _userService.GetUserWithRoles(contextUser); var model = new PostHeaderListVM(); var category = _categoryRepository.Get(x => x.IdCode == categoryCode); if (category == null) { category = _categoryRepository.GetAll().First(); } var categoryId = category.Id; var headerQuery = _headerRepository.Where(x => x.CategoryId == categoryId && !user.BlockedUserIds.Contains(x.UserId), new List <string> { "Category", "User", "Posts" }); if (!user.IsAdmin) { headerQuery = headerQuery.Where(x => x.IsAdminOnly == false); } headerQuery .Take(8) .ToList() .ForEach(x => { var header = new PostHeaderVM() { CategoryCode = x.Category.IdCode, HeaderCode = x.IdCode, HeaderTitle = x.Title, UserId = x.UserId, Username = x.User.UserName, ClickCount = x.ClickCount, HeaderDate = x.UpdateDate ?? x.CreateDate }; var post = x.Posts.Where(x => !user.BlockedUserIds.Contains(x.UserId)) .OrderByDescending(y => _postService.GetPostRating(y.Id)) .FirstOrDefault(); if (post != null) { var postVM = new PostVM() { PostId = post.Id, UserId = post.UserId, Username = post.User?.UserName ?? _userService.GetUserById(post.UserId).UserName, Content = post.Content, PostDate = post.UpdateDate ?? post.CreateDate, LikeCount = _postService.GetLikeCount(post.Id), DislikeCount = _postService.GetDislikeCount(post.Id) }; if (user.Id > 0) { var rating = _postRatingRepository.Get(x => x.UserId == user.Id && x.PostId == post.Id); if (rating != null) { postVM.LikeState = rating.IsLiked ? Common.Enums.PostLikeState.Liked : Common.Enums.PostLikeState.Disliked; } } header.Posts.Add(postVM); } ; model.Headers.Add(header); }); return(model); }
//ToDo: OK! PageNumber 'pageNumber' olarak değiştirelim. public PostHeaderListVM GetHeaderPosts(ClaimsPrincipal contextUser, string headerCode, string categoryCode, int pageNumber = 1) { var user = _userService.GetUserWithRoles(contextUser); var model = new PostHeaderListVM(); var headerEntity = _headerRepository.Where(x => x.IdCode == headerCode && !user.BlockedUserIds.Contains(x.UserId), new List <string> { "Category", "User", "Posts" }).FirstOrDefault(); var header = new PostHeaderVM(); ApiResultVM apiModel = null; if (headerEntity == null) { model = GetPopularHeaders(contextUser); return(model); } else { if (headerEntity.IsAdminOnly && !user.IsAdmin) // Admin check { model = GetPopularHeaders(contextUser); return(model); } var title = headerEntity.Title; var isBook = title.EndsWith("(Kitap)"); var isAuthor = title.EndsWith("(Yazar)"); if (isBook || isAuthor) { title = title.Remove(title.Length - 7); if (isBook) { apiModel = _openLibraryApiService.Search(title, Common.Enums.ApiSearchTypeEnum.Title); } else if (isAuthor) { apiModel = _openLibraryApiService.Search(title, Common.Enums.ApiSearchTypeEnum.Author); } } } headerEntity.ClickCount++; header.CategoryCode = headerEntity.Category.IdCode; header.HeaderCode = headerEntity.IdCode; header.HeaderTitle = headerEntity.Title; header.UserId = headerEntity.UserId; header.Username = headerEntity.User.UserName; header.ClickCount = headerEntity.ClickCount; header.HeaderDate = headerEntity.UpdateDate ?? headerEntity.CreateDate; //ToDo: OK! Sadece count çekeceksen where sorgusu yazmana gerek yok single olarak count içerisinde filtre yapabilirsin. Örnek kodu aşağıda paylaşıyorum. var postCount = headerEntity.Posts.Count(x => !user.BlockedUserIds.Contains(x.UserId)); //Örnek Kod: //var postCount = headerEntity.Posts.Count(x => !blockedUserIds.Contains(x.UserId)); var pageCount = (postCount / PageMaxItemCount) + ((postCount % PageMaxItemCount) > 0 ? 1 : 0); if (pageNumber > pageCount) { pageNumber = 1; } model.CurrentPage = pageNumber; model.PageCount = pageCount; if (headerEntity.Posts != null) { var posts = headerEntity.Posts .Where(x => !user.BlockedUserIds.Contains(x.UserId)) .Skip((pageNumber - 1) * PageMaxItemCount) .Take(PageMaxItemCount) .ToList(); posts.ForEach(post => { var postVM = new PostVM() { PostId = post.Id, UserId = post.UserId, Username = post.User?.UserName ?? _userService.GetUserById(post.UserId).UserName, Content = post.Content, PostDate = post.UpdateDate ?? post.CreateDate, LikeCount = _postService.GetLikeCount(post.Id), DislikeCount = _postService.GetDislikeCount(post.Id) }; if (user.Id > 0) { var rating = _postRatingRepository.Get(x => x.UserId == user.Id && x.PostId == post.Id); if (rating != null) { postVM.LikeState = rating.IsLiked ? Common.Enums.PostLikeState.Liked : Common.Enums.PostLikeState.Disliked; } } header.Posts.Add(postVM); }); } if (apiModel != null) { header.IsApiResult = true; foreach (var doc in apiModel.ResultModel.Docs.Take(10)) { DateTime dateValue; if (!DateTime.TryParse(doc.First_publish_year + "-01-01", out dateValue)) { dateValue = DateTime.Now; } var post = new PostVM() { Content = doc.Title, Username = doc.GetAuthorText(), DislikeCount = 0, LikeCount = 0, IsApiResult = true, PostDate = dateValue }; header.Posts.Add(post); } } model.Headers.Add(header); _headerRepository.Save(); return(model); }