Skip to content

Commit 01ba2df

Browse files
authored
Merge pull request #29 from 9git9git/SCRUM-141-BE-프로필-API-연동
Scrum 141 be 프로필 api 연동
2 parents 69c646f + 0190d1a commit 01ba2df

3 files changed

Lines changed: 37 additions & 13 deletions

File tree

app/api/v1/endpoints/user.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from fastapi import APIRouter, Depends, HTTPException, status
22
from sqlalchemy.ext.asyncio import AsyncSession
3-
from app.schemas.user import UserResponse, UserUpdate
3+
from app.schemas.user import UserResponse, UserUpdate, UserInformationResponse
44
from app.schemas.base import ResponseBase
55
from app.services.user import (
66
select_users,
@@ -33,16 +33,14 @@ async def get_users(
3333
)
3434

3535

36-
@router.get("/{user_id}", response_model=ResponseBase[UserResponse])
37-
async def get_user_by_id(
38-
user_id: UUID,
39-
db: AsyncSession = Depends(get_db),
40-
) -> ResponseBase[UserResponse]:
36+
# 프론트엔드에서 사용할 유저 정보 조회 API
37+
@router.get("/{user_id}", response_model=ResponseBase[UserInformationResponse])
38+
async def get_user_by_id(user_id: UUID, db: AsyncSession = Depends(get_db)):
4139
try:
42-
user = await select_user_by_id(db, user_id)
43-
return ResponseBase(status_code=status.HTTP_200_OK, data=user)
40+
user_info = await select_user_by_id(db, user_id)
41+
return ResponseBase(status_code=status.HTTP_200_OK, data=user_info)
4442
except HTTPException as e:
45-
return ResponseBase(status_code=e.status_code, error=e.detail)
43+
raise ResponseBase(status_code=e.status_code, error=e.detail)
4644
except Exception as e:
4745
return ResponseBase(
4846
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, error=str(e)

app/schemas/user.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,7 @@ class UserUpdate(BaseModel):
3030
level: int
3131
exp: int
3232
character_count: int
33+
34+
35+
class UserInformationResponse(UserResponse):
36+
completed_todo_count: int

app/services/user.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from fastapi import HTTPException, status
22
from app.utils.hashed import get_password_hash
33
from sqlalchemy.ext.asyncio import AsyncSession
4+
from sqlalchemy import select
5+
from sqlalchemy.orm import selectinload
46
from app.crud.user import (
57
read_users,
68
create_user,
@@ -9,18 +11,38 @@
911
read_user_by_id,
1012
read_user_by_email,
1113
)
12-
from app.schemas.user import UserCreate, UserResponse, UserUpdate
14+
from app.schemas.user import (
15+
UserCreate,
16+
UserResponse,
17+
UserUpdate,
18+
UserInformationResponse,
19+
)
1320
from typing import List
1421
from uuid import UUID
22+
from app.models.user import User
1523

1624

17-
async def select_user_by_id(db: AsyncSession, user_id: UUID) -> UserResponse:
18-
user = await read_user_by_id(db, user_id)
25+
async def select_user_by_id(db: AsyncSession, user_id: UUID) -> UserInformationResponse:
26+
result = await db.execute(
27+
select(User).options(selectinload(User.todos)).where(User.id == user_id)
28+
)
29+
user = result.scalars().first()
1930
if not user:
2031
raise HTTPException(
2132
status_code=status.HTTP_404_NOT_FOUND, detail="사용자를 찾을 수 없습니다."
2233
)
23-
return user
34+
35+
completed_todo_count = sum(1 for todo in user.todos if todo.is_completed)
36+
37+
return UserInformationResponse(
38+
id=user.id,
39+
name=user.name,
40+
email=user.email,
41+
level=user.level,
42+
exp=user.exp,
43+
character_count=user.character_count,
44+
completed_todo_count=completed_todo_count,
45+
)
2446

2547

2648
async def select_user_by_email(db: AsyncSession, email: str) -> UserResponse:

0 commit comments

Comments
 (0)