public IActionResult Solve(long id, [FromBody] AttemptForm form) { var result = _instanceService.SolveQuiz(id, form); if (result.Success) { return(Ok(new AttemptResponse(result.Value))); } return(BadRequest(result.Error)); }
public Result <Attempt> SolveQuiz(long instanceId, AttemptForm form) { var instance = _context.Instances .Include(x => x.Attempts) .Include(x => x.Questions) .ThenInclude(x => x.Answers) .FirstOrDefault(x => x.Id == instanceId); if (instance == null) { return(Result.Fail <Attempt>("Couldn't find instance of id " + instanceId)); } if (!instance.IsActive) { return(Result.Fail <Attempt>("Can't solve an expired instance.")); } if (string.IsNullOrWhiteSpace(form.Identity)) { return(Result.Fail <Attempt>("Invalid identity. Must not be null or whitespace only.")); } if (instance.Attempts.FirstOrDefault(x => x.Identity.Equals(form.Identity)) != null) { return(Result.Fail <Attempt>("You can only solve a quiz once.")); } var responses = new List <Response>(); var points = 0; foreach (var pair in form.QuestionAnswerPairs) { var question = instance.Questions.FirstOrDefault(x => x.Id == pair.Q); var answer = question?.Answers.FirstOrDefault(x => x.Id == pair.A); if (answer == null) { continue; } if (!answer.IsCorrect) { continue; } points++; responses.Add(new Response { Answer = answer }); } var attempt = new Attempt { Identity = form.Identity, PointsScored = points, Responses = responses }; instance.Attempts.Add(attempt); _context.Instances.Update(instance); _context.SaveChanges(); return(Result.Ok(attempt)); }