from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from typing import List from app.db.session import get_db from app.api import deps from app.models.user import User from app.models.gamification import UserStats, UserBadge, Badge from app.schemas.social import UserStatSchema, BadgeSchema # Itt feltételezzük, hogy a sémákat már létrehoztad router = APIRouter() @router.get("/my-stats", response_model=UserStatSchema) async def get_my_stats( db: AsyncSession = Depends(get_db), current_user: User = Depends(deps.get_current_user) ): """ A bejelentkezett felhasználó aktuális pontszámának és szintjének lekérése. """ result = await db.execute( select(UserStats).where(UserStats.user_id == current_user.id) ) stats = result.scalar_one_or_none() if not stats: # Ha még nincs statisztika (új user), visszaadunk egy alapértelmezett kezdő állapotot return { "total_points": 0, "current_level": 1, "last_updated": None } return stats @router.get("/my-badges", response_model=List[BadgeSchema]) async def get_my_badges( db: AsyncSession = Depends(get_db), current_user: User = Depends(deps.get_current_user) ): """ A felhasználó által eddig megszerzett összes jelvény listázása. """ # Összekapcsoljuk a Badge és UserBadge táblákat query = ( select(Badge.name, Badge.description, UserBadge.earned_at) .join(UserBadge, Badge.id == UserBadge.badge_id) .where(UserBadge.user_id == current_user.id) ) result = await db.execute(query) # Az .all() itt Tuple-öket ad vissza, amiket a Pydantic automatikusan validál return result.all()