Skip to content

Commit e1e8644

Browse files
authored
Merge pull request #63 from kookmin-sw/feature/#60-refactor
[#60][BE] 백엔드 코드 리팩토링
2 parents 75aea41 + 3acaa6d commit e1e8644

27 files changed

Lines changed: 664 additions & 555 deletions

backend/app/ai/main.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from app.core.auth.csrf import verify_csrf
88
from app.core.auth.dependencies import get_current_user_id
99
from app.core.config import settings
10+
from app.core.schemas.health import HealthResponse
1011

1112
app = FastAPI(title="Poco AI Orchestrator")
1213

@@ -28,8 +29,8 @@
2829

2930

3031
@app.get("/health")
31-
def health() -> dict:
32-
return {"ok": True, "service": "ai"}
32+
def health() -> HealthResponse:
33+
return HealthResponse(ok=True, service="ai")
3334

3435

3536
# Lambda B entrypoint

backend/app/ai/routers/steps.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,46 @@
11
from uuid import UUID
22

3-
from fastapi import APIRouter, Depends
4-
from sqlalchemy.orm import Session
3+
from fastapi import Depends
54
from fastapi import status as http_status
5+
from sqlalchemy.orm import Session
66

77
from app.ai.services import step_service
8+
from app.core.api.route import EnvelopeRouter
89
from app.core.database import get_db
10+
from app.core.schemas.step import (
11+
NotionTemplateResponse,
12+
StepAcceptResponse,
13+
StepDetailResponse,
14+
StepGenerateResponse,
15+
)
916

10-
router = APIRouter()
11-
12-
13-
def _ok(data):
14-
return {"status": "success", "data": data}
17+
router = EnvelopeRouter()
1518

1619

1720
@router.post("/steps/{step_id}/generate", status_code=http_status.HTTP_201_CREATED)
18-
def generate_steps(step_id: UUID, db: Session = Depends(get_db)) -> dict:
21+
def generate_steps(
22+
step_id: UUID, db: Session = Depends(get_db)
23+
) -> StepGenerateResponse:
1924
"""현재 Step 기반으로 다음 후보 Step 3개를 AI로 생성."""
20-
response = step_service.generate_steps(db, step_id)
21-
return _ok(response)
25+
return step_service.generate_steps(db, step_id)
26+
2227

2328
@router.post("/steps/{step_id}/accept", status_code=http_status.HTTP_200_OK)
24-
def accept_step(step_id: UUID, db: Session = Depends(get_db)) -> dict:
25-
response = step_service.accept_step(db, step_id)
26-
return _ok(response)
29+
def accept_step(step_id: UUID, db: Session = Depends(get_db)) -> StepAcceptResponse:
30+
return step_service.accept_step(db, step_id)
31+
2732

2833
@router.get("/steps/{step_id}", status_code=http_status.HTTP_200_OK)
29-
def get_step_detail(step_id: UUID, db: Session = Depends(get_db)) -> dict:
30-
response = step_service.get_step_detail(db, step_id)
31-
return _ok(response)
34+
def get_step_detail(step_id: UUID, db: Session = Depends(get_db)) -> StepDetailResponse:
35+
return step_service.get_step_detail(db, step_id)
3236

3337

3438
@router.post(
3539
"/steps/{step_id}/notion-template", status_code=http_status.HTTP_201_CREATED
3640
)
37-
def create_notion_template(step_id: UUID) -> dict:
41+
def create_notion_template(step_id: UUID) -> NotionTemplateResponse:
3842
"""Required Step의 Notion 템플릿 페이지 생성 — TODO: Notion API 연동."""
39-
return _ok(
40-
{
41-
"notion_page_id": "placeholder",
42-
"notion_page_url": "https://notion.so/placeholder",
43-
}
43+
return NotionTemplateResponse(
44+
notion_page_id="placeholder",
45+
notion_page_url="https://notion.so/placeholder",
4446
)

backend/app/ai/services/orchestrator.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
from app.core.aws.bedrock import bedrock_runtime
44
from app.core.config import settings
5-
from app.core.schemas.bedrock import AcceptPayload, GeneratePayload, SidePanelPayload
6-
5+
from app.core.schemas.step import AcceptRequest, GenerateRequest, SidePanelRequest
76

87

98
def _invoke_claude(prompt: str) -> str:
@@ -30,8 +29,11 @@ def _invoke_claude(prompt: str) -> str:
3029
{"is_current_required_step_completed": true 또는 false}
3130
"""
3231

33-
def call_accept(payload: AcceptPayload) -> dict:
34-
message = ACCEPT_PROMPT + "\n\n" + json.dumps(payload.model_dump(), ensure_ascii=False)
32+
33+
def call_accept(request: AcceptRequest) -> dict:
34+
message = (
35+
ACCEPT_PROMPT + "\n\n" + json.dumps(request.model_dump(), ensure_ascii=False)
36+
)
3537
raw = _invoke_claude(message)
3638
return json.loads(raw)
3739

@@ -46,11 +48,14 @@ def call_accept(payload: AcceptPayload) -> dict:
4648
"""
4749

4850

49-
def call_generate(payload: GeneratePayload) -> dict:
50-
message = GENERATE_PROMPT + "\n\n" + json.dumps(payload.model_dump(), ensure_ascii=False)
51+
def call_generate(request: GenerateRequest) -> dict:
52+
message = (
53+
GENERATE_PROMPT + "\n\n" + json.dumps(request.model_dump(), ensure_ascii=False)
54+
)
5155
raw = _invoke_claude(message)
5256
return json.loads(raw)
5357

58+
5459
SIDE_PANEL_PROMPT = """\
5560
당신은 소프트웨어 개발 방법론 전문가입니다.
5661
아래 데이터를 바탕으로 사용자가 클릭한 Step에 대한 멘토링과 용어 사전을 생성하세요.
@@ -71,7 +76,11 @@ def call_generate(payload: GeneratePayload) -> dict:
7176
"""
7277

7378

74-
def call_side_panel(payload: SidePanelPayload) -> dict:
75-
message = SIDE_PANEL_PROMPT + "\n\n" + json.dumps(payload.model_dump(), ensure_ascii=False)
79+
def call_side_panel(request: SidePanelRequest) -> dict:
80+
message = (
81+
SIDE_PANEL_PROMPT
82+
+ "\n\n"
83+
+ json.dumps(request.model_dump(), ensure_ascii=False)
84+
)
7685
raw = _invoke_claude(message)
77-
return json.loads(raw)
86+
return json.loads(raw)

0 commit comments

Comments
 (0)