private static async Task AddRandomQuizzes(int amount) { // Get questions from open trivia DB API for (var i = 0; i < amount; i++) { dynamic randomQuestion = await GetObjectFromApi("https://opentdb.com/", "api.php?amount=10"); if (randomQuestion == null || randomQuestion.response_code != 0) { continue; } var apiQuestions = new List <Question>(); foreach (var q in randomQuestion.results) { if (q == null) { continue; } // TODO: Should strings be json stringified? string text = HttpUtility.HtmlDecode((string)q.question); string qType = q.type; string qDifficulty = q.difficulty; string answer = HttpUtility.HtmlDecode((string)q.correct_answer); Question question; if (qType == "multiple") { string[] alternatives = { answer, HttpUtility.HtmlDecode((string)q.incorrect_answers[0]), HttpUtility.HtmlDecode((string)q.incorrect_answers[1]), HttpUtility.HtmlDecode((string)q.incorrect_answers[2]) }; var alt = JsonConvert.SerializeObject(alternatives); question = new Question("multiple_choice", text, alt, answer, 'A', qDifficulty, ""); } else { question = new Question("true_false", text, null, answer, answer == "true" ? 'T' : 'F', qDifficulty, null); } apiQuestions.Add(question); await _db.Questions.AddRangeAsync(question); await _db.SaveChangesAsync(); } string randomName = Path.GetRandomFileName().Replace(".", ""); string category = HttpUtility.HtmlDecode(QuizUtil.CategoryFromIndex(_ran.Next(0, 23))); var ranUser = await _db.Users.Skip(_ran.Next(0, _db.Users.Count())).FirstAsync(); var quiz = new Quiz(ranUser, apiQuestions, category, randomName, "Description", "easy") { ImagePath = "/images/logo_transparent_notxt.png", Upvotes = _ran.Next(0, 500), Views = _ran.Next(0, 50000) }; await _db.Quizzes.AddRangeAsync(quiz); await _db.SaveChangesAsync(); } }
public async Task <IActionResult> GetQuizList(string username, int page, int size, string type, int?categoryIndex, string difficulty, string orderBy, string search) { if (page < 1 || (size > 20 || size < 0)) { return(BadRequest()); } switch (type) { case "history" when username != null: { var query = await _um.Users .Where(u => u.UserName == username) .SelectMany(q => q.QuizzesTaken) .Include(q => q.Quiz).ToListAsync(); var entries = query.Skip((page - 1) * size).Take(size).ToList(); var pages = (int)Math.Ceiling(decimal.Divide(query.Count, size)); var authUsername = _um.GetUserName(User); var showSummary = authUsername != null && authUsername == username; return(Ok(new { entries, pages, showSummary })); } case "quizzesBy" when username != null: { var query = await _db.Quizzes.Where(q => q.OwnerUsername == username).ToListAsync(); var entries = query.Skip((page - 1) * size).Take(size).ToList(); var pages = (int)Math.Ceiling(decimal.Divide(query.Count, size)); var authUsername = _um.GetUserName(User); var canEdit = authUsername != null && authUsername == username; return(Ok(new { entries, pages, canEdit })); } case "search": { var category = QuizUtil.CategoryFromIndex(categoryIndex); var query = await _db.Quizzes.ToListAsync(); // If category and difficulty is defined, filter the query if (category != null) { query = query.Where(q => q.Category == category).ToList(); } else if (difficulty != null) { query = query.Where(q => q.Difficulty == difficulty).ToList(); } if (search != null) { var searchArr = Regex.Split(search.ToLower(), @"\s+").Where(s => s != string.Empty); var queryUserName = query.Where(q => searchArr.Any(q.OwnerUsername.ToLower().Contains)).ToList(); var queryDescription = query.Where(q => searchArr.Any(q.Description.ToLower().Contains)).ToList(); var queryCategory = query.Where(q => searchArr.Any(q.Category.ToLower().Contains)).ToList(); var queryTopic = query.Where(q => searchArr.Any(q.Topic.ToLower().Contains)).ToList(); List <Quiz> searchList = new List <Quiz>(); searchList.AddRange(queryTopic); searchList.AddRange(queryUserName); searchList.AddRange(queryDescription); searchList.AddRange(queryCategory); query = searchList.Distinct().ToList(); } if (orderBy != null) { if (orderBy == "views") { query = query.OrderByDescending(q => q.Views).ToList(); } else if (orderBy == "upvotes") { query = query.OrderByDescending(q => q.Upvotes).ToList(); } else if (orderBy == "recent") { query = query.OrderByDescending(q => q.CreationDate).ToList(); } } var entries = query.Skip((page - 1) * size).Take(size).ToList(); var pages = (int)Math.Ceiling(decimal.Divide(query.Count, size)); return(Ok(new { entries, pages })); } default: return(BadRequest("Type not found!")); } }