Example #1
0
        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));
        }
Example #2
0
        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));
        }