# 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()