78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
# SPDX-FileCopyrightText: 2023 Marlon W (Mawoka)
|
|
#
|
|
# SPDX-License-Identifier: MPL-2.0
|
|
import enum
|
|
import uuid
|
|
from datetime import datetime
|
|
|
|
from fastapi import APIRouter, HTTPException, Depends
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from classquiz.auth import get_current_user
|
|
from classquiz.db.models import User, Quiz, Rating
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
#
|
|
@router.get("/user/{user_id}", response_model_include={"username", "created_at", "id"}, response_model=User)
|
|
async def get_user_by_user_id(user_id: UUID):
|
|
user = await User.objects.get_or_none(id=user_id)
|
|
# .select_related("quizs")
|
|
# print(user)
|
|
if user is None:
|
|
raise HTTPException(status_code=404, detail="user not found")
|
|
else:
|
|
return user
|
|
|
|
|
|
@router.get("/quizzes/{user_id}", response_model_exclude={"questions", "user_id"}, response_model=list[Quiz])
|
|
async def get_quizzes_from_user(user_id: UUID, imported: bool | None = None):
|
|
if imported is None:
|
|
quizzes = await Quiz.objects.all(user_id=user_id, public=True)
|
|
else:
|
|
quizzes = await Quiz.objects.filter(
|
|
(Quiz.imported_from_kahoot == False) | (Quiz.imported_from_kahoot == None) # noqa
|
|
).all(user_id=user_id, public=True)
|
|
if len(quizzes) == 0:
|
|
raise HTTPException(status_code=404, detail="no quizzes found")
|
|
else:
|
|
return quizzes
|
|
|
|
|
|
class RateQuizInputType(str, enum.Enum):
|
|
LIKE = "LIKE"
|
|
DISLIKE = "DISLIKE"
|
|
|
|
|
|
class RateQuizInput(BaseModel):
|
|
type: RateQuizInputType
|
|
|
|
|
|
@router.post("/rate/{quiz_id}")
|
|
async def rate_quiz(data: RateQuizInput, quiz_id: uuid.UUID, user: User = Depends(get_current_user)):
|
|
quiz = await Quiz.objects.get_or_none(id=quiz_id, public=True)
|
|
if quiz is None:
|
|
raise HTTPException(status_code=404, detail="Quiz not found")
|
|
rating = await Rating.objects.get_or_none(quiz=quiz, user=user)
|
|
positive = True
|
|
if data.type == RateQuizInputType.DISLIKE:
|
|
positive = False
|
|
if rating is not None and rating.positive == positive:
|
|
raise HTTPException(status_code=409, detail="Rating already submitted")
|
|
elif rating is not None and rating.positive != positive:
|
|
await rating.delete()
|
|
if rating.positive:
|
|
quiz.likes -= 1
|
|
else:
|
|
quiz.dislikes -= 1
|
|
rating = Rating(id=uuid.uuid4(), user=user, positive=positive, quiz=quiz, created_at=datetime.now())
|
|
await rating.save()
|
|
if positive:
|
|
quiz.likes += 1
|
|
else:
|
|
quiz.dislikes += 1
|
|
await quiz.update()
|