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);
        }
Exemplo n.º 2
0
        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);
            }
        }