/// <summary> /// 创建 <see cref="DiscoveryPage"/> /// </summary> /// <param name="currentUserId">当前登录用户 ID</param> /// <param name="dbContext"><see cref="KeylolDbContext"/></param> /// <param name="cachedData"><see cref="CachedDataProvider"/></param> /// <returns><see cref="DiscoveryPage"/></returns> public static async Task <DiscoveryPage> CreateAsync(string currentUserId, KeylolDbContext dbContext, CachedDataProvider cachedData) { var onSalePoints = await OnSalePointList.CreateAsync(currentUserId, 1, true, true, dbContext, cachedData); var latestArticles = await LatestArticleList.CreateAsync(1, true, true, dbContext, cachedData); return(new DiscoveryPage { SlideshowEntries = await SlideshowEntryList.CreateAsync(1, 4, dbContext), SpotlightPoints = await SpotlightPointList.CreateAsync(currentUserId, 1, 30, dbContext, cachedData), SpotlightReviews = await SpotlightArticleList.CreateAsync(currentUserId, 1, 4, SpotlightArticleStream.ArticleCategory.Review, dbContext, cachedData), SpotlightStudies = await SpotlightArticleList.CreateAsync(currentUserId, 1, 4, SpotlightArticleStream.ArticleCategory.Study, dbContext, cachedData), OnSalePointHeaderImage = onSalePoints.Item3, OnSalePointPageCount = onSalePoints.Item2, OnSalePoints = onSalePoints.Item1, SpotlightStories = await SpotlightArticleList.CreateAsync(currentUserId, 1, 4, SpotlightArticleStream.ArticleCategory.Story, dbContext, cachedData), LatestArticleHeaderImage = latestArticles.Item3, LatestArticlePageCount = latestArticles.Item2, LatestArticles = latestArticles.Item1, LatestActivityHeaderImage = onSalePoints.Item4, LatestActivities = await TimelineCardList.CreateAsync(LatestActivityStream.Name, currentUserId, 12, false, dbContext, cachedData) }); }
/// <summary> /// 创建 <see cref="OnSalePointList"/> /// </summary> /// <param name="currentUserId">当前登录用户 ID</param> /// <param name="page">分页页码</param> /// <param name="returnPageCount">是否返回总页数</param> /// <param name="returnFirstHeaderImage">是否返回第一个据点头部图</param> /// <param name="dbContext"><see cref="KeylolDbContext"/></param> /// <param name="cachedData"><see cref="CachedDataProvider"/></param> /// <returns>Item1 表示 <see cref="OnSalePointList"/>,Item2 表示总页数,Item3 表示第一个据点头部图,Item4 表示第二个据点头部图</returns> public static async Task <Tuple <OnSalePointList, int, string, string> > CreateAsync(string currentUserId, int page, bool returnPageCount, bool returnFirstHeaderImage, KeylolDbContext dbContext, CachedDataProvider cachedData) { SteamCrawlerProvider.UpdateOnSalePoints(); var conditionQuery = from feed in dbContext.Feeds where feed.StreamName == OnSalePointStream.Name join point in dbContext.Points on feed.Entry equals point.Id orderby feed.Id descending select point; var queryResult = await conditionQuery.Select(p => new { Count = returnPageCount ? conditionQuery.Count() : 1, HeaderImage = returnFirstHeaderImage ? p.HeaderImage : null, p.Id, p.IdCode, p.ThumbnailImage, p.ChineseName, p.EnglishName, p.SteamPrice, p.SteamDiscountedPrice, p.SteamAppId }).TakePage(page, RecordsPerPage).ToListAsync(); var result = new OnSalePointList(queryResult.Count); foreach (var p in queryResult) { result.Add(new PointBasicInfo { IdCode = p.IdCode, ThumbnailImage = p.ThumbnailImage, ChineseName = p.ChineseName, EnglishName = p.EnglishName, AverageRating = (await cachedData.Points.GetRatingsAsync(p.Id)).AverageRating, SteamPrice = p.SteamPrice, SteamDiscountedPrice = p.SteamDiscountedPrice, InLibrary = string.IsNullOrWhiteSpace(currentUserId) || p.SteamAppId == null ? (bool?)null : await cachedData.Users.IsSteamAppInLibraryAsync(currentUserId, p.SteamAppId.Value) }); } var pointWithHeaders = queryResult.Where(r => !string.IsNullOrWhiteSpace(r.HeaderImage)).ToList(); var firstRecord = pointWithHeaders.FirstOrDefault(); var secondRecord = pointWithHeaders.Skip(1).FirstOrDefault(); return(new Tuple <OnSalePointList, int, string, string>( result, (int)Math.Ceiling(firstRecord?.Count / (double)RecordsPerPage ?? 1), firstRecord?.HeaderImage, secondRecord?.HeaderImage)); }