public async Task <IActionResult> SendSurveyResponses([FromBody] SurveyAnswerRequest request) { Response <SurveyStat> response = new Response <SurveyStat>(); try { var isFaulted = IsAuthenticationFaulted(UserIdentity); if (isFaulted) { response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = null, ResponseCode = "E009", ResponseMessage = "You do not have the permission to carry out this operation, kindly login and try again." } }; return(Unauthorized(response.ResponseBody)); } if (request.Responses.Count == 0) { ModelState.AddModelError("questionId", "questionId is required!"); ModelState.AddModelError("optionId", "optionId is required!"); } if (!ModelState.IsValid) { var requestResponse = ApiResponseFormatter.RequestResponse(ModelState); return(BadRequest(requestResponse)); } User userCredentials; Survey survey; using (var _context = new MiniSurveyContext()) { userCredentials = await _context.Users.Where(x => x.Id == UserIdentity) .Include(x => x.UserResponses) .FirstOrDefaultAsync(); survey = await _context.Surveys.Where(a => a.Id == request.SurveyId).FirstOrDefaultAsync(); } if (userCredentials == null) { response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = null, ResponseCode = "E003", ResponseMessage = "You do not have the permission to submit your response. Kindly login or register to share your opinion." } }; return(Unauthorized(response.ResponseBody)); } if (survey == null) { response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = null, ResponseCode = "E012", ResponseMessage = "The survey you selected does not exist. Kindly try again later." } }; return(NotFound(response.ResponseBody)); } if (userCredentials.UserResponses.Count == 0) { List <Models.UserResponse> selectedResponses = new List <Models.UserResponse>(); foreach (var userResponse in request.Responses) { Models.UserResponse selectedResponse = new Models.UserResponse { QuestionId = userResponse.QuestionId, OptionId = userResponse.OptionId, UserId = userCredentials.Id, DateResponded = DateTime.UtcNow, SurveyId = request.SurveyId, TextResponse = userResponse.TextAnswer }; selectedResponses.Add(selectedResponse); } using (var _context = new MiniSurveyContext()) { _context.UserResponses.AddRange(selectedResponses); await _context.SaveChangesAsync(); } } List <Models.UserResponse> userResponses = new List <Models.UserResponse>(); List <Models.QuestionOption> questionOptions = new List <QuestionOption>(); using (var _context = new MiniSurveyContext()) { userResponses = await _context.UserResponses.ToListAsync(); questionOptions = await _context.QuestionOptions.Include(a => a.Question).Include(a => a.Option).ToListAsync(); } var totalUserIds = userResponses.Select(a => a.UserId).Distinct().ToList(); var totalQuestionIds = userResponses.Select(a => a.QuestionId).Distinct().ToList(); var totalUsersCount = totalUserIds.Count; var totalQuestionsCount = totalQuestionIds.Count; List <Poll> polls = new List <Poll>(); foreach (var questionId in totalQuestionIds) { var selectedQuestionOptions = questionOptions.Where(a => a.QuestionId == questionId); var questionResponses = userResponses.Where(a => a.QuestionId == questionId); var question = selectedQuestionOptions.FirstOrDefault().Question; List <OpinionPoll> questionOpinions = new List <OpinionPoll>(); if (selectedQuestionOptions != null) { foreach (var selectedQuestionOption in selectedQuestionOptions) { var option = selectedQuestionOption.Option; var responseCount = questionResponses.Count(a => a.OptionId == option.Id); var numberDivision = (double)responseCount / (double)totalUsersCount; var responsePercentage = numberDivision * 100; var roundedUpPercentage = Math.Round(responsePercentage, 1); OpinionPoll opinionPoll = new OpinionPoll { OptionId = option.Id, Option = option.Text, Percentage = roundedUpPercentage }; questionOpinions.Add(opinionPoll); } } Poll poll = new Poll { QuestionId = questionId, Question = question.Text, OpinionPolls = questionOpinions }; polls.Add(poll); } SurveyStat stat = new SurveyStat { Polls = polls, TotalParticipants = totalUsersCount, TotalQuestions = totalQuestionsCount }; response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = stat, ResponseCode = "00", ResponseMessage = "You have successfully shared your opinion in the survey. Kindly view our stats to compare your responses with those of others." } }; return(Ok(response.ResponseBody)); } catch (Exception) { response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = null, ResponseCode = "E001", ResponseMessage = "Sorry, we are unable to process your request at the moment, kindly try again later." } }; return(StatusCode(500, response.ResponseBody)); } }
public async Task <IActionResult> SurveyResponses(int surveyId) { Response <SurveyStat> response = new Response <SurveyStat>(); try { var isFaulted = IsAuthenticationFaulted(UserIdentity); if (isFaulted) { response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = null, ResponseCode = "E009", ResponseMessage = "You do not have the permission to carry out this operation, kindly login and try again." } }; return(Unauthorized(response.ResponseBody)); } User userCredentials; using (var _context = new MiniSurveyContext()) { userCredentials = await _context.Users.Where(x => x.Id == UserIdentity) .Include(x => x.UserResponses) .FirstOrDefaultAsync(); } if (userCredentials == null) { response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = null, ResponseCode = "E003", ResponseMessage = "You have not registered so you cannot view the survey review or statistics. Kindly register to participate." } }; return(Unauthorized(response.ResponseBody)); } if (userCredentials.UserResponses.Count == 0) { response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = null, ResponseCode = "E005", ResponseMessage = "You have not taken part in the survey and therefore cannot view the survey statistics. Kindly answer questions to participate." } }; return(Ok(response.ResponseBody)); } List <Models.UserResponse> userResponses = new List <Models.UserResponse>(); List <Models.QuestionOption> questionOptions = new List <QuestionOption>(); using (var _context = new MiniSurveyContext()) { userResponses = await _context.UserResponses.Where(a => a.SurveyId == surveyId).ToListAsync(); questionOptions = await _context.QuestionOptions.Include(a => a.Question).Include(a => a.Option).ToListAsync(); } var totalUserIds = userResponses.Select(a => a.UserId).Distinct().ToList(); var totalQuestionIds = userResponses.Select(a => a.QuestionId).Distinct().ToList(); var totalUsersCount = totalUserIds.Count; var totalQuestionsCount = totalQuestionIds.Count; List <Poll> polls = new List <Poll>(); foreach (var questionId in totalQuestionIds) { var selectedQuestionOptions = questionOptions.Where(a => a.QuestionId == questionId); var questionResponses = userResponses.Where(a => a.QuestionId == questionId); var question = selectedQuestionOptions.FirstOrDefault().Question; List <OpinionPoll> questionOpinions = new List <OpinionPoll>(); if (selectedQuestionOptions != null) { foreach (var selectedQuestionOption in selectedQuestionOptions) { var option = selectedQuestionOption.Option; var responseCount = questionResponses.Count(a => a.OptionId == option.Id); var numberDivision = (double)responseCount / (double)totalUsersCount; var responsePercentage = numberDivision * 100; var roundedUpPercentage = Math.Round(responsePercentage, 1); OpinionPoll opinionPoll = new OpinionPoll { OptionId = option.Id, Option = option.Text, Percentage = roundedUpPercentage }; questionOpinions.Add(opinionPoll); } } Poll poll = new Poll { QuestionId = questionId, Question = question.Text, OpinionPolls = questionOpinions }; polls.Add(poll); } SurveyStat stat = new SurveyStat { Polls = polls, TotalParticipants = totalUsersCount, TotalQuestions = totalQuestionsCount }; response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = stat, ResponseCode = "00", ResponseMessage = "You have successfully shared your opinion in the survey. Kindly view our stats to compare your responses with those of others." } }; return(Ok(response.ResponseBody)); } catch (Exception) { response = new Response <SurveyStat> { ResponseBody = new SuccessResponse <SurveyStat> { Data = null, ResponseCode = "E001", ResponseMessage = "Sorry, we are unable to process your request at the moment, kindly try again later." } }; return(StatusCode(500, response.ResponseBody)); } }