diff --git a/app/api/friend.py b/app/api/friend.py index fecce43..c88bf3e 100644 --- a/app/api/friend.py +++ b/app/api/friend.py @@ -1,7 +1,12 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.core.deps import get_db, get_current_user -from app.schemas.friend import FriendRequestCreate, FriendRequestResponse, FriendResponse +from app.schemas.friend import ( + FriendRequestCreate, + FriendRequestResponse, + FriendResponse, + FriendListItem, +) from app.schemas.character import CharacterResponse from app.services import friend_service from app.models.user import User @@ -55,7 +60,7 @@ def respond_to_request( return {"detail": "요청을 처리했습니다."} -@router.get("/list", response_model=list[int]) +@router.get("/list", response_model=list[FriendListItem]) def get_friend_list( db: Session = Depends(get_db), current_user: User = Depends(get_current_user) diff --git a/app/schemas/friend.py b/app/schemas/friend.py index 59b90b7..d981bba 100644 --- a/app/schemas/friend.py +++ b/app/schemas/friend.py @@ -18,6 +18,8 @@ class FriendRequestResponse(BaseModel): id: int from_user_id: int to_user_id: int + from_user_email: str | None = None + to_user_email: str | None = None status: FriendRequestStatus created_at: datetime updated_at: datetime @@ -34,3 +36,11 @@ class FriendResponse(BaseModel): class Config: orm_mode = True + + +class FriendListItem(BaseModel): + id: int + email: str + + class Config: + orm_mode = True diff --git a/app/services/friend_service.py b/app/services/friend_service.py index 466c663..e529c01 100644 --- a/app/services/friend_service.py +++ b/app/services/friend_service.py @@ -1,4 +1,5 @@ -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, aliased +from sqlalchemy import select from app.models.friend import FriendRequest, Friend, FriendRequestStatus from app.models.user import User from app.models.character import Character, CharacterHomework @@ -44,17 +45,51 @@ def send_friend_request(db: Session, from_user_id: int, to_user_email: str): def get_received_requests(db: Session, user_id: int): - return db.query(FriendRequest).filter( - FriendRequest.to_user_id == user_id, - FriendRequest.status == FriendRequestStatus.pending - ).all() + sender = aliased(User) + receiver = aliased(User) + stmt = ( + select( + FriendRequest.id, + FriendRequest.from_user_id, + FriendRequest.to_user_id, + sender.email.label("from_user_email"), + receiver.email.label("to_user_email"), + FriendRequest.status, + FriendRequest.created_at, + FriendRequest.updated_at, + ) + .join(sender, FriendRequest.from_user_id == sender.id) + .join(receiver, FriendRequest.to_user_id == receiver.id) + .where( + FriendRequest.to_user_id == user_id, + FriendRequest.status == FriendRequestStatus.pending, + ) + ) + return db.execute(stmt).mappings().all() def get_sent_requests(db: Session, user_id: int): - return db.query(FriendRequest).filter( - FriendRequest.from_user_id == user_id, - FriendRequest.status == FriendRequestStatus.pending - ).all() + sender = aliased(User) + receiver = aliased(User) + stmt = ( + select( + FriendRequest.id, + FriendRequest.from_user_id, + FriendRequest.to_user_id, + sender.email.label("from_user_email"), + receiver.email.label("to_user_email"), + FriendRequest.status, + FriendRequest.created_at, + FriendRequest.updated_at, + ) + .join(sender, FriendRequest.from_user_id == sender.id) + .join(receiver, FriendRequest.to_user_id == receiver.id) + .where( + FriendRequest.from_user_id == user_id, + FriendRequest.status == FriendRequestStatus.pending, + ) + ) + return db.execute(stmt).mappings().all() def cancel_sent_request(db: Session, request_id: int, user_id: int): @@ -104,7 +139,9 @@ def get_friend_list(db: Session, user_id: int): result = [] for f in friends: friend_id = f.user_id_2 if f.user_id_1 == user_id else f.user_id_1 - result.append(friend_id) + friend = db.query(User).filter(User.id == friend_id).first() + friend_email = friend.email if friend else None + result.append({"id": friend_id, "email": friend_email}) return result