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)); }
private Task ValidateSubmissionEditDto(SubmissionEditDto dto) { if (!Enum.IsDefined(typeof(Verdict), dto.Verdict.GetValueOrDefault())) { throw new ValidationException("Invalid verdict."); } return(Task.CompletedTask); }
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)); } }