public ActionResult EndQuiz(int SessionId) { //ToDo: kad user klikne na zavrsi button ovde ode request, popune se svi podaci na sesiji i pokaze se useru result screen QuizSession session = db.QuizSessions.Include(x => x.PupilAnswers).Where(x => x.Id == SessionId).FirstOrDefault(); session.FinishedAt = DateTime.Now; foreach (var answer in session.PupilAnswers) { if (answer.AndsweredCorrectly.HasValue && answer.AndsweredCorrectly.Value) { session.CorrectAnswers++; } else { session.WrongAnswers++; } } db.SaveChanges(); QuizSession LastSession = db.QuizSessions.Include(x => x.Quiz).Include(x => x.User).ToList().Last(); if (!(Autentifikacija.GetLogiraniKorisnik(HttpContext).Id == LastSession.UserId && LastSession.Id == SessionId)) { return(RedirectToAction("Index", "Home")); } return(View("Results", LastSession)); }
public async Task <IActionResult> GetQuizStatus(Guid id) { string activeQuizId = HttpContext.Session.GetString("activeQuizId"); if (activeQuizId == null) { HttpContext.Session.SetString("activeQuizId", id.ToString()); } Quiz quiz = await _db.Quizzes.FirstOrDefaultAsync(q => q.Id == id); if (quiz == null) { return(NotFound()); } if (quiz.State == "Stopped") { return(Ok(new QuizStatusModel { Status = "Stopped", CurrentQuestion = null })); } QuizSession session = await _db.QuizSessions .Include(s => s.CurrentQuestion) .ThenInclude(q => q.Choices) .Where(s => s.EndedAt == null && s.QuizId == id) .SingleAsync(); Question question = session.CurrentQuestion; int? timeLeftSeconds = null; if (session.QuestionTimeEndsAt.HasValue) { TimeSpan remainingTime = session.QuestionTimeEndsAt.Value.Subtract(DateTimeOffset.UtcNow); timeLeftSeconds = (int)remainingTime.TotalSeconds; if (timeLeftSeconds < 0) { timeLeftSeconds = 0; } } return(Ok(new QuizStatusModel() { Status = quiz.State, CurrentQuestion = new QuestionModel() { Id = question.Id, MultipleCorrectAnswers = question.MultipleCorrectAnswers, Text = question.Text, TimeLeftSeconds = timeLeftSeconds, Choices = question.Choices.Select(c => new ChoiceModel() { Id = c.Id, Text = c.Text }).ToList() } })); }
public async Task <IActionResult> SubmitAnswer(Guid id, [FromBody] IList <Guid> chosenAnswers) { //Find the current question in the given quiz QuizSession session = await _db.QuizSessions .Where(s => s.EndedAt == null && s.QuizId == id) .SingleAsync(); if (session.CurrentQuestionId.HasValue == false) { return(BadRequest()); } string userId = HttpContext.Session.Id; //Assign a new answer for this session id on that question var answer = new Answer { Id = Guid.NewGuid(), QuestionId = session.CurrentQuestionId.Value, SessionId = session.Id, UserId = userId, SelectedChoices = chosenAnswers.Select(choiceId => new SelectedAnswer() { ChoiceId = choiceId }).ToList() }; _db.Answers.Add(answer); await _db.SaveChangesAsync(); return(Ok()); }
public IActionResult Previous(int id) { var session = new QuizSession(HttpContext.Session); //get list of questions from QuestionViewModel in session var listOfQuestions = session.GetMyQuestionViewModel(); //get index of question displayed on the screen int index = listOfQuestions.FindIndex(q => q.QuestionId == id); //get previous question var quesVM = listOfQuestions[index - 1]; if (index <= 1) { ViewBag.Previous = false; } else { ViewBag.Previous = true; } ViewBag.Action = "Next"; ViewBag.QuesNo = index; return(View("Index", quesVM)); }
public IActionResult Index() { var session = new QuizSession(HttpContext.Session); var questions = context.Questions.OrderBy(q => Guid.NewGuid()).Take(10).ToList(); session.SetMyQuestions(questions); return(View()); }
public PartialViewResult StartQuiz(int QuizvId) { NewSessionViewModel vm = new NewSessionViewModel(); Quiz q = db.Quizes.Include(x => x.Teacher).Include(x => x.Questions).Where(x => x.vId == QuizvId).FirstOrDefault(); vm.vId = q.vId; vm.Teacher = q.Teacher.Name; vm.Name = q.Name; vm.CreatedAt = q.CreatedAt; QuizSession session = new QuizSession(); session.QuizId = q.Id; session.StartedAt = DateTime.Now; session.UserId = Autentifikacija.GetLogiraniKorisnik(HttpContext).Id; session.WrongAnswers = 0; session.CorrectAnswers = 0; db.QuizSessions.Add(session); db.SaveChanges(); vm.SessionId = session.Id; int i = 1; foreach (var question in q.Questions) { session.PupilAnswers.Add(new Answer { AndsweredCorrectly = null, QuestionId = question.Id, QuestionOptionId = null, QuizSessionId = session.Id, SeqNumber = i }); i++; } db.SaveChanges(); vm.CurrentQuestion = q.Questions.Where(qu => qu.Id == session.PupilAnswers.Where(pa => pa.SeqNumber == 1).First().QuestionId) .Select(x => new NewSessionViewModel.QuestionInfo { Id = x.Id, PossibleAnswers = db.QuestionOptions.Where(qo => qo.QuestionId == x.Id).Select(y => new NewSessionViewModel.QuestionInfo.OptionInfo { Id = y.Id, Text = y.Text }).ToList(), Text = x.Text, SeqNumber = 1, IsLastQuestion = false }).FirstOrDefault(); return(PartialView("_QuizQuestionPartial", vm)); }
public async Task <ActionResult <QuizSession> > PostQuizSession(QuizSession quizSession) { var entity = _mapper.Map(quizSession); entity.AppUserId = User.UserGuidId(); _uow.QuizSessions.Add(entity); await _uow.SaveChangesAsync(); Console.WriteLine(entity.Id); return(CreatedAtAction("GetQuizSession", new { id = entity.Id }, _mapper.Map(entity))); }
public async Task <IActionResult> PutQuizSession(Guid id, QuizSession quizSession) { if (id != quizSession.Id) { return(BadRequest()); } var dalEntity = _mapper.Map(quizSession); dalEntity.AppUserId = User.UserGuidId(); await _uow.QuizSessions.UpdateAsync(dalEntity); await _uow.SaveChangesAsync(); return(NoContent()); }
public async Task <IActionResult> StartQuiz(Guid id) { //Check the quiz is one owned by the user's tenant Quiz quiz = await _db.Quizzes .Include(q => q.Questions) .ThenInclude(q => q.Choices) .FirstOrDefaultAsync(q => q.Id == id); if (quiz == null) { return(NotFound()); } if (User.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid")?.Value != quiz.TenantId) { return(NotFound()); } //Change status to "Started" quiz.State = "Started"; Question firstQuestion = quiz.Questions.OrderBy(q => q.Id).First(); //Create the session, assign the first question var session = new QuizSession() { Id = Guid.NewGuid(), CurrentQuestionId = firstQuestion.Id, StartedAt = DateTimeOffset.UtcNow, QuizId = id }; //Setup the ending time in the session and fire off a delayed message if (firstQuestion.TimeLimitSeconds > 0) { session.QuestionTimeEndsAt = DateTimeOffset.UtcNow.AddSeconds(firstQuestion.TimeLimitSeconds); } _db.QuizSessions.Add(session); await _db.SaveChangesAsync(); //Notify the group of clients subscribed to the quiz of the question await NotifyNextQuestionAsync(id, firstQuestion); return(Ok()); }
public IActionResult Index() { var session = new QuizSession(HttpContext.Session); //get first question var question = session.GetMyQuestions().FirstOrDefault(); ViewBag.Previous = false; ViewBag.Action = "Next"; ViewBag.QuesNo = 1; List <QuizViewModel> quesVMList = new List <QuizViewModel>(); //get QuestionViewModel for the question var quesVM = GetQuestionViewModel(question); //adding first question to list in session quesVMList.Add(quesVM); session.SetMyQuestionViewModel(quesVMList); return(View(quesVM)); }
//[Authorize("goToNextQuestion")] public async Task <IActionResult> GoToNextQuestion(Guid id) { //Get the quiz, check it is running Quiz quiz = await _db.Quizzes .Include(q => q.Questions) .ThenInclude(q => q.Choices) .FirstOrDefaultAsync(q => q.Id == id); if (quiz == null) { return(NotFound()); } if (User.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid")?.Value != quiz.TenantId) { return(NotFound()); } if (quiz.State != "Started") { return(BadRequest()); } //Get next question QuizSession session = await _db.QuizSessions .Where(s => s.EndedAt == null && s.QuizId == id && s.CurrentQuestionId != null) .SingleAsync(); Question nextQuestion = quiz.Questions .OrderBy(q => q.Id) .FirstOrDefault(q => q.Id.CompareTo(session.CurrentQuestionId.Value) > 0); //If there is one if (nextQuestion != null) { // Do same things as when quiz was started, update the session // and signal the clients session.CurrentQuestionId = nextQuestion.Id; if (nextQuestion.TimeLimitSeconds > 0) { session.QuestionTimeEndsAt = DateTimeOffset.UtcNow.AddSeconds(nextQuestion.TimeLimitSeconds); } await NotifyNextQuestionAsync(id, nextQuestion); await _db.SaveChangesAsync(); } else { // quiz is over // update status to stopped, end the session quiz.State = "Stopped"; session.EndedAt = DateTimeOffset.UtcNow; session.CurrentQuestionId = null; await _db.SaveChangesAsync(); // send a message to all clients await _hub.Clients.Group(id.ToString()).QuizOver(); // erase the group created for the quiz? } return(Ok()); }
public async Task <ActionResult> LaunchQuiz(int QuizId, string code) //public ActionResult LaunchQuiz(int QuizId, string code) { //newException.AddDummyException("Quiz ID First - " + Convert.ToString(QuizId)); bool isPlek = false; try { TblUser sessionUser = (TblUser)Session["UserSession"]; if (string.IsNullOrEmpty(code)) { QuizSession quizForSession = new QuizSession(); quizForSession.QuizId = Convert.ToInt32(QuizId); quizForSession.isUsed = false; lstQuiz.Add(quizForSession); Session["QuizId"] = lstQuiz; if (string.IsNullOrEmpty(Convert.ToString(Session["QuizId"]))) { newException.AddDummyException("Quiz Id in LaunchQuiz is Null"); } } List <TblQuiz> lstAllQuiz = new List <TblQuiz>(); if (sessionUser == null) { TenantRepository tr = new TenantRepository(); List <TblTenant> tenantDetails = new List <TblTenant>(); string host = Request.Url.Host; var tenantList1 = tr.VerifyTenantDomain(host); if (tenantList1.Count > 0) { if (tenantList1[0].TenantId == 6) { if (string.IsNullOrEmpty(code)) { return(Redirect("https://pumplace.plek.co/oidc/auth?client_id=1663f8ca-7b8a-42eb-ae3b-845e32be1baf&scope=openid&response_type=code&redirect_uri=https://quiz.rockettech.co.nz/")); } else { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("Access-Control-Allow-Origin", "*"); string tokenApi = "https://pumplace.plek.co/oidc/token"; var values = new Dictionary <string, string>(); values.Add("client_id", "1663f8ca-7b8a-42eb-ae3b-845e32be1baf"); values.Add("client_secret", "TZD4Jr837e6uymsJdyxH2jk8qxGQiK7gXDCmYqtC"); values.Add("grant_type", "authorization_code"); values.Add("code", code); values.Add("redirect_uri", "https://quiz.rockettech.co.nz/"); var content = new FormUrlEncodedContent(values); var responseTask = await client.PostAsync(tokenApi, content); var result = await responseTask.Content.ReadAsStringAsync(); var data = (JObject)JsonConvert.DeserializeObject(result); string token = data["access_token"].Value <string>();//Access Token Received //Now get User Details string userApi = "https://pumplace.plek.co/oidc/me"; client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); HttpResponseMessage response = await client.GetAsync(userApi); if (response.IsSuccessStatusCode) { string jsondata = await response.Content.ReadAsStringAsync(); var userData = (JObject)JsonConvert.DeserializeObject(jsondata); string email = userData["email"].Value <string>(); string name = userData["username"].Value <string>(); var userId = ur.IsUserExist(email, Request.Url.Host); if (userId == 0) { try { //Create user TblUser newUser = new TblUser(); newUser.FirstName = name; newUser.EmailId = email; newUser.RoleId = 3; newUser.IsActive = true; newUser.CreatedBy = 1; CommonFunctions common = new CommonFunctions(); newUser.Password = common.GetEncodePassword("123456"); var tenantList = tr.VerifyTenantDomain(Request.Url.Host); newUser.TenantId = tenantList[0].TenantId; var newUserId = ur.AddUser(newUser); if (newUserId > 0) { //Assign Quiz to Newly Created User //newException.AddDummyException("111 - " + Convert.ToString(QuizId)); var objQuiz = quizRepository.GetQuizByID(Convert.ToInt32(QuizId)); if (objQuiz != null) { if (objQuiz[0] != null) { if (objQuiz[0].TenantId == 6) { var assign = quizRepository.AssignQuiz(Convert.ToInt32(QuizId), newUserId, null); } } } userId = newUserId; } } catch (Exception ex) { newException.AddException(ex); } } else { //check Quiz assigned or not var isAssigned = quizRepository.CheckQuizAssignedUser(Convert.ToInt32(QuizId), userId); if (!isAssigned) { newException.AddDummyException("222 - " + QuizId); var objQuiz = quizRepository.GetQuizByID(Convert.ToInt32(QuizId)); if (objQuiz != null) { if (objQuiz[0] != null) { if (objQuiz[0].TenantId == 6) { var assign = quizRepository.AssignQuiz(Convert.ToInt32(QuizId), userId, null); } } } } } List <TblUser> tblUser = ur.GetUserById(userId); Session["UserSession"] = tblUser[0]; lstAllQuiz = quizRepository.GetQuizForLaunch(Convert.ToInt32(QuizId), userId); JavaScriptSerializer json_serializer = new JavaScriptSerializer(); json_serializer.MaxJsonLength = int.MaxValue; lstAllQuiz[0].hdnLaunchData = json_serializer.Serialize(lstAllQuiz[0]); isPlek = true; } } } } if (tenantList1[0].TenantId == 9) { //newException.AddDummyException("In - 111 "); CommonFunctions common = new CommonFunctions(); var password = common.GetEncodePassword("123456"); TblUser tblUser = ur.IsValidUser("*****@*****.**", password, Request.Url.Host); lstAllQuiz = quizRepository.GetQuizForLaunch(Convert.ToInt32(QuizId), tblUser.UserId); JavaScriptSerializer json_serializer = new JavaScriptSerializer(); json_serializer.MaxJsonLength = int.MaxValue; lstAllQuiz[0].hdnLaunchData = json_serializer.Serialize(lstAllQuiz[0]); //newException.AddDummyException("In - 222 "); isPlek = true; } } } else { if (sessionUser.TenantId == 6) { isPlek = true; //check Quiz assigned or not var isAssigned = quizRepository.CheckQuizAssignedUser(Convert.ToInt32(QuizId), sessionUser.UserId); //newException.AddDummyException(Convert.ToString(isAssigned)); if (!isAssigned) { //newException.AddDummyException("333 - " + QuizId); var objQuiz = quizRepository.GetQuizByID(Convert.ToInt32(QuizId)); if (objQuiz != null) { if (objQuiz[0] != null) { if (objQuiz[0].TenantId == 6) { var assign = quizRepository.AssignQuiz(Convert.ToInt32(QuizId), sessionUser.UserId, null); lstAllQuiz = quizRepository.GetQuizForLaunch(Convert.ToInt32(QuizId), sessionUser.UserId); JavaScriptSerializer json_serializer = new JavaScriptSerializer(); json_serializer.MaxJsonLength = int.MaxValue; lstAllQuiz[0].hdnLaunchData = json_serializer.Serialize(lstAllQuiz[0]); } } } } else { lstAllQuiz = quizRepository.GetQuizForLaunch(Convert.ToInt32(QuizId), sessionUser.UserId); JavaScriptSerializer json_serializer = new JavaScriptSerializer(); json_serializer.MaxJsonLength = int.MaxValue; lstAllQuiz[0].hdnLaunchData = json_serializer.Serialize(lstAllQuiz[0]); } } if (sessionUser.TenantId == 9) { //newException.AddDummyException("In - 111 "); CommonFunctions common = new CommonFunctions(); var password = common.GetEncodePassword("123456"); TblUser tblUser = ur.IsValidUser("*****@*****.**", password, Request.Url.Host); lstAllQuiz = quizRepository.GetQuizForLaunch(Convert.ToInt32(QuizId), tblUser.UserId); JavaScriptSerializer json_serializer = new JavaScriptSerializer(); json_serializer.MaxJsonLength = int.MaxValue; lstAllQuiz[0].hdnLaunchData = json_serializer.Serialize(lstAllQuiz[0]); //newException.AddDummyException("In - 222 "); isPlek = true; } else { lstAllQuiz = quizRepository.GetQuizForLaunch(Convert.ToInt32(QuizId), sessionUser.UserId); JavaScriptSerializer json_serializer = new JavaScriptSerializer(); json_serializer.MaxJsonLength = int.MaxValue; lstAllQuiz[0].hdnLaunchData = json_serializer.Serialize(lstAllQuiz[0]); } } if (isPlek) { return(View("LaunchQuizForPlek", lstAllQuiz[0])); } else { return(View("LaunchQuizNew", lstAllQuiz[0])); } } catch (Exception ex) { newException.AddException(ex); if (isPlek) { return(View("LaunchQuizForPlek")); } else { return(View("LaunchQuizNew")); } } }
public async Task <IActionResult> Update([FromBody] QuizSession quizSession, string id) { var res = await Clients.Group(id).UpdateSession(quizSession); return(Ok(res)); }
public async Task <IActionResult> Save([FromBody] QuizSession quizSession) { var res = await quizSessionRepository.Insert(quizSession); return(this.Ok(res)); }
public IActionResult Result(QuizViewModel quesViewModel) { var session = new QuizSession(HttpContext.Session); List <Question> listOfQuestions = session.GetMyQuestions(); //get index of the question displayed on the screen int index = listOfQuestions.FindIndex(q => q.QuestionId == quesViewModel.QuestionId); //saving selected option in the QuestionViewModel var questionViewModelList = session.GetMyQuestionViewModel(); questionViewModelList[index].SelectedOptionId = quesViewModel.SelectedOptionId; session.SetMyQuestionViewModel(questionViewModelList); // clear model state ModelState.Clear(); var score = 0; //if present displayed question is not last question then condition is true if (index < (listOfQuestions.Count - 1)) { //select next question var question = listOfQuestions[index + 1]; ViewBag.Previous = true; ViewBag.Action = "Next"; //if next question to be displayed is last if ((index + 1) >= (listOfQuestions.Count - 1)) { ViewBag.Action = "Submit"; } ViewBag.QuesNo = index + 2; var quesVM = GetQuestionViewModel(question); //adding question to list in QuestionViewModel list of session if not already added if (!questionViewModelList.Select(q => q.QuestionId).Contains(quesVM.QuestionId)) { questionViewModelList.Add(quesVM); session.SetMyQuestionViewModel(questionViewModelList); } else { quesVM = session.GetMyQuestionViewModel()[index + 1]; } return(View("Index", quesVM)); } else { //submit is pressed on last question so calculate score questionViewModelList = session.GetMyQuestionViewModel(); foreach (var question in questionViewModelList) { if (question.CorrectAnswer == question.SelectedOptionId) { score++; } } Quiz quiz = new Quiz(); quiz.Score = score; quiz.QuizDate = DateTime.Now; context.Quizzes.Add(quiz); context.SaveChanges(); return(View(quiz)); } }