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); }
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); }