summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/models/user.py4
-rw-r--r--app/routes/me.py53
-rw-r--r--app/routes/user.py2
-rw-r--r--app/schemas/user.py5
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,