public async Task <UserQueryResultListModel> QueryUser(string patterns) { var user = await userManager.GetUserAsync(User); IQueryable <UserInfo> users; if (Utils.PrivilegeHelper.IsTeacher(user.Privilege)) { users = userManager.Users.Where(i => (i.Name != null && i.Name.Contains(patterns)) || i.NormalizedEmail.Contains(patterns.ToUpperInvariant()) || i.NormalizedUserName.Contains(patterns.ToUpperInvariant())); } else { users = userManager.Users.Where(i => i.NormalizedUserName.Contains(patterns.ToUpper())); } var result = users.Select(i => new UserQueryResultModel { UserId = i.Id, UserName = i.UserName, Name = i.Name, Email = i.Email }) /*.Cacheable()*/; return(new UserQueryResultListModel { Users = await result.ToListAsync(), TotalCount = await result.CountAsync() }); }
public async Task <UserInfoModel> UserInfo(string?userId = null) { var signedIn = signInManager.IsSignedIn(User); var userInfoRet = new UserInfoModel { SignedIn = string.IsNullOrEmpty(userId) && signedIn }; if (string.IsNullOrEmpty(userId)) { userId = userManager.GetUserId(User); } var user = await userManager.FindByIdAsync(userId); var currentUser = string.IsNullOrEmpty(userId) ? user : await userManager.GetUserAsync(User); if (userId == null || user == null) { return(new UserInfoModel()); } userInfoRet.UserId = user.Id; userInfoRet.UserName = user.UserName; userInfoRet.Privilege = user.Privilege; userInfoRet.Coins = user.Coins; userInfoRet.Experience = user.Experience; userInfoRet.OtherInfo = IdentityHelper.GetOtherUserInfo(string.IsNullOrEmpty(user.OtherInfo) ? "{}" : user.OtherInfo); if (userInfoRet.SignedIn || PrivilegeHelper.IsTeacher(currentUser?.Privilege)) { userInfoRet.Name = user.Name; userInfoRet.EmailConfirmed = user.EmailConfirmed; userInfoRet.PhoneNumberConfirmed = user.PhoneNumberConfirmed; userInfoRet.Email = user.Email; userInfoRet.PhoneNumber = user.PhoneNumber; } return(userInfoRet); }
public async Task <GroupModel> GroupDetails(int groupId) { var user = await userManager.GetUserAsync(User); var groups = await groupService.QueryGroupAsync(user?.Id); var group = await groups.Where(i => i.Id == groupId).FirstOrDefaultAsync(); if (group == null) { throw new NotFoundException("该小组不存在"); } return(new GroupModel { Id = group.Id, UserId = group.UserId, UserName = group.UserInfo.UserName, Name = group.Name, Description = group.Description, IsPrivate = group.IsPrivate }); }
public async Task <RankContestStatisticsModel> GetRankForContest(int contestId, int groupId) { var user = await userManager.GetUserAsync(User); var contest = await contestService.GetContestAsync(contestId); if (contest == null) { throw new NotFoundException("该比赛不存在"); } if (groupId != 0) { var groups = await groupService.QueryGroupAsync(user?.Id); groups = groups.Where(i => i.GroupContestConfig.Any(j => j.ContestId == contestId && j.GroupId == groupId)) /*.Cacheable()*/; if (!await groups.AnyAsync()) { throw new NotFoundException("该比赛不存在或未加入对应小组"); } } var config = contest.Config.DeserializeJson <ContestConfig>(false); if (!config.ShowRank && !Utils.PrivilegeHelper.IsTeacher(user?.Privilege)) { throw new ForbiddenException("不允许查看排名"); } var judges = await judgeService.QueryJudgesAsync(null, groupId == 0?null : (int?)groupId, contestId, 0); if (config.AutoStopRank && !Utils.PrivilegeHelper.IsTeacher(user?.Privilege) && DateTime.Now < contest.EndTime) { var time = contest.EndTime.AddHours(-1); judges = judges.Where(i => i.JudgeTime < time); } var ret = new RankContestStatisticsModel { ContestId = contestId, GroupId = groupId }; var results = judges.OrderBy(i => i.Id).Select(i => new { Id = i.Id, ProblemId = i.ProblemId, ProblemName = i.Problem.Name, UserId = i.UserId, UserName = i.UserInfo.UserName, Name = i.UserInfo.Name, ResultType = i.ResultType, Time = i.JudgeTime, Score = i.FullScore }) /*.Cacheable()*/; var isAccepted = new Dictionary <(string UserId, int ProblemId), bool>(); foreach (var i in results) { if (!ret.UserInfos.ContainsKey(i.UserId)) { ret.UserInfos[i.UserId] = new RankUserInfoModel { UserName = i.UserName, Name = Utils.PrivilegeHelper.IsTeacher(user?.Privilege) ? i.Name : string.Empty } } ; if (!ret.ProblemInfos.ContainsKey(i.ProblemId)) { ret.ProblemInfos[i.ProblemId] = new RankProblemInfoModel { ProblemName = i.ProblemName } } ; if (!ret.RankInfos.ContainsKey(i.UserId)) { ret.RankInfos[i.UserId] = new Dictionary <int, RankContestItemModel>(); } if (!ret.RankInfos[i.UserId].ContainsKey(i.ProblemId)) { ret.RankInfos[i.UserId][i.ProblemId] = new RankContestItemModel(); } if (config.Type != ContestType.LastSubmit) { ret.RankInfos[i.UserId][i.ProblemId].Accepted = ret.RankInfos[i.UserId][i.ProblemId].Accepted || (i.ResultType == (int)ResultCode.Accepted); } else { ret.RankInfos[i.UserId][i.ProblemId].Accepted = ret.RankInfos[i.UserId][i.ProblemId].Accepted && (i.ResultType == (int)ResultCode.Accepted); } if (!isAccepted.ContainsKey((i.UserId, i.ProblemId))) { isAccepted[(i.UserId, i.ProblemId)] = false;
public async Task <SubmitSuccessModel> SubmitSolution([FromBody] SubmitModel model) { var user = await userManager.GetUserAsync(User); var now = DateTime.Now; var allowJumpToResult = true; if (user.Privilege == 5) { throw new ForbiddenException("不允许提交,请与管理员联系"); } if (model.GroupId != 0) { var inGroup = await groupService.IsInGroupAsync(user.Id, model.GroupId); if (!inGroup) { throw new ForbiddenException("未参加该小组"); } } var problem = await problemService.GetProblemAsync(model.ProblemId); if (problem == null) { throw new NotFoundException("该题目不存在"); } var problemConfig = problem.Config.DeserializeJson <ProblemConfig>(false); // For older version compatibility if (problemConfig.SourceFiles.Count == 0) { problemConfig.SourceFiles.Add(string.IsNullOrEmpty(problemConfig.SubmitFileName) ? "${random}${extension}" : $"{problemConfig.SubmitFileName}${{extension}}"); } var sources = new List <Source>(); foreach (var i in model.Content) { if (problemConfig.CodeSizeLimit != 0 && problemConfig.CodeSizeLimit < Encoding.UTF8.GetByteCount(i.Content)) { throw new BadRequestException("提交内容长度超出限制"); } if (problemConfig.SourceFiles.Contains(i.FileName)) { sources.Add(new Source { FileName = i.FileName, Content = i.Content }); } } var useDefaultDisabledConfig = false; var langConfig = (await languageService.GetLanguageConfigAsync()).ToList(); var langs = problemConfig.Languages?.Split(';', StringSplitOptions.RemoveEmptyEntries) ?? new string[0]; if (langs.Length == 0) { langs = langConfig.Select(i => i.Name).ToArray(); } else { useDefaultDisabledConfig = true; } if (model.ContestId != 0) { var contest = await contestService.GetContestAsync(model.ContestId); if (contest != null) { if (contest.StartTime > now || now > contest.EndTime) { throw new ForbiddenException("当前不允许提交"); } if (contest.Hidden && !Utils.PrivilegeHelper.IsTeacher(user.Privilege)) { throw new NotFoundException("该比赛不存在"); } var contestConfig = contest.Config.DeserializeJson <ContestConfig>(false); if (contestConfig.SubmissionLimit != 0) { var judges = await judgeService.QueryJudgesAsync(user.Id, model.GroupId == 0?null : (int?)model.GroupId, model.ContestId, model.ProblemId); if (contestConfig.SubmissionLimit <= await judges /*.Cacheable()*/.CountAsync()) { throw new ForbiddenException("超出提交次数限制"); } } if (contestConfig.ResultMode != ResultDisplayMode.Intime) { allowJumpToResult = false; } var contestLangs = contestConfig.Languages?.Split(';', StringSplitOptions.RemoveEmptyEntries) ?? new string[0]; if (contestLangs.Length != 0) { langs = langs.Intersect(contestLangs).ToArray(); useDefaultDisabledConfig = true; } } } else if (problem.Hidden && !Utils.PrivilegeHelper.IsTeacher(user.Privilege)) { throw new NotFoundException("该题目不存在"); } if (!useDefaultDisabledConfig) { langs = langs.Where(i => langConfig.Any(j => j.Name == i && !j.DisabledByDefault)).ToArray(); } if (!langs.Contains(model.Language)) { throw new ForbiddenException("不允许使用该语言提交"); } user.SubmissionCount++; await userManager.UpdateAsync(user); var id = await judgeService.QueueJudgeAsync(new Judge { Content = sources.SerializeJsonAsString(), Language = model.Language, ProblemId = model.ProblemId, ContestId = model.ContestId == 0 ? null : (int?)model.ContestId, GroupId = model.GroupId == 0 ? null : (int?)model.GroupId, UserId = user.Id, Description = "Online Judge", AdditionalInfo = "v2" }); return(new SubmitSuccessModel { Jump = allowJumpToResult, ResultId = id }); }