Skip to content

Commit 83c4d19

Browse files
authored
Merge pull request #34 from 9git9git/SCRUM-146-BE-캐릭터-도감-API-연동
Scrum 146 be 캐릭터 도감 api 연동
2 parents d55192b + 0e8a9f3 commit 83c4d19

11 files changed

Lines changed: 285 additions & 155 deletions

File tree

app/api/v1/endpoints/character.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
select_character_by_id,
88
delete_character_by_id,
99
update_character_by_id,
10+
get_character_collection,
1011
)
1112
from sqlalchemy.ext.asyncio import AsyncSession
1213
from app.db.session import get_db
@@ -94,3 +95,23 @@ async def delete_character(
9495
return ResponseBase(
9596
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, error=str(e)
9697
)
98+
99+
100+
# 서비스 로직
101+
102+
103+
@router.get("/characters", response_model=ResponseBase[List[CharacterResponse]])
104+
async def get_user_character_collection(
105+
user_id: UUID,
106+
db: AsyncSession = Depends(get_db),
107+
) -> ResponseBase[List[CharacterResponse]]:
108+
try:
109+
characters = await get_character_collection(db, user_id)
110+
return ResponseBase(status_code=status.HTTP_200_OK, data=characters)
111+
except HTTPException as e:
112+
return ResponseBase(status_code=e.status_code, error=e.detail)
113+
except Exception as e:
114+
return ResponseBase(
115+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
116+
error="캐릭터 도감 조회 중 서버 오류가 발생했습니다.",
117+
)

app/api/v1/endpoints/user.py

Lines changed: 2 additions & 2 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, UserInformationResponse
3+
from app.schemas.user import UserResponse, UserUpdate
44
from app.schemas.base import ResponseBase
55
from app.services.user import (
66
select_users,
@@ -34,7 +34,7 @@ async def get_users(
3434

3535

3636
# 프론트엔드에서 사용할 유저 정보 조회 API
37-
@router.get("/{user_id}", response_model=ResponseBase[UserInformationResponse])
37+
@router.get("/{user_id}", response_model=ResponseBase[UserResponse])
3838
async def get_user_by_id(user_id: UUID, db: AsyncSession = Depends(get_db)):
3939
try:
4040
user_info = await select_user_by_id(db, user_id)

app/api/v1/router.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
router.include_router(auth.router, prefix="/auth", tags=["auth"])
2323
router.include_router(user.router, prefix="/users", tags=["users"])
24-
router.include_router(character.router, prefix="/characters", tags=["characters"])
2524
router.include_router(
2625
user_character.router, prefix="/user_characters", tags=["user_characters"]
2726
)
@@ -68,3 +67,13 @@
6867
tags=["todos"],
6968
)
7069
router.include_router(main.router, prefix="/users/{user_id}", tags=["main"])
70+
71+
# 일반 캐릭터 CRUD
72+
router.include_router(character.router, prefix="/characters", tags=["characters"])
73+
74+
# 유저 도감 전용 API (GET /users/{user_id}/characters)
75+
router.include_router(
76+
character.router,
77+
prefix="/users/{user_id}",
78+
tags=["user_characters"], # or "characters" if you want to group together
79+
)

app/crud/character.py

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
1-
from fastapi import HTTPException
2-
from uuid import UUID
3-
from app.schemas.character import CharacterCreate, CharacterResponse, CharacterUpdate
4-
from app.models.user import Character
51
from sqlalchemy import select, delete
62
from sqlalchemy.ext.asyncio import AsyncSession
7-
from typing import List, Optional
3+
from app.schemas.character import CharacterCreate, CharacterUpdate
4+
from app.models.user import Character
5+
from uuid import UUID
6+
from typing import Optional, List
87

98

109
async def create_character(
1110
db: AsyncSession, character_data: CharacterCreate
12-
) -> CharacterResponse:
13-
if await read_character_by_character_name(db, character_data.characterName):
14-
raise HTTPException(status_code=400, detail="이미 존재하는 캐릭터 이름입니다.")
15-
11+
) -> Character:
1612
db_character = Character(
17-
character_name=character_data.characterName,
13+
character_name=character_data.character_name,
1814
level=character_data.level,
19-
image_link=character_data.imageLink,
15+
image_link=character_data.image_link,
2016
)
2117

2218
db.add(db_character)
@@ -26,36 +22,39 @@ async def create_character(
2622
return db_character
2723

2824

29-
async def read_characters(db: AsyncSession) -> List[CharacterResponse]:
25+
async def read_characters(db: AsyncSession) -> List[Character]:
3026
result = await db.execute(select(Character))
31-
return result.scalars().all()
27+
characters = result.scalars().all()
28+
return characters
3229

3330

3431
async def read_character_by_id(
3532
db: AsyncSession, character_id: UUID
36-
) -> Optional[CharacterResponse]:
33+
) -> Optional[Character]:
3734
result = await db.execute(select(Character).where(Character.id == character_id))
38-
return result.scalars().first()
35+
character = result.scalars().first()
36+
return character
3937

4038

41-
async def read_character_by_character_name(
39+
async def read_character_by_name(
4240
db: AsyncSession, character_name: str
43-
) -> Optional[CharacterResponse]:
41+
) -> Optional[Character]:
4442
result = await db.execute(
4543
select(Character).where(Character.character_name == character_name)
4644
)
47-
return result.scalars().first()
45+
character = result.scalars().first()
46+
return character
4847

4948

5049
async def update_character(
5150
db: AsyncSession, character_id: UUID, character_data: CharacterUpdate
52-
) -> Optional[CharacterResponse]:
53-
db_character = await read_character_by_id(db, character_id)
51+
) -> Optional[Character]:
52+
result = await db.execute(select(Character).where(Character.id == character_id))
53+
db_character = result.scalars().first()
5454
if not db_character:
55-
raise HTTPException(status_code=404, detail="캐릭터를 찾을 수 없습니다.")
55+
return None
5656

5757
update_data = character_data.model_dump()
58-
5958
for key, value in update_data.items():
6059
setattr(db_character, key, value)
6160

@@ -66,13 +65,11 @@ async def update_character(
6665

6766

6867
async def delete_character(db: AsyncSession, character_id: UUID) -> bool:
69-
db_character = await read_character_by_id(db, character_id)
70-
if not db_character:
71-
raise HTTPException(status_code=404, detail="캐릭터를 찾을 수 없습니다.")
72-
73-
delete_statement = delete(Character).where(Character.id == character_id)
74-
75-
await db.execute(delete_statement)
76-
await db.commit()
77-
68+
try:
69+
delete_statement = delete(Character).where(Character.id == character_id)
70+
await db.execute(delete_statement)
71+
await db.commit()
72+
except Exception as e:
73+
await db.rollback()
74+
raise e
7875
return True

0 commit comments

Comments
 (0)