/// <summary> /// 创建 <see cref="DossierPage"/> /// </summary> /// <param name="user">用户对象</param> /// <param name="currentUserId">当前登录用户 ID</param> /// <param name="dbContext"><see cref="KeylolDbContext"/></param> /// <param name="cachedData"><see cref="CachedDataProvider"/></param> /// <param name="userManager"><see cref="KeylolUserManager"/></param> /// <returns><see cref="DossierPage"/></returns> public static async Task <DossierPage> CreateAsync(KeylolUser user, string currentUserId, KeylolDbContext dbContext, CachedDataProvider cachedData, KeylolUserManager userManager) { var subscribedPoints = await SubscribedPointList.CreateAsync(currentUserId, user.Id, 1, 3, true, dbContext, cachedData); var selectedArticles = await SelectedArticleList.CreateAsync(user.Id, 1, 8, true, currentUserId, dbContext, cachedData); var dossierPage = new DossierPage { Coupon = user.Coupon, LikeCount = await cachedData.Likes.GetUserLikeCountAsync(user.Id), GameCount = await dbContext.UserSteamGameRecords.CountAsync(r => r.UserId == user.Id), PlayedGameCount = await dbContext.UserSteamGameRecords.CountAsync(r => r.UserId == user.Id && r.TotalPlayedTime > 0), SpotlightCount = await dbContext.Articles.CountAsync(a => a.AuthorId == user.Id && a.Spotlighted), IsOperator = await userManager.IsInRoleAsync(user.Id, KeylolRoles.Operator), SubscribedPointCount = subscribedPoints.Item2, SubscribedPoints = subscribedPoints.Item1, ArticleCount = selectedArticles.Item2, SelectedArticles = selectedArticles.Item1 }; return(dossierPage); }
/// <summary> /// 创建 <see cref="SubscribedPointList"/> /// </summary> /// <param name="currentUserId">当前登录用户 ID</param> /// <param name="userId">用户 ID</param> /// <param name="page">分页页码</param> /// <param name="recordsPerPage">每页数量</param> /// <param name="returnCount">是否返回总数</param> /// <param name="dbContext"><see cref="KeylolDbContext"/></param> /// <param name="cachedData"><see cref="CachedDataProvider"/></param> /// <returns>Item1 表示 <see cref="SubscribedPointList"/>,Item2 表示总数</returns> public static async Task <Tuple <SubscribedPointList, int> > CreateAsync(string currentUserId, string userId, int page, int recordsPerPage, bool returnCount, KeylolDbContext dbContext, CachedDataProvider cachedData) { var conditionQuery = from subscription in dbContext.Subscriptions where subscription.SubscriberId == userId && subscription.TargetType == SubscriptionTargetType.Point select subscription; var queryResult = await(from subscription in conditionQuery join point in dbContext.Points on subscription.TargetId equals point.Id orderby subscription.Sid descending select new { Count = returnCount ? conditionQuery.Count() : 1, point.Type, point.IdCode, point.AvatarImage, point.ChineseName, point.EnglishName, point.SteamAppId }).TakePage(page, recordsPerPage).ToListAsync(); var result = new SubscribedPointList(queryResult.Count); foreach (var p in queryResult) { result.Add(new PointBasicInfo { Type = p.Type, IdCode = p.IdCode, AvatarImage = p.AvatarImage, ChineseName = p.ChineseName, EnglishName = p.EnglishName, InLibrary = string.IsNullOrWhiteSpace(currentUserId) || p.SteamAppId == null ? (bool?)null : await cachedData.Users.IsSteamAppInLibraryAsync(currentUserId, p.SteamAppId.Value) }); } var firstRecord = queryResult.FirstOrDefault(); return(new Tuple <SubscribedPointList, int>(result, firstRecord?.Count ?? 0)); }