From b21d9721f5afdc97251c0e2ac8d4c1286fd6f301 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Wed, 23 Mar 2022 17:49:00 +0100 Subject: [PATCH] :sparkles: Added stats to homepage --- classquiz/__init__.py | 3 +- classquiz/routers/quiz.py | 1 + classquiz/routers/stats.py | 62 ++++++++++++++++++++++++++++++++ classquiz/routers/users.py | 1 + frontend/src/routes/index.svelte | 43 ++++++++++++++++------ 5 files changed, 99 insertions(+), 11 deletions(-) create mode 100644 classquiz/routers/stats.py diff --git a/classquiz/__init__.py b/classquiz/__init__.py index 69a6070..44412b0 100644 --- a/classquiz/__init__.py +++ b/classquiz/__init__.py @@ -2,7 +2,7 @@ from fastapi import FastAPI from socketio import ASGIApp from classquiz.db import database -from classquiz.routers import users, quiz, utils +from classquiz.routers import users, quiz, utils, stats from classquiz.socket_server import sio app = FastAPI(redoc_url="", docs_url="/api/docs") @@ -26,4 +26,5 @@ async def shutdown() -> None: app.include_router(users.router, tags=["users"], prefix="/api/v1/users") app.include_router(quiz.router, tags=["quiz"], prefix="/api/v1/quiz") app.include_router(utils.router, tags=["utils"], prefix="/api/v1/utils") +app.include_router(stats.router, tags=["stats"], prefix="/api/v1/stats") app.mount("/", ASGIApp(sio)) diff --git a/classquiz/routers/quiz.py b/classquiz/routers/quiz.py index a534d39..a08bfa7 100644 --- a/classquiz/routers/quiz.py +++ b/classquiz/routers/quiz.py @@ -17,6 +17,7 @@ router = APIRouter() @router.post("/create") async def create_quiz_lol(quiz_input: QuizInput, user: User = Depends(get_current_user)): quiz = Quiz(**quiz_input.dict(), user_id=user.id, id=uuid.uuid4()) + await redis.delete("global_quiz_count") return await quiz.save() diff --git a/classquiz/routers/stats.py b/classquiz/routers/stats.py new file mode 100644 index 0000000..40237c2 --- /dev/null +++ b/classquiz/routers/stats.py @@ -0,0 +1,62 @@ +import os + +from fastapi import APIRouter, Response +from fastapi.background import BackgroundTasks +from fastapi.responses import JSONResponse, RedirectResponse +from fastapi.security import OAuth2PasswordRequestForm +from pydantic import BaseModel +from classquiz.auth import * +from classquiz.config import redis +from classquiz.db.models import * + +router = APIRouter() + + +@router.get("/quizzes") +async def get_quiz_count() -> int: + redis_res = await redis.get("global_quiz_count") + if redis_res is None: + quiz_res = await Quiz.objects.count() + await redis.set("global_quiz_count", quiz_res, ex=3600) + return quiz_res + else: + return int(redis_res) + + +@router.get("/users") +async def get_user_count() -> int: + redis_res = await redis.get("global_user_count") + if redis_res is None: + quiz_res = await User.objects.count() + await redis.set("global_user_count", quiz_res, ex=3600) + return quiz_res + else: + return int(redis_res) + + +class CombinedOutput(BaseModel): + quiz_count: int + user_count: int + + +@router.get("/combined") +async def get_combined_count() -> CombinedOutput: + user_count = None + quiz_count = None + redis_res = await redis.get("global_user_count") + if redis_res is None: + quiz_res = await User.objects.count() + await redis.set("global_user_count", quiz_res, ex=3600) + user_count = quiz_res + else: + user_count = int(redis_res) + + redis_res = await redis.get("global_quiz_count") + if redis_res is None: + quiz_res = await Quiz.objects.count() + await redis.set("global_quiz_count", quiz_res, ex=3600) + quiz_count = quiz_res + else: + quiz_count = int(redis_res) + + return CombinedOutput(quiz_count=quiz_count, user_count=user_count) diff --git a/classquiz/routers/users.py b/classquiz/routers/users.py index 8d17106..54edfbb 100644 --- a/classquiz/routers/users.py +++ b/classquiz/routers/users.py @@ -36,6 +36,7 @@ async def create_user(user: route_user, background_task: BackgroundTasks) -> Use return JSONResponse({"details": "Username mustn't be 32 characters long"}, 400) await user.save() background_task.add_task(send_register_email, email=user.email) + await redis.delete("global_user_count") return user diff --git a/frontend/src/routes/index.svelte b/frontend/src/routes/index.svelte index aeadda2..06ef5cb 100644 --- a/frontend/src/routes/index.svelte +++ b/frontend/src/routes/index.svelte @@ -1,26 +1,49 @@ - ClassQuiz - Home
-
-

ClassQuiz

-

The open-source quiz-platform!

+
+

ClassQuiz

+

The open-source quiz-platform!

-
-
-

Features

-

+ +

+
+

Stats

+

+ {#await getStats() then stats} + There are already {stats.user_count} users and {stats.quiz_count} quizzes on ClassQuiz. + {/await} + +

+
+
+
+
+

Features

+

ClassQuiz is a quiz-platform that allows you to create and manage quizzes.
The main feature is a KAHOOT!-import function that allows you to import quizzes from KAHOOT!-quizzes.