public async Task <IActionResult> OnPostAsync() { var task = await _context.Tasks.FindAsync(TaskId); if (SourceCodeFile == null || SourceCodeFile.Length == 0 || task.Contest.Status == Contest.ContestState.Completed) { return(RedirectToPage()); } string sourceCode; using (var stream = SourceCodeFile.OpenReadStream()) sourceCode = GetSourceCode(stream); var fileName = Path.GetFileName(SourceCodeFile.FileName); var extension = Path.GetExtension(fileName).Substring(1); ProgrammingLanguage language; try { language = ProgrammingLanguageFactory.Get(extension); } catch { return(RedirectToPage()); } var username = User.Identity.Name; var command = CreateSolutionCommand.Create(sourceCode, language.LanguageCode, task.Id, username); await _createSolutionCommandHandler.HandleAsync(command); return(RedirectToPage()); }
public async Task HandleAsync(VerifySolutionCommand command) { var solution = await _dbContext.Solutions.SingleAsync(s => s.Id == command.SolutionId); if (solution.CompilationResults.Count > 0 || solution.Logs.Count > 0) { return; } var tests = solution.Task.Tests.ToList(); var programmingLanguage = ProgrammingLanguageFactory.Get(solution.Language); foreach (var test in tests) { var query = CompilationQuery.Create(solution.SourceCode, test.Input, programmingLanguage); var queryResult = await _compilationQueryHandler.HandleAsync(query); if (queryResult.ExecutionSuccessful) { var compilationResult = new CompilationResultMapper(queryResult.Output).Map(); compilationResult.Solution = solution; compilationResult.Test = test; await _dbContext.CompilationResults.AddAsync(compilationResult); } else { if (queryResult.Error.Error == "offline") { throw new CompilationServiceOfflineException("Compilation service not available."); } var log = new LogMapper(queryResult.Error).Map(); log.Solution = solution; log.Test = test; await _dbContext.Logs.AddAsync(log); } } await _dbContext.SaveChangesAsync(); }