Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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!"));
            }
        }