Exemple #1
0
        public async Task <SubmissionInfoDto> CreateSubmissionAsync(SubmissionCreateDto dto)
        {
            await ValidateSubmissionCreateDtoAsync(dto);

            var submission = new Submission
            {
                UserId    = Accessor.HttpContext.User.GetSubjectId(),
                ProblemId = dto.ProblemId.GetValueOrDefault(),
                Program   = dto.Program,
                Hidden    = true,
                Verdict   = Verdict.Pending,
                Time      = null,
                Memory    = null,
                FailedOn  = null,
                Score     = null,
                Progress  = null,
                Message   = null,
                JudgedBy  = null,
                JudgedAt  = null
            };
            await Context.Submissions.AddAsync(submission);

            await Context.SaveChangesAsync();

            _queue.EnqueueTask(new JobRequestMessage(JobType.JudgeSubmission, submission.Id, 1));

            await Context.Entry(submission).Reference(s => s.User).LoadAsync();

            var result = new SubmissionInfoDto(submission, true);

            await LogInformation($"CreateSubmission [Admin] ProblemId={result.ProblemId} " +
                                 $"Language={result.Language} Length={result.CodeBytes}");

            return(result);
        }
Exemple #2
0
        public async Task <SubmissionInfoDto> CreateSubmissionAsync(SubmissionCreateDto dto)
        {
            var contest = await ValidateSubmissionCreateDtoAsync(dto);

            var user = await Manager.GetUserAsync(Accessor.HttpContext.User);

            var lastSubmission = await Context.Submissions
                                 .Where(s => s.UserId == user.Id)
                                 .OrderByDescending(s => s.Id)
                                 .FirstOrDefaultAsync();

            if (lastSubmission != null &&
                (DateTime.Now.ToUniversalTime() - lastSubmission.CreatedAt).TotalSeconds < 5)
            {
                throw new TooManyRequestsException("Cannot submit twice between 5 seconds.");
            }

            var submission = new Submission
            {
                UserId    = Accessor.HttpContext.User.GetSubjectId(),
                ProblemId = dto.ProblemId.GetValueOrDefault(),
                Program   = dto.Program,
                Verdict   = Verdict.Pending,
                Hidden    = DateTime.Now.ToUniversalTime() < contest.BeginTime,
                Time      = null,
                Memory    = null,
                FailedOn  = null,
                Score     = null,
                Progress  = null,
                Message   = null,
                JudgedBy  = null,
                JudgedAt  = null
            };
            await Context.Submissions.AddAsync(submission);

            await Context.SaveChangesAsync();

            _queue.EnqueueTask(new JobRequestMessage(JobType.JudgeSubmission, submission.Id, 1));

            await Context.Entry(submission).Reference(s => s.User).LoadAsync();

            var result = new SubmissionInfoDto(submission, true);

            await LogInformation($"CreateSubmission Id={result.Id} ProblemId={result.ProblemId}" +
                                 $" ContestantId={user.ContestantId} Language={result.Language}");

            return(result);
        }