/// <summary> /// Record an answer for a question from an ongoing session. /// </summary> /// <returns>Answer result.</returns> /// <param name="pSessionAnswer">Session answer parameters.</param> public ResponseDTO <AnswerResultDTO> AddAnswer(SessionAnswerDTO pSessionAnswer) { if (pSessionAnswer.Session == null) { return(ResponseDTO <AnswerResultDTO> .BadRequest("Failed to add answer. Invalid session.")); } using (IUnitOfWork bUoW = _unitOfWorkFactory.GetUnitOfWork()) { var question = bUoW.QuestionRepository.Get(pSessionAnswer.Question.Id); var answers = question.Answers.Where(answer => pSessionAnswer.Answers.Select(a => a.Id).Contains(answer.Id)).ToList(); SessionAnswer sessionAnswer = new SessionAnswer { Answers = answers, Question = bUoW.QuestionRepository.Get(pSessionAnswer.Question.Id), AnswerTime = pSessionAnswer.AnswerTime }; // Get session entity from the given SessionId Session session = bUoW.SessionRepository.Get(pSessionAnswer.Session.Id) ?? throw new Exception($"Session id {pSessionAnswer.Session.Id} not found."); session.Answers.Add(sessionAnswer); AnswerResultDTO answerResult = _mapper.Map <AnswerResultDTO>(sessionAnswer); bUoW.Complete(); return(ResponseDTO <AnswerResultDTO> .Ok(answerResult.IsCorrect? "Right!" : "Wrong answer.", answerResult)); } }
public async Task <AnswerResultDTO> AnswerQuestion(QuestionAnswerDTO questionModel) { var result = new AnswerResultDTO() { QuestionId = questionModel.QuestionId, IsCorrect = false }; if (questionModel.Choices.Count > 0) { var correctAnswers = await _choiceRepository.GetCorrectAnswersAsync(questionModel.QuestionId); if (questionModel.Choices.SequenceEqual(correctAnswers.ToList())) { result.IsCorrect = true; } } return(result); }
public IHttpActionResult GetResultsToChosenQuestions() { double ScaleAnswerValue(int value, int currentMax, double absoluteMaxD) { // PREVENTS WRONG SCALING WHEN VALUE if (value == 1) { return(1); } double valueD = Convert.ToDouble(value); double currentMaxD = Convert.ToDouble(currentMax); double scaledValueD = (absoluteMaxD / currentMaxD) * valueD; return(scaledValueD); } // ConvertToUnixTime CODE FROM: https://www.fluxbytes.com/csharp/convert-datetime-to-unix-time-in-c/ long ConvertToUnixTime(DateTime datetime) { DateTime sTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return((long)(datetime - sTime).TotalMilliseconds); } var rawCqIdsWithDupl = from cq in db.ChosenQuestions orderby cq.QuestionID select cq.QuestionID; List <int> cqIdsWithDupl = rawCqIdsWithDupl.ToList(); Debug.WriteLine("cqIdsWithDupl.Count: " + cqIdsWithDupl.Count); List <int> cqIds = cqIdsWithDupl.Distinct().ToList(); Debug.WriteLine("cqIds.Count: " + cqIds.Count); var rawResultTemps = from id in cqIds join a in db.Answers on id equals a.QuestionID orderby id ascending select new AnswerResultTemp { QuestionID = a.QuestionID, AnswerValue = a.Value, AnswerScaleMax = a.AnswerSet.QuestionMethod.ScaleMax, AnswererTypeID = a.AnswerSet.AnswerBundle.AnswererTypeID, AnswererTypeName = a.AnswerSet.AnswerBundle.AnswererType.Name, AnswerBundleDate = a.AnswerSet.AnswerBundle.Date }; List <AnswerResultTemp> resultTemps = rawResultTemps.ToList(); // TODO: CHANGE absoliteScaleMax TO ALWAYS 5 double absoluteScaleMax = -2; foreach (AnswerResultTemp art in resultTemps) { Debug.WriteLine("art.AnswerScaleMax: " + art.AnswerScaleMax); if (art.AnswerScaleMax > absoluteScaleMax) { absoluteScaleMax = Convert.ToDouble(art.AnswerScaleMax); } } Debug.WriteLine("absoluteScaleMax: " + absoluteScaleMax); Debug.WriteLine("******"); List <AnswerResultDTO> results = new List <AnswerResultDTO>(); foreach (AnswerResultTemp rt in resultTemps) { AnswerResultDTO nr = new AnswerResultDTO(); nr.QuestionID = rt.QuestionID; nr.AnswerValue = ScaleAnswerValue(rt.AnswerValue, rt.AnswerScaleMax, absoluteScaleMax); nr.AnswererTypeID = rt.AnswererTypeID; nr.AnswererTypeName = rt.AnswererTypeName; nr.AnswerBundleDateMs = ConvertToUnixTime(rt.AnswerBundleDate); Debug.WriteLine("nr.AnswerValue: " + nr.AnswerValue); Debug.WriteLine("rt.AnswerValue: " + rt.AnswerValue); Debug.WriteLine("rt.AnswerScaleMax: " + rt.AnswerScaleMax); Debug.WriteLine("******"); results.Add(nr); } Debug.WriteLine("results.Count: " + results.Count); return(Ok(results)); }
public IHttpActionResult GetResultsToChosenQuestions() { // The function gets target value, value's current maximum value and target maximum value // as parameters, and scale them from current value range to target value range. // Example: value = 3, currentMax = 4 (scale 1-4), absoluteMaxD = 5.0 (range 1-5). // value is scaled to range 1-5 -> scaledValueD (scaled value) is 3.75. double ScaleAnswerValue(int value, int currentMax, double absoluteMaxD) { if (value == 1) { return(1); } double valueD = Convert.ToDouble(value); double currentMaxD = Convert.ToDouble(currentMax); double scaledValueD = (absoluteMaxD / currentMaxD) * valueD; return(scaledValueD); } // The function converts DateTime object to the Unix time format // (milliseconds since 1.1.1970) and returns the converted value. // Code source: https://www.fluxbytes.com/csharp/convert-datetime-to-unix-time-in-c/ long ConvertToUnixTime(DateTime datetime) { DateTime sTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return((long)(datetime - sTime).TotalMilliseconds); } // Querying QuestionID:s from ChosenQuestions-table. var rawCqIdsWithDupl = from cq in db.ChosenQuestions orderby cq.QuestionID select cq.QuestionID; // IQueryable to List conversion. List <int> cqIdsWithDupl = rawCqIdsWithDupl.ToList(); // Removing duplicates. List <int> cqIds = cqIdsWithDupl.Distinct().ToList(); // Querying Answers from database based on cqIds-List. Returns AnswerResultTemp // -objects. var rawResultTemps = from id in cqIds join a in db.Answers on id equals a.QuestionID orderby id ascending select new AnswerResultTemp { QuestionID = a.QuestionID, AnswerValue = a.Value, AnswerScaleMax = a.AnswerSet.QuestionMethod.ScaleMax, AnswererTypeID = a.AnswerSet.AnswerBundle.AnswererTypeID, AnswererTypeName = a.AnswerSet.AnswerBundle.AnswererType.Name, AnswerBundleDate = a.AnswerSet.AnswerBundle.Date }; // Converting IENumerable to List. List <AnswerResultTemp> resultTemps = rawResultTemps.ToList(); // Helper variable for scaling values. double absoluteScaleMax = -2; // Finding the largest resultTemps.AnswerScaleMax value foreach (AnswerResultTemp art in resultTemps) { if (art.AnswerScaleMax > absoluteScaleMax) { absoluteScaleMax = Convert.ToDouble(art.AnswerScaleMax); } } List <AnswerResultDTO> results = new List <AnswerResultDTO>(); // Converting AnswerResultTemp objects to AnswerResultDTO-objects foreach (AnswerResultTemp rt in resultTemps) { AnswerResultDTO nr = new AnswerResultDTO(); nr.QuestionID = rt.QuestionID; // Converting value to the scale range based on largest resultTemps.AnswerScaleMax // (absoluteScaleMax) nr.AnswerValue = ScaleAnswerValue(rt.AnswerValue, rt.AnswerScaleMax, absoluteScaleMax); nr.AnswererTypeID = rt.AnswererTypeID; nr.AnswererTypeName = rt.AnswererTypeName; // DateTime converted to Unix time format nr.AnswerBundleDateMs = ConvertToUnixTime(rt.AnswerBundleDate); results.Add(nr); } return(Ok(results)); }