/// <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);
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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));
        }