public async Task <ActionResult> Draft([FromBody] ExamSubmission submission)
        {
            if (submission == null || submission.ExamAnswers == null ||
                submission.ExamAnswers.Count == 0 || string.IsNullOrWhiteSpace(submission.ExamVersion))
            {
                return(BadRequest());
            }
            if (!IsValidVersion(submission.ExamVersion))
            {
                return(NotFound());
            }

            var drafts = await UserSubmissionsAsync();

            var draft = drafts.Value.SingleOrDefault(s => s.Version == submission.ExamVersion);

            if (draft == null)
            {
                draft = new AuditExamSubmission
                {
                    IsSubmitted = false,
                    UserID      = drafts.Key.Id,
                    Version     = submission.ExamVersion,
                };
                db_.AuditExamSubmissions.Add(draft);
            }
            draft.RawSubmission = JsonConvert.SerializeObject(submission);
            draft.SubmitTime    = DateTime.Now;
            await db_.SaveChangesAsync();

            return(Ok());
        }
        public async Task <ActionResult> Submit([FromBody] ExamSubmission submission)
        {
            if (submission == null || submission.ExamAnswers == null || submission.ExamAnswers.Count == 0)
            {
                return(BadRequest());
            }
            if (!IsValidVersion(submission.ExamVersion))
            {
                return(NotFound());
            }
            var submissions = await UserSubmissionsAsync();

            var submit = submissions.Value.SingleOrDefault(s => s.Version == submission.ExamVersion);

            if (submit == null)
            {
                submit = new AuditExamSubmission
                {
                    UserID  = submissions.Key.Id,
                    Version = submission.ExamVersion,
                };
            }
            else if (submit.IsSubmitted)
            {
                return(BadRequest());
            }
            submit.IsSubmitted   = true;
            submit.RawSubmission = JsonConvert.SerializeObject(submission);

            ExamResult result = GetResult(submission);

            submit.SubmitTime = result.SubmitTime;
            submit.HasPassed  = result.HasPassed;
            submit.Score      = result.Score;
            submit.RawResult  = JsonConvert.SerializeObject(result);
            await db_.SaveChangesAsync();

            return(Json(result));
        }