diff options
| -rw-r--r-- | app/models/user.py | 4 | ||||
| -rw-r--r-- | app/routes/me.py | 53 | ||||
| -rw-r--r-- | app/routes/user.py | 2 | ||||
| -rw-r--r-- | app/schemas/user.py | 5 |
4 files changed, 41 insertions, 23 deletions
diff --git a/app/models/user.py b/app/models/user.py index 442173c..11f5107 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -65,3 +65,7 @@ class User(Base): ): result = await session.execute(select(cls).where(cls.id == user_id)) return result.scalars().first() + + @property + def has_password(self) -> bool: + return bool(self.password) diff --git a/app/routes/me.py b/app/routes/me.py index 03d0daa..65368e3 100644 --- a/app/routes/me.py +++ b/app/routes/me.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter, Depends, HTTPException, Request +from fastapi import APIRouter, Depends, Request from sqlalchemy.ext.asyncio import AsyncSession from app.auth.jwt import decode_token @@ -11,30 +11,43 @@ router = APIRouter(tags=["auth"]) async def get_current_user_from_cookie( request: Request, session: AsyncSession = Depends(get_async_session), -): +) -> dict: token = request.cookies.get("access_token") if not token: - raise HTTPException(status_code=401, detail="Unauthorized") + return {"authenticated": False, "user": None} - payload = decode_token(token) - user_id = int(payload.get("sub")) - user = await User.get_user_by_id(user_id, session=session) + try: + payload = decode_token(token) + sub = payload.get("sub") + if sub is None: + return {"authenticated": False, "user": None} + user_id = int(sub) + except ValueError, TypeError: + return {"authenticated": False, "user": None} - if not user: - raise HTTPException(status_code=404, detail="User not found") - if user.token_version != payload.get("token_version"): - raise HTTPException(status_code=401, detail="Token revoked") + user = await User.get_user_by_id(user_id, session=session) + if not user or user.token_version != payload.get("token_version"): + return {"authenticated": False, "user": None} - return user + # Return authenticated user + return { + "authenticated": True, + "user": { + "id": user.id, + "username": user.username, + "password": user.has_password, + "google_id": user.google_id, + "email": user.email, + "premium": user.premium, + "is_banned": user.is_banned, + "is_moderator": user.is_moderator, + }, + } @router.get("/me") -async def read_current_user(user: User = Depends(get_current_user_from_cookie)): - return { - "id": user.id, - "username": user.username, - "email": user.email, - "premium": user.premium, - "is_banned": user.is_banned, - "is_moderator": user.is_moderator, - } +async def read_current_user( + user_info: dict = Depends(get_current_user_from_cookie), +): + # Directly return the dict to the frontend + return user_info diff --git a/app/routes/user.py b/app/routes/user.py index 0860cc1..1eb096d 100644 --- a/app/routes/user.py +++ b/app/routes/user.py @@ -18,4 +18,4 @@ async def get_user( if not user: raise HTTPException(status_code=404, detail="User not found") - return user + return UserRead.model_validate(user) diff --git a/app/schemas/user.py b/app/schemas/user.py index 83a3245..d809196 100644 --- a/app/schemas/user.py +++ b/app/schemas/user.py @@ -20,14 +20,15 @@ class UserCreate(BaseModel): class UserRead(BaseModel): id: int username: str - email: EmailStr = None + email: Optional[EmailStr] = None google_id: Optional[str] = None avatar_file: Optional[str] = None banner_file: Optional[str] = None + has_password: bool premium: bool is_banned: bool is_moderator: bool - profile: Optional[ProfileRead] = None + profile: ProfileRead integrations: Optional[UserIntegrationRead] = None model_config = { "from_attributes": True, |
