private IEnumerable <string> ValidateQuiz(Quiz quiz, QuizBlock block) { var errorMessages = new List <string>(); if (quiz.Name == null) { errorMessages.Add("There is no quiz name"); } if (!ValidateQuizName(quiz.Name, quiz.Id)) { errorMessages.Add("Quiz name is not unique"); } if (block.QuestionCount == null) { errorMessages.Add("There is no question quantity"); } else if (block.QuestionCount <= 0) { errorMessages.Add("Question quantity should be greater then 0"); } if (!_repository.Exists <QuizType>(q => q.Id == quiz.QuizTypeId)) { errorMessages.Add("There is no such quiz type in database"); } if (quiz.QuizState == null) { if (quiz.StartDate != null) { errorMessages.Add("There is start date but state isnt Scheduled"); } if (quiz.EndDate != null) { errorMessages.Add("There is end date but state isnt Scheduled"); } if (quiz.TimeLimitMinutes != null) { errorMessages.Add("There is time limit but state isnt Scheduled"); } if (quiz.UserGroup != null) { errorMessages.Add("There is user group selected but state isnt Scheduled"); } } if (quiz.Id != 0) { var latestEdit = _repository.Get <QuizEditHistory>(q => q.QuizId == quiz.Id, q => q.User).OrderByDescending(q => q.LastChangeDate).Take(1).FirstOrDefault(); if (latestEdit.UserId != User.Identity.GetUserId()) { errorMessages.Add("Quiz is being edited by another user, refresh page"); } } return(errorMessages.Count > 0 ? errorMessages : null); }
private object GetQuizBlockForSerialization(QuizBlock block) { var minQuizBlock = new { Id = block.Id, QuizId = block.QuizId, TopicId = block.TopicId, QuestionCount = block.QuestionCount }; return(minQuizBlock); }
public ActionResult Save(Quiz quiz, QuizBlock block, QuizEditHistory latestChange) { var errorMessages = ValidateQuiz(quiz, block); if (errorMessages != null) { var errorMessage = string.Format("Invalid data: {0}", string.Concat(errorMessages)); return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, errorMessage)); } var now = DateTime.UtcNow; if (quiz.Id != 0) { quiz.QuizStateId = quiz.QuizState.Id; quiz.QuizState = null; block.Quiz = null; if (quiz.UserGroup != null) { quiz.GroupId = quiz.UserGroup.Id; quiz.UserGroup = null; } latestChange.LastChangeDate = now; latestChange.User = null; _repository.Update <QuizEditHistory>(latestChange); _repository.Update <Quiz>(quiz); _repository.Update <QuizBlock>(block); } else { quiz.QuizStateId = quiz.QuizState.Id; quiz.QuizState = null; _repository.Insert <Quiz>(quiz); block.TopicId = 1; block.QuizId = quiz.Id; _repository.Insert <QuizBlock>(block); _repository.Insert <QuizVariant>(new QuizVariant() { QuizId = quiz.Id }); latestChange = LockQuiz(quiz.Id, User.Identity.GetUserId(), now); } quiz.QuizState = _repository.GetSingle <QuizState>(q => q.Id == quiz.QuizStateId); quiz.UserGroup = _repository.GetSingle <UserGroup>(g => g.Id == quiz.GroupId); var minQuiz = GetQuizForSerialization(quiz); var minQuizBlock = GetQuizBlockForSerialization(block); var minLatestChange = GetQuizEditHistoryForSerialization(latestChange); var result = new { quiz = minQuiz, block = minQuizBlock, latestChange = minLatestChange }; return(Json(result)); }
public List <QuizBlock> ShuffleBlocks(List <QuizBlock> blocksOriginal) // Not in-place { Random rand = new Random(); var blocks = blocksOriginal.Select(b => (QuizBlock)b.Clone()).ToList(); int n = blocks.Count; while (n > 1) { int k = rand.Next(n--); // get some item to swap with QuizBlock t = blocks[k]; blocks[k] = blocks[n]; blocks[n] = t; } return(blocks); }
public ActionResult Get(int id) { Quiz quiz = _repository.GetSingle <Quiz>(q => q.Id == id, r => r.UserGroup, s => s.QuizState); quiz.UserGroup.Quizs = null; quiz.QuizState.Quizs = null; QuizBlock block = _repository.GetSingle <QuizBlock>(b => b.QuizId == id); var data = JsonConvert.SerializeObject(new { quiz = quiz, block = block }, Formatting.None, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); return(Content(data, "application/json")); }
public ActionResult Get(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Id is null")); } var now = DateTime.UtcNow; var locked = false; var latestChange = _repository.Get <QuizEditHistory>(q => q.QuizId == id, q => q.User).OrderByDescending(q => q.LastChangeDate).Take(1).FirstOrDefault(); if (latestChange != null) { var endLock = latestChange.LastChangeDate.AddMinutes(QuizLockDuration); if (endLock > now && latestChange.UserId != User.Identity.GetUserId()) // && USER != latestEdit.User //UPDATE WHEN AUTH { locked = true; } else { latestChange = LockQuiz((int)id, User.Identity.GetUserId(), now); } } else { latestChange = LockQuiz((int)id, User.Identity.GetUserId(), now); } Quiz quiz = _repository.GetSingle <Quiz>(q => q.Id == id, r => r.UserGroup, s => s.QuizState); QuizBlock block = _repository.GetSingle <QuizBlock>(b => b.QuizId == id); var minQuiz = GetQuizForSerialization(quiz); var minQuizBlock = GetQuizBlockForSerialization(block); var minLatestChange = GetQuizEditHistoryForSerialization(latestChange); var result = new { quiz = minQuiz, block = minQuizBlock, latestChange = minLatestChange, locked = locked }; return(Json(result, JsonRequestBehavior.AllowGet)); }
public ActionResult Save(Quiz quiz, QuizBlock block) { if (quiz.Id != 0) { //using (eQuizEntities model = new eQuizEntities(System.Configuration.ConfigurationManager.ConnectionStrings["eQuizDB"].ConnectionString)) //{ // var updateQuiz = model.Quizs.FirstOrDefault(q => q.Id == quiz.Id); // if (updateQuiz == null) // { // return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest, "Quiz not found"); // } // var updateBlock = model.QuizBlocks.FirstOrDefault(q => q.Id == quiz.Id); // if (updateBlock == null) // { // return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest, "QuizBlock not found"); // } // updateQuiz.Name = quiz.Name; // updateQuiz.QuizTypeId = quiz.QuizTypeId; // updateQuiz.StartDate = quiz.StartDate; // updateQuiz.EndDate = quiz.EndDate; // updateQuiz.TimeLimitMinutes = quiz.TimeLimitMinutes; // updateQuiz.GroupId = quiz.GroupId; // updateBlock.QuestionCount = block.QuestionCount; // model.SaveChanges(); // quiz = updateQuiz; // quiz.UserGroup = model.UserGroups.FirstOrDefault(g => g.Id == quiz.GroupId); // block = updateBlock; //} _repository.Update <Quiz>(quiz); _repository.Update <QuizBlock>(block); } else { //block.TopicId = 1; //block.Quiz = quiz; //using (eQuizEntities model = new eQuizEntities(System.Configuration.ConfigurationManager.ConnectionStrings["eQuizDB"].ConnectionString)) //{ // quiz.UserGroup = model.UserGroups.Where(g => g.Id == quiz.UserGroup.Id).First(); // model.Quizs.Add(quiz); // model.QuizBlocks.Add(block); // // model.QuizVariants.Add(new QuizVariant() { QuizId = quiz.Id }); UPDATE DB // model.SaveChanges(); //} // // model.QuizVariants.Add(new QuizVariant() { QuizId = quiz.Id }); UPDATE DB //temp quiz.QuizStateId = quiz.QuizState.Id; quiz.QuizState = null; quiz.GroupId = 1; // UPDATE DB // _repository.Insert <Quiz>(quiz); block.TopicId = 1; block.QuizId = quiz.Id; _repository.Insert <QuizBlock>(block); _repository.Insert <QuizVariant>(new QuizVariant() { QuizId = quiz.Id }); } var data = JsonConvert.SerializeObject(new { quiz = quiz, block = block }, Formatting.None, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); return(Content(data, "application/json")); }
public ActionResult Schedule(Quiz quiz, int timeZoneOffset) { var errorMessages = ValidateSchedule(quiz); if (errorMessages != null) { var errorMessage = string.Format("Invalid data: {0}", string.Concat(errorMessages)); return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, errorMessage)); } var copy = _repository.GetSingle <Quiz>(q => q.Id == quiz.Id); var sheduledStateId = _repository.GetSingle <QuizState>(q => q.Name == "Scheduled").Id; var newQuiz = new Quiz() { Name = String.Format("{0} / {1}", quiz.Name, quiz.UserGroup.Name), StartDate = quiz.StartDate?.AddMinutes(timeZoneOffset), EndDate = quiz.EndDate?.AddMinutes(timeZoneOffset), TimeLimitMinutes = quiz.TimeLimitMinutes, QuizStateId = sheduledStateId, QuizTypeId = copy.QuizTypeId, GroupId = quiz.UserGroup.Id }; var quizBlock = _repository.GetSingle <QuizBlock>(q => q.QuizId == quiz.Id); var quizQuestions = _repository.Get <QuizQuestion>(q => q.QuizBlockId == quizBlock.Id); var questions = _repository.Get <QuizQuestion>(q => q.QuizBlockId == quizBlock.Id, q => q.Question).Select(q => q.Question); var questionAnswers = new List <QuestionAnswer>(); var questionTags = new List <QuestionTag>(); foreach (var question in questions) { var currrentAnswers = _repository.Get <QuestionAnswer>(q => q.QuestionId == question.Id, q => q.Answer); questionAnswers.AddRange(currrentAnswers); var currentTags = _repository.Get <QuestionTag>(q => q.QuestionId == question.Id); questionTags.AddRange(currentTags); } var answers = questionAnswers.Select(q => q.Answer); _repository.Insert <Quiz>(newQuiz); var newQuizBlock = new QuizBlock() { QuizId = newQuiz.Id, QuestionCount = quizBlock.QuestionCount, TopicId = _repository.GetSingle <Topic>().Id }; _repository.Insert <QuizBlock>(newQuizBlock); foreach (var question in quizQuestions) { question.Question = questions.FirstOrDefault(q => q.Id == question.QuestionId); } foreach (var answer in questionAnswers) { answer.Question = questions.FirstOrDefault(q => q.Id == answer.QuestionId); } foreach (var tag in questionTags) { tag.Question = questions.FirstOrDefault(q => q.Id == tag.QuestionId); } foreach (var question in questions) { question.QuizPassQuestions = null; question.QuizQuestions = null; _repository.Insert(question); } foreach (var question in quizQuestions) { question.QuizBlockId = newQuizBlock.Id; question.QuestionId = question.Question.Id; question.Question = null; _repository.Insert <QuizQuestion>(question); } foreach (var answer in questionAnswers) { answer.Answer = answers.FirstOrDefault(a => a.Id == answer.AnswerId); } foreach (var answer in answers) { answer.QuestionAnswers = null; answer.UserAnswers = null; _repository.Insert <Answer>(answer); } foreach (var answer in questionAnswers) { answer.AnswerId = answer.Answer.Id; answer.Answer = null; answer.QuestionId = answer.Question.Id; answer.Question = null; _repository.Insert <QuestionAnswer>(answer); } foreach (var tag in questionTags) { tag.QuestionId = tag.Question.Id; tag.Question = null; _repository.Insert <QuestionTag>(tag); } return(Json(newQuiz.Id)); }