feat: include friend emails in list

This commit is contained in:
nightbug-xx 2025-06-10 10:19:25 +09:00
parent f7ac481314
commit 116716f4dc
3 changed files with 64 additions and 12 deletions

View File

@ -1,7 +1,12 @@
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.core.deps import get_db, get_current_user 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.schemas.character import CharacterResponse
from app.services import friend_service from app.services import friend_service
from app.models.user import User from app.models.user import User
@ -55,7 +60,7 @@ def respond_to_request(
return {"detail": "요청을 처리했습니다."} return {"detail": "요청을 처리했습니다."}
@router.get("/list", response_model=list[int]) @router.get("/list", response_model=list[FriendListItem])
def get_friend_list( def get_friend_list(
db: Session = Depends(get_db), db: Session = Depends(get_db),
current_user: User = Depends(get_current_user) current_user: User = Depends(get_current_user)

View File

@ -18,6 +18,8 @@ class FriendRequestResponse(BaseModel):
id: int id: int
from_user_id: int from_user_id: int
to_user_id: int to_user_id: int
from_user_email: str | None = None
to_user_email: str | None = None
status: FriendRequestStatus status: FriendRequestStatus
created_at: datetime created_at: datetime
updated_at: datetime updated_at: datetime
@ -34,3 +36,11 @@ class FriendResponse(BaseModel):
class Config: class Config:
orm_mode = True orm_mode = True
class FriendListItem(BaseModel):
id: int
email: str
class Config:
orm_mode = True

View File

@ -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.friend import FriendRequest, Friend, FriendRequestStatus
from app.models.user import User from app.models.user import User
from app.models.character import Character, CharacterHomework 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): def get_received_requests(db: Session, user_id: int):
return db.query(FriendRequest).filter( 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.to_user_id == user_id,
FriendRequest.status == FriendRequestStatus.pending FriendRequest.status == FriendRequestStatus.pending,
).all() )
)
return db.execute(stmt).mappings().all()
def get_sent_requests(db: Session, user_id: int): def get_sent_requests(db: Session, user_id: int):
return db.query(FriendRequest).filter( 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.from_user_id == user_id,
FriendRequest.status == FriendRequestStatus.pending FriendRequest.status == FriendRequestStatus.pending,
).all() )
)
return db.execute(stmt).mappings().all()
def cancel_sent_request(db: Session, request_id: int, user_id: int): 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 = [] result = []
for f in friends: for f in friends:
friend_id = f.user_id_2 if f.user_id_1 == user_id else f.user_id_1 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 return result