Esempio n. 1
0
        public async Task <SubmissionEditDto> UpdateSubmissionAsync(int id, SubmissionEditDto dto)
        {
            await EnsureSubmissionExists(id);
            await ValidateSubmissionEditDto(dto);

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

            var submission = await Context.Submissions.FindAsync(id);

            submission.Verdict  = dto.Verdict.GetValueOrDefault();
            submission.Time     = submission.Memory = null;
            submission.FailedOn = null;
            submission.Score    = submission.Verdict == Verdict.Accepted ? 100 : 0;
            submission.Message  = dto.Message;
            submission.JudgedBy = "[manual] " + user.ContestantId;
            submission.JudgedAt = DateTime.Now.ToUniversalTime();
            Context.Update(submission);
            await Context.SaveChangesAsync();

            var problem = await Context.Problems.FindAsync(submission.ProblemId);

            var registration = await Context.Registrations.FindAsync(submission.UserId, problem.ContestId);

            await registration.RebuildStatisticsAsync(Context);

            await Context.SaveChangesAsync();

            await _statistics.InvalidStatisticsAsync(submission.ProblemId);

            await LogInformation($"UpdateSubmission Id={submission.Id} Verdict={submission.Verdict}");

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

            return(new SubmissionEditDto(submission));
        }
Esempio n. 2
0
        private Task ValidateSubmissionEditDto(SubmissionEditDto dto)
        {
            if (!Enum.IsDefined(typeof(Verdict), dto.Verdict.GetValueOrDefault()))
            {
                throw new ValidationException("Invalid verdict.");
            }

            return(Task.CompletedTask);
        }
Esempio n. 3
0
 public async Task <ActionResult <SubmissionEditDto> > UpdateSubmission(int id, SubmissionEditDto dto)
 {
     try
     {
         return(Ok(await _service.UpdateSubmissionAsync(id, dto)));
     }
     catch (NotFoundException e)
     {
         return(NotFound(e.Message));
     }
     catch (ValidationException e)
     {
         return(BadRequest(e.Message));
     }
 }