public ProblemDetailsModel GetProblemDetails(int id) { _currentUser = AuthHelper.GetUserFromAuthHeader(Request); if (!AuthHelper.VerifyUserAuthorizedAnalytic(_currentUser)) { return(null); } var dbProblem = DbHelper.GetProblem(id); var model = new ProblemDetailsModel() { Name = dbProblem.Name, Description = dbProblem.Description, Id = dbProblem.IdProblem, Alternatives = new List <ExpertChoicesModels.Alternative>(), Experts = new List <ExpertChoicesModels.Expert>() }; model.Alternatives.AddRange(DbHelper.GetAlternativesOfProblem(id).Select(altDb => ModelMapper.ConvertToResponseAlternative(altDb))); model.Experts.AddRange(DbHelper.GetExpertsOfProblem(id).Select(expDb => ModelMapper.ConvertToResponseExpert(expDb))); return(model); }
public async Task <ProblemDetailsModel> GetProblemDetails(int pid, int cid = 0, int gid = 0) { var(user, privilege) = await GetUserPrivilegeAsync(); using (var db = new ApplicationDbContext(_dbContextOptions)) { if (gid != 0) { var group = await db.Group.FindAsync(gid); if (group == null) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "题目不存在" }); } if (!db.GroupJoin.Any(i => i.GroupId == gid && i.UserId == user.Id)) { if (!HasAdminPrivilege(privilege)) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "没有权限" }); } } if (!db.GroupContestConfig.Where(i => i.GroupId == gid).Any(i => i.ContestId == cid)) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "题目不存在" }); } } var languages = Languages.LanguagesList; if (cid != 0) { var contest = await db.Contest.FindAsync(cid); if (contest == null) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "题目不存在" }); } if (contest.Hidden) { if (!HasAdminPrivilege(privilege)) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "没有权限" }); } } if (!db.ContestProblemConfig.Where(i => i.ContestId == cid).Any(i => i.ProblemId == pid)) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "题目不存在" }); } if (contest.StartTime > DateTime.Now) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "比赛未开始" }); } var config = JsonConvert.DeserializeObject <ContestConfiguration>(contest.Config ?? "{}"); if (!string.IsNullOrWhiteSpace(config?.Languages)) { var templang = config.Languages.Split(';', StringSplitOptions.RemoveEmptyEntries).Select(i => i.Trim()).ToList(); languages = languages.Intersect(templang).ToList(); } } var problem = await db.Problem.Include(i => i.UserInfo).FirstOrDefaultAsync(i => i.Id == pid); if (problem == null) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "题目不存在" }); } var pconfig = JsonConvert.DeserializeObject <ProblemConfiguration>(problem.Config ?? "{}"); if (!string.IsNullOrWhiteSpace(pconfig.Languages)) { var templang = pconfig.Languages.Split(';', StringSplitOptions.RemoveEmptyEntries).Select(i => i.Trim()).ToList(); languages = languages.Intersect(templang).ToList(); } var langList = Languages.LanguageConfigurations.Where(i => languages.Contains(i.Name)).Select(i => new LanguageConfig { Name = i.Name, Information = i.Information, SyntaxHighlight = i.SyntaxHighlight }).ToList(); if (problem.Hidden && cid == 0) { if (!HasAdminPrivilege(privilege)) { return(new ProblemDetailsModel { IsSucceeded = false, ErrorMessage = "没有权限" }); } } var problemDetails = new ProblemDetailsModel { IsSucceeded = true, Id = problem.Id, Hidden = problem.Hidden, RawLevel = problem.Level, Name = problem.Name, RawType = problem.Type, UserId = problem.UserId, UserName = problem.UserInfo?.UserName, Description = problem.Description, RawCreationTime = problem.CreationTime, AcceptCount = problem.AcceptCount, SubmissionCount = problem.SubmissionCount, Languages = langList }; if (cid != 0) { var problemConfig = db.ContestProblemConfig.FirstOrDefault(j => j.ProblemId == problem.Id && j.ContestId == cid); problemDetails.AcceptCount = problemConfig?.AcceptCount ?? 0; problemDetails.SubmissionCount = problemConfig?.SubmissionCount ?? 0; } problemDetails.RawStatus = 0; if (user != null) { var submissions = db.Judge.Where(j => j.GroupId == (gid == 0 ? null : (int?)gid) && j.ContestId == (cid == 0 ? null : (int?)cid) && j.ProblemId == pid && j.UserId == user.Id); if (submissions.Any()) { problemDetails.RawStatus = 1; } if (submissions.Any(j => j.ResultType == (int)ResultCode.Accepted)) { problemDetails.RawStatus = 2; } } return(problemDetails); } }