public async Task <IActionResult> Run([FromBody] ScriptRunVm model) { GameData.Assignment assignment = _gameData.Threads.SingleOrDefault(t => t.AssignmentId == model.Script.AssignmentId)?.Assignment; if (model.Script.AssignmentId == 0) { assignment = new GameData.Assignment { Solution = null }; } else if (assignment == null) { return(NotFound()); } string[] args = model.Arguments.ToArray(); for (int i = 0; i < args.Length; i++) { if (assignment.Arguments.ElementAt(i).Type == "string") { args[i] = $"\"{args[i]}\""; } } ScriptRunResultVm results = await _nodeServices.InvokeAsync <ScriptRunResultVm>( "Scripts/Run.js", model.Script.Text, assignment.Solution, args ); return(Json(results)); }
public async Task <IActionResult> Verify([FromBody] ScriptRunVm model) { GameData.Assignment assignment = _gameData.Threads.SingleOrDefault(t => t.AssignmentId == model.Script.AssignmentId)?.Assignment; Script script = await _db.Scripts.SingleOrDefaultAsync(s => s.Id == model.Script.Id); string userId = _userManager.GetUserId(User); if (assignment == null || script == null) { return(NotFound()); } if (script.UserId != userId) { return(Forbid()); } // TODO: Add check for precursors ScriptVerificationResultVm results = await _nodeServices.InvokeAsync <ScriptVerificationResultVm>( "Scripts/Verify.js", model.Script.Text, assignment.Solution, assignment.Tests ); if (results.Completed == results.Tests) { AssignmentCompletion completion = _db.AssignmentCompletions.SingleOrDefault( ac => ac.UserId == userId && ac.AssignmentId == assignment.Id ); if (completion == null) { _db.AssignmentCompletions.Add(new AssignmentCompletion { UserId = userId, AssignmentId = assignment.Id }); } script.Text = model.Script.Text; script.VerifiedOn = DateTime.Now; script.ModifiedOn = DateTime.Now; script.Score = results.Score; _db.Scripts.Update(script); await _db.SaveChangesAsync(); results.Script = _mapper.Map <Script, ScriptVm>(script); } return(Json(results)); }