public async Task <string> GetWeeklyNewsAsync()
        {
            string   content         = "";
            int      NumOfWeek       = DateTimeExtensions.ConvertMiladiToShamsi(DateTime.Now, "dddd").GetNumOfWeek();
            DateTime StartMiladiDate = DateTime.Now.AddDays((-1) * NumOfWeek).Date + new TimeSpan(0, 0, 0);
            DateTime EndMiladiDate   = DateTime.Now;

            var news = await(from n in _context.News.Include(v => v.Visits).Include(l => l.Likes).Include(c => c.Comments)
                             where (n.PublishDateTime <= EndMiladiDate && StartMiladiDate <= n.PublishDateTime)
                             select(new NewsViewModel
            {
                NewsId     = n.NewsId,
                Title      = n.Title,
                ShortTitle = n.Title.Length > 50 ? n.Title.Substring(0, 50) + "..." : n.Title,
                Url        = n.Url,
                ImageName  = n.ImageName,
            })).OrderByDescending(o => o.PublishDateTime).AsNoTracking().ToListAsync();

            string url = _configuration.GetValue <string>("SiteSettings:SiteInfo:Url");

            foreach (var item in news)
            {
                content = content + $"<div style='direction:rtl;font-family:tahoma;text-align:center'> <div class='row align-items-center'> <div class='col-12 col-lg-6'><div class='post-thumbnail'> <img src='{url + "/newsImage/" + item.ImageName}' alt='{item.ImageName}'> </div> </div> <div class='col-12 col-lg-6'> <div class='post-content mt-0'> <h4 style='color:#878484;'>{item.Title}</h4> <p> {item.ShortTitle} <a href='{url}/News/{item.NewsId}/{item.Url}'>[ادامه مطلب]</a> </p> </div> </div> </div> </div><hr/>";
            }

            return(content);
        }
        public IActionResult Index()
        {
            ViewBag.News = _uw.NewsRepository.CountNews();
            ViewBag.FuturePublishedNews = _uw.NewsRepository.CountFuturePublishedNews();
            ViewBag.NewsPublished       = _uw.NewsRepository.CountNewsPublishedOrDraft(true);
            ViewBag.DraftNews           = _uw.NewsRepository.CountNewsPublishedOrDraft(false);

            var      month = StringExtensions.GetMonth();
            int      numberOfVisit;
            var      year = DateTimeExtensions.ConvertMiladiToShamsi(DateTime.Now, "yyyy");
            DateTime StartDateTimeMiladi;
            DateTime EndDateTimeMiladi;
            var      numberOfVisitList = new List <NumberOfVisitChartViewModel>();

            for (int i = 0; i < month.Length; i++)
            {
                StartDateTimeMiladi = DateTimeExtensions.ConvertShamsiToMiladi($"{year}/{i + 1}/01");
                if (i < 11)
                {
                    EndDateTimeMiladi = DateTimeExtensions.ConvertShamsiToMiladi($"{year}/{i + 2}/01");
                }
                else
                {
                    EndDateTimeMiladi = DateTimeExtensions.ConvertShamsiToMiladi($"{year}/01/01");
                }

                numberOfVisit = _uw._Context.News.Where(n => n.PublishDateTime < EndDateTimeMiladi && StartDateTimeMiladi <= n.PublishDateTime).Include(v => v.Visits).Select(k => k.Visits.Sum(v => v.NumberOfVisit)).AsEnumerable().Sum();
                numberOfVisitList.Add(new NumberOfVisitChartViewModel {
                    Name = month[i], Value = numberOfVisit
                });
            }

            ViewBag.NumberOfVisitChart = numberOfVisitList;
            return(View());
        }
        public async Task <List <NewsViewModel> > MostTalkNews(int offset, int limit, string duration)
        {
            DateTime StartMiladiDate;
            DateTime EndMiladiDate = DateTime.Now;

            if (duration == "week")
            {
                int NumOfWeek = DateTimeExtensions.ConvertMiladiToShamsi(DateTime.Now, "dddd").GetNumOfWeek();
                StartMiladiDate = DateTime.Now.AddDays((-1) * NumOfWeek).Date + new TimeSpan(0, 0, 0);
            }

            else if (duration == "day")
            {
                StartMiladiDate = DateTime.Now.Date + new TimeSpan(0, 0, 0);
            }

            else
            {
                string DayOfMonth = DateTimeExtensions.ConvertMiladiToShamsi(DateTime.Now, "dd").Fa2En();
                StartMiladiDate = DateTime.Now.AddDays((-1) * (int.Parse(DayOfMonth) - 1)).Date + new TimeSpan(0, 0, 0);
            }

            return(await(from n in _context.News.Include(v => v.Visits).Include(l => l.Likes).Include(c => c.Comments)
                         where (n.PublishDateTime <= EndMiladiDate && StartMiladiDate <= n.PublishDateTime)
                         select(new NewsViewModel
            {
                NewsId = n.NewsId,
                ShortTitle = n.Title.Length > 50 ? n.Title.Substring(0, 50) + "..." : n.Title,
                Url = n.Url,
                NumberOfVisit = n.Visits.Select(v => v.NumberOfVisit).Sum(),
                NumberOfLike = n.Likes.Where(l => l.IsLiked == true).Count(),
                NumberOfDisLike = n.Likes.Where(l => l.IsLiked == false).Count(),
                NumberOfComments = n.Comments.Count(),
                ImageName = n.ImageName,
                PublishDateTime = n.PublishDateTime == null ? new DateTime(01, 01, 01) : n.PublishDateTime,
            })).OrderByDescending(o => o.NumberOfComments).Skip(offset).Take(limit).AsNoTracking().ToListAsync());
        }
        public async Task <List <NewsViewModel> > GetPaginateNewsAsync(int offset, int limit, string orderBy, string searchText, bool?isPublish, bool?isInternal)
        {
            string NameOfCategories            = "";
            string NameOfTags                  = "";
            List <NewsViewModel> newsViewModel = new List <NewsViewModel>();
            var getDateTimesForSearch          = searchText.GetDateTimeForSearch();

            var convertPublish  = Convert.ToBoolean(isPublish);
            var convertInternal = Convert.ToBoolean(isInternal);
            var allNews         = await(from n in ((from n in _context.News.Include(v => v.Visits).Include(l => l.Likes).Include(u => u.User).Include(c => c.Comments)
                                                    where ((n.Title.Contains(searchText) || (n.PublishDateTime >= getDateTimesForSearch.First() && n.PublishDateTime <= getDateTimesForSearch.Last())) && (isInternal == null || (convertInternal ? n.IsInternal : !n.IsInternal)) && (isPublish == null || (convertPublish ? n.IsPublish && n.PublishDateTime <= DateTime.Now : !n.IsPublish)))
                                                    select(new
            {
                n.NewsId,
                n.Title,
                n.Abstract,
                ShortTitle = n.Title.Length > 50 ? n.Title.Substring(0, 50) + "..." : n.Title,
                n.Url,
                n.ImageName,
                n.Description,
                NumberOfVisit = n.Visits.Select(v => v.NumberOfVisit).Sum(),
                NumberOfLike = n.Likes.Where(l => l.IsLiked == true).Count(),
                NumberOfDisLike = n.Likes.Where(l => l.IsLiked == false).Count(),
                NumberOfComments = n.Comments.Count(),
                AuthorName = n.User.FirstName + " " + n.User.LastName,
                n.IsPublish,
                NewsType = n.IsInternal == true ? "داخلی" : "خارجی",
                n.PublishDateTime,
            })).OrderBy(orderBy).Skip(offset).Take(limit))
                                        join e in _context.NewsCategories on n.NewsId equals e.NewsId into bc
                                        from bct in bc.DefaultIfEmpty()
                                        join c in _context.Categories on bct.CategoryId equals c.CategoryId into cg
                                        from cog in cg.DefaultIfEmpty()
                                        join a in _context.NewsTags on n.NewsId equals a.NewsId into ac
                                        from act in ac.DefaultIfEmpty()
                                        join t in _context.Tags on act.TagId equals t.TagId into tg
                                        from tog in tg.DefaultIfEmpty()
                                        select(new NewsViewModel
            {
                NewsId           = n.NewsId,
                Title            = n.Title,
                Abstract         = n.Abstract,
                ShortTitle       = n.Title.Length > 50 ? n.Title.Substring(0, 50) + "..." : n.Title,
                Url              = n.Url,
                ImageName        = n.ImageName,
                Description      = n.Description,
                NumberOfVisit    = n.NumberOfVisit,
                NumberOfLike     = n.NumberOfLike,
                NumberOfDisLike  = n.NumberOfDisLike,
                NumberOfComments = n.NumberOfComments,
                AuthorName       = n.AuthorName,
                IsPublish        = n.IsPublish,
                NewsType         = n.NewsType,
                PublishDateTime  = n.PublishDateTime,
                NameOfCategories = cog != null ? cog.CategoryName : "",
                NameOfTags       = tog != null ? tog.TagName : "",
            })).AsNoTracking().ToListAsync();


            var newsGroup = allNews.GroupBy(g => g.NewsId).Select(g => new { NewsId = g.Key, NewsGroup = g });

            foreach (var item in newsGroup)
            {
                NameOfCategories = "";
                NameOfTags       = "";
                foreach (var a in item.NewsGroup.Select(a => a.NameOfCategories).Distinct())
                {
                    if (NameOfCategories == "")
                    {
                        NameOfCategories = a;
                    }
                    else
                    {
                        NameOfCategories = NameOfCategories + " - " + a;
                    }
                }

                foreach (var a in item.NewsGroup.Select(a => a.NameOfTags).Distinct())
                {
                    if (NameOfTags == "")
                    {
                        NameOfTags = a;
                    }
                    else
                    {
                        NameOfTags = NameOfTags + " - " + a;
                    }
                }

                NewsViewModel news = new NewsViewModel()
                {
                    NewsId             = item.NewsId,
                    Title              = item.NewsGroup.First().Title,
                    ShortTitle         = item.NewsGroup.First().ShortTitle,
                    Abstract           = item.NewsGroup.First().Abstract,
                    Url                = item.NewsGroup.First().Url,
                    Description        = item.NewsGroup.First().Description,
                    NumberOfVisit      = item.NewsGroup.First().NumberOfVisit,
                    NumberOfDisLike    = item.NewsGroup.First().NumberOfDisLike,
                    NumberOfLike       = item.NewsGroup.First().NumberOfLike,
                    NewsType           = item.NewsGroup.First().NewsType,
                    Status             = item.NewsGroup.First().IsPublish == false ? "پیش نویس" : (item.NewsGroup.First().PublishDateTime > DateTime.Now ? "انتشار در آینده" : "منتشر شده"),
                    NameOfCategories   = NameOfCategories,
                    NameOfTags         = NameOfTags,
                    ImageName          = item.NewsGroup.First().ImageName,
                    AuthorName         = item.NewsGroup.First().AuthorName,
                    NumberOfComments   = item.NewsGroup.First().NumberOfComments,
                    PublishDateTime    = item.NewsGroup.First().PublishDateTime,
                    PersianPublishDate = item.NewsGroup.First().PublishDateTime == null ? "-" : DateTimeExtensions.ConvertMiladiToShamsi(item.NewsGroup.First().PublishDateTime, "yyyy/MM/dd ساعت HH:mm"),
                };
                newsViewModel.Add(news);
            }

            foreach (var item in newsViewModel)
            {
                item.Row = ++offset;
            }

            return(newsViewModel);
        }
        public async Task <List <NewsViewModel> > MostViewedNewsAsync(int offset, int limit, string duration)
        {
            string NameOfCategories            = "";
            List <NewsViewModel> newsViewModel = new List <NewsViewModel>();
            DateTime             StartMiladiDate;
            DateTime             EndMiladiDate = DateTime.Now;

            if (duration == "week")
            {
                int NumOfWeek = DateTimeExtensions.ConvertMiladiToShamsi(DateTime.Now, "dddd").GetNumOfWeek();
                StartMiladiDate = DateTime.Now.AddDays((-1) * NumOfWeek).Date + new TimeSpan(0, 0, 0);
            }

            else if (duration == "day")
            {
                StartMiladiDate = DateTime.Now.Date + new TimeSpan(0, 0, 0);
            }

            else
            {
                string DayOfMonth = DateTimeExtensions.ConvertMiladiToShamsi(DateTime.Now, "dd").Fa2En();
                StartMiladiDate = DateTime.Now.AddDays((-1) * (int.Parse(DayOfMonth) - 1)).Date + new TimeSpan(0, 0, 0);
            }

            var allNews = await(from n in ((from n in _context.News.Include(v => v.Visits).Include(l => l.Likes).Include(c => c.Comments)
                                            where (n.PublishDateTime <= EndMiladiDate && StartMiladiDate <= n.PublishDateTime)
                                            select(new
            {
                n.NewsId,
                ShortTitle = n.Title.Length > 60 ? n.Title.Substring(0, 60) + "..." : n.Title,
                n.Url,
                NumberOfVisit = n.Visits.Select(v => v.NumberOfVisit).Sum(),
                NumberOfLike = n.Likes.Where(l => l.IsLiked == true).Count(),
                NumberOfDisLike = n.Likes.Where(l => l.IsLiked == false).Count(),
                NumberOfComments = n.Comments.Count(),
                n.ImageName,
                PublishDateTime = n.PublishDateTime == null ? new DateTime(01, 01, 01) : n.PublishDateTime,
            })).OrderBy("NumberOfVisit desc").Skip(offset).Take(limit))
                                join e in _context.NewsCategories on n.NewsId equals e.NewsId into bc
                                from bct in bc.DefaultIfEmpty()
                                join c in _context.Categories on bct.CategoryId equals c.CategoryId into cg
                                from cog in cg.DefaultIfEmpty()
                                select(new
            {
                n.NewsId,
                n.ShortTitle,
                n.Url,
                n.NumberOfVisit,
                n.NumberOfLike,
                n.NumberOfDisLike,
                n.NumberOfComments,
                n.ImageName,
                CategoryName = cog != null ? cog.CategoryName : "",
                n.PublishDateTime,
            })).AsNoTracking().ToListAsync();

            var newsGroup = allNews.GroupBy(g => g.NewsId).Select(g => new { NewsId = g.Key, NewsGroup = g });

            foreach (var item in newsGroup)
            {
                NameOfCategories = "";
                foreach (var a in item.NewsGroup.Select(a => a.CategoryName).Distinct())
                {
                    if (NameOfCategories == "")
                    {
                        NameOfCategories = a;
                    }
                    else
                    {
                        NameOfCategories = NameOfCategories + " - " + a;
                    }
                }

                NewsViewModel news = new NewsViewModel()
                {
                    NewsId           = item.NewsId,
                    ShortTitle       = item.NewsGroup.First().ShortTitle,
                    Url              = item.NewsGroup.First().Url,
                    NumberOfVisit    = item.NewsGroup.First().NumberOfVisit,
                    NumberOfDisLike  = item.NewsGroup.First().NumberOfDisLike,
                    NumberOfLike     = item.NewsGroup.First().NumberOfLike,
                    NameOfCategories = NameOfCategories,
                    PublishDateTime  = item.NewsGroup.First().PublishDateTime,
                    ImageName        = item.NewsGroup.First().ImageName,
                };
                newsViewModel.Add(news);
            }

            return(newsViewModel);
        }