124 lines
5.1 KiB
Python
124 lines
5.1 KiB
Python
# app/controllers/chat_controller.py
|
|
"""
|
|
HealthSync AI 챗봇 상담 컨트롤러
|
|
"""
|
|
from fastapi import APIRouter, status, HTTPException, Query
|
|
from app.controllers.base_controller import BaseController
|
|
from app.services.chat_service import ChatService
|
|
from app.dto.request.chat_request import ChatRequest
|
|
from app.dto.response.chat_response import ChatResponse
|
|
from app.dto.response.chat_history_response import ChatHistoryResponse
|
|
|
|
|
|
class ChatController(BaseController):
|
|
"""챗봇 상담 관련 컨트롤러"""
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.chat_service = ChatService()
|
|
self.router = APIRouter()
|
|
self._setup_routes()
|
|
|
|
def _setup_routes(self):
|
|
"""라우트 설정"""
|
|
|
|
@self.router.post("/consultation",
|
|
response_model=ChatResponse,
|
|
status_code=status.HTTP_200_OK,
|
|
summary="💬 AI 건강 상담 챗봇",
|
|
description="""
|
|
사용자의 건강검진 데이터를 기반으로 AI가 개인화된 건강 상담을 제공합니다.
|
|
|
|
**처리 과정:**
|
|
1. 사용자 질문 데이터베이스에 저장
|
|
2. 사용자 기본 정보 조회 (직업, 나이 등)
|
|
3. 최신 건강검진 데이터 조회
|
|
4. 사용자 질문과 건강 데이터를 Claude AI로 분석
|
|
5. 맞춤형 건강 상담 답변 생성
|
|
6. 질문에 대한 응답 내용을 데이터베이스에 저장
|
|
|
|
**상담 특징:**
|
|
- 개인 건강 데이터 기반 맞춤형 답변
|
|
- 직업 특성을 고려한 건강 조언
|
|
- 의학적 근거에 기반한 정확한 정보 제공
|
|
- 실질적이고 실행 가능한 건강 관리 방법 제시
|
|
- 모든 상담 내용 자동 저장 및 이력 관리
|
|
|
|
**주의사항:**
|
|
- 이 서비스는 의학적 진단이나 치료를 대체하지 않습니다
|
|
- 심각한 증상이 있을 경우 반드시 의료진과 상담하세요
|
|
""")
|
|
async def health_consultation(request: ChatRequest) -> ChatResponse:
|
|
"""AI 기반 건강 상담 챗봇 (DB 저장 포함)"""
|
|
try:
|
|
self.log_request("health_consultation", user_id=request.user_id,
|
|
message_preview=request.message[:50] + "..." if len(request.message) > 50 else request.message)
|
|
|
|
# 챗봇 상담 서비스 호출 (DB 저장 포함)
|
|
response = await self.chat_service.get_health_consultation(
|
|
user_id=request.user_id,
|
|
message=request.message
|
|
)
|
|
|
|
self.logger.info(f"건강 상담 성공 - user_id: {request.user_id}, "
|
|
f"질문 길이: {len(request.message)}, 답변 길이: {len(response.response)}")
|
|
|
|
return response
|
|
|
|
except ValueError as e:
|
|
self.logger.warning(f"잘못된 요청 - user_id: {request.user_id}, error: {str(e)}")
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=f"잘못된 요청입니다: {str(e)}"
|
|
)
|
|
except Exception as e:
|
|
self.handle_service_error(e, "health_consultation")
|
|
|
|
@self.router.get("/history",
|
|
response_model=ChatHistoryResponse,
|
|
status_code=status.HTTP_200_OK,
|
|
summary="📋 채팅 히스토리 조회",
|
|
description="""
|
|
사용자의 모든 채팅 기록을 조회합니다.
|
|
|
|
**처리 과정:**
|
|
1. 사용자 ID로 데이터베이스에서 채팅 기록 조회
|
|
2. 시간 역순으로 정렬하여 반환
|
|
3. 질문과 응답을 모두 포함한 전체 이력 제공
|
|
|
|
**응답 특징:**
|
|
- 최신 채팅이 먼저 표시됨 (시간 역순)
|
|
- 페이지네이션 없이 전체 기록 반환
|
|
- 메시지 타입별 구분 (상담, 축하, 독려 등)
|
|
- 각 채팅의 고유 ID와 생성 시간 포함
|
|
|
|
**활용 방안:**
|
|
- 이전 상담 내용 참고
|
|
- 건강 관리 진행 상황 확인
|
|
- AI 응답 품질 개선을 위한 피드백 수집
|
|
""")
|
|
async def get_chat_history(user_id: int = Query(..., gt=0, description="사용자 ID")) -> ChatHistoryResponse:
|
|
"""사용자 채팅 히스토리 조회"""
|
|
try:
|
|
self.log_request("get_chat_history", user_id=user_id)
|
|
|
|
# 채팅 이력 서비스 호출
|
|
response = await self.chat_service.get_chat_history(user_id)
|
|
|
|
self.logger.info(f"채팅 이력 조회 성공 - user_id: {user_id}, "
|
|
f"총 채팅 수: {response.total_count}")
|
|
|
|
return response
|
|
|
|
except ValueError as e:
|
|
self.logger.warning(f"잘못된 요청 - user_id: {user_id}, error: {str(e)}")
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=f"잘못된 요청입니다: {str(e)}"
|
|
)
|
|
except Exception as e:
|
|
self.handle_service_error(e, "get_chat_history")
|
|
|
|
|
|
# 컨트롤러 인스턴스 생성
|
|
chat_controller = ChatController() |