11import os
2+ from pydantic import ValidationError
23from contextlib import asynccontextmanager
34
45from fastapi .middleware .cors import CORSMiddleware
56from fastapi .openapi .utils import get_openapi
6- from pydantic import ValidationError
7+
78from starlette .middleware .base import BaseHTTPMiddleware
89from starlette .middleware .sessions import SessionMiddleware
910from starlette .responses import JSONResponse
11+
1012from utils .DB_mongo import MongoDBHandler
1113from utils .DB_mysql import MySQLDBHandler
12- from utils .Error_handlers import (BadRequestException ,
13- InternalServerErrorException ,
14- NotFoundException , add_exception_handlers )
15- from utils .Models import (ChatLog_Update_Request , ChatLog_Create_Request ,
16- ChatLog_Delete_Request , ChatRoom_Delete_Request ,
17- ChatLog_Identifier_Request , ChatLog_Id_Request ,
18- ChatData_Response , Validators )
14+ from utils .Error_handlers import (
15+ BadRequestException ,
16+ InternalServerErrorException ,
17+ NotFoundException , add_exception_handlers
18+ )
19+ from utils .Models import (Validators ,
20+ Identifier_Request , Log_Delete_Request ,
21+ Room_Delete_Request , Id_Request , Response ,
22+ Office_Create_Request , Office_Update_Request ,
23+ ChatBot_Create_Request , ChatBot_Update_Request ,
24+ )
1925
2026from fastapi import APIRouter , FastAPI , HTTPException , Query , Request
2127
@@ -69,30 +75,17 @@ def _get_error_detail(self, exception: Exception) -> str:
6975 allow_methods = ["*" ],
7076 allow_headers = ["*" ],
7177)
72-
7378def custom_openapi ():
7479 if app .openapi_schema :
7580 return app .openapi_schema
7681
7782 openapi_schema = get_openapi (
7883 title = "ChatBot FastAPI" ,
79- version = "v0.1.0-dev " ,
84+ version = "v0.2.0 " ,
8085 summary = "쳇봇 데이터 관리 API (개발 중인 버전)" ,
8186 routes = app .routes ,
8287 description = (
8388 "이 API는 다음과 같은 기능을 제공합니다:\n \n "
84- "1. **유저 채팅 문서 생성**\n "
85- " - **Endpoint**: `GET /chat/create`\n "
86- " - **설명**: MongoDB에 새로운 유저 채팅 문서(채팅 로그)를 생성합니다.\n \n "
87- "2. **유저 채팅 저장**\n "
88- " - **Endpoint**: `POST /chat/save_log`\n "
89- " - **설명**: MongoDB의 생성된 문서에 유저의 채팅 데이터를 저장합니다.\n \n "
90- "3. **데이터베이스 목록 조회**\n "
91- " - **Endpoint**: `GET /database/names`\n "
92- " - **설명**: MongoDB 서버에 있는 데이터베이스 목록을 조회합니다.\n \n "
93- "4. **데이터베이스 컬렉션 목록 조회**\n "
94- " - **Endpoint**: `GET /database/collections`\n "
95- " - **설명**: 현재 데이터베이스의 컬렉션 목록을 조회합니다.\n \n "
9689 "각 엔드포인트의 자세한 정보는 해당 엔드포인트의 문서에서 확인할 수 있습니다."
9790 ),
9891 )
@@ -101,11 +94,9 @@ def custom_openapi():
10194 }
10295 app .openapi_schema = openapi_schema
10396 return app .openapi_schema
104-
10597app .openapi = custom_openapi
10698
107- # MySQL 관련 라우터 정의
108- mysql_router = APIRouter ()
99+ mysql_router = APIRouter () # MySQL 관련 라우터 정의
109100
110101@mysql_router .get ("/tables" , summary = "테이블 목록 가져오기" )
111102async def list_tables ():
@@ -141,8 +132,7 @@ async def execute_query(query: str):
141132 responses = {500 : {"description" : "Internal Server Error" }}
142133)
143134
144- # MongoDB 관련 라우터 정의
145- mongo_router = APIRouter ()
135+ mongo_router = APIRouter () # MySQL 관련 라우터 정의
146136
147137@mongo_router .get ("/db" , summary = "데이터베이스 목록 가져오기" )
148138async def list_databases ():
@@ -166,19 +156,140 @@ async def list_collections(db_name: str = Query(..., description="데이터베
166156 except Exception as e :
167157 raise InternalServerErrorException (detail = str (e ))
168158
169- @mongo_router .post ("/chat/create" , summary = "유저 채팅방 ID 생성" )
170- async def create_chat (request : ChatLog_Id_Request ):
159+ office_router = APIRouter () # Office 관련 라우터 정의
160+
161+ @office_router .post ("/create" , summary = "유저 채팅방 ID 생성" )
162+ async def create_chat (request : Id_Request ):
163+ '''
164+ 새로운 유저 채팅 문서(채팅 로그)를 MongoDB에 생성합니다.
165+ '''
166+ try :
167+ document_id = await mongo_handler .create_office_collection (user_id = request .user_id )
168+ return {"Document ID" : document_id }
169+ except Exception as e :
170+ raise InternalServerErrorException (detail = str (e ))
171+
172+ @office_router .put ("/save_log" , summary = "유저 채팅 저장" )
173+ async def save_chat_log (request : Office_Create_Request ):
174+ '''
175+ 생성된 채팅 문서에 유저의 채팅 데이터를 저장합니다.
176+ '''
177+ try :
178+ request_data = request .model_dump ()
179+ filtered_data = {key : value for key , value in request_data .items () if key != 'id' }
180+
181+ response_message = await mongo_handler .add_office_log (
182+ user_id = request .user_id ,
183+ document_id = request .id ,
184+ new_data = filtered_data
185+ )
186+ return {"Result" : response_message }
187+ except ValidationError as e :
188+ raise BadRequestException (detail = str (e ))
189+ except NotFoundException as e :
190+ raise NotFoundException (detail = str (e ))
191+ except Exception as e :
192+ raise InternalServerErrorException (detail = str (e ))
193+
194+ @office_router .put ("/update_log" , summary = "유저 채팅 업데이트" )
195+ async def update_chat_log (request : Office_Update_Request ):
196+ '''
197+ 기존 채팅 문서에 유저의 채팅 데이터를 수정합니다.
198+ '''
199+ try :
200+ request_data = request .model_dump ()
201+ filtered_data = {key : value for key , value in request_data .items () if key != 'id' }
202+
203+ response_message = await mongo_handler .update_office_log (
204+ user_id = request .user_id ,
205+ document_id = request .id ,
206+ new_Data = filtered_data
207+ )
208+ return {"Result" : response_message }
209+ except ValidationError as e :
210+ raise BadRequestException (detail = str (e ))
211+ except NotFoundException as e :
212+ raise NotFoundException (detail = str (e ))
213+ except Exception as e :
214+ raise InternalServerErrorException (detail = str (e ))
215+
216+
217+ @office_router .post ("/load_log" , response_model = Response , summary = "유저 채팅 불러오기" )
218+ async def load_chat_log (request : Identifier_Request ) -> Response :
219+ '''
220+ 생성된 채팅 문서의 채팅 로그를 MongoDB에서 불러옵니다.
221+ '''
222+ try :
223+ chat_logs = await mongo_handler .get_office_log (
224+ user_id = request .user_id ,
225+ document_id = request .id
226+ )
227+
228+ response_data = Response (
229+ id = request .id ,
230+ value = chat_logs
231+ )
232+
233+ return response_data
234+ except ValidationError as e :
235+ raise BadRequestException (detail = str (e ))
236+ except NotFoundException as e :
237+ raise NotFoundException (detail = str (e ))
238+ except Exception as e :
239+ raise InternalServerErrorException (detail = str (e ))
240+
241+ @office_router .delete ("/delete_log" , summary = "유저 채팅 일부 지우기" )
242+ async def delete_chat_log (request : Log_Delete_Request ):
243+ '''
244+ 최신 대화 ~ 선택된 채팅을 로그에서 삭제합니다.
245+ '''
246+ try :
247+ response_message = await mongo_handler .remove_office_log (
248+ user_id = request .user_id ,
249+ document_id = request .id ,
250+ selected_count = request .index
251+ )
252+ return {"Result" : response_message }
253+ except ValidationError as e :
254+ raise BadRequestException (detail = str (e ))
255+ except NotFoundException as e :
256+ raise NotFoundException (detail = str (e ))
257+ except Exception as e :
258+ raise InternalServerErrorException (detail = str (e ))
259+
260+ @office_router .delete ("/delete_room" , summary = "유저 채팅 지우기" )
261+ async def delete_chat_room (request : Room_Delete_Request ):
262+ '''
263+ 유저의 채팅방을 삭제합니다.
264+ '''
265+ try :
266+ response_message = await mongo_handler .remove_office_collection (
267+ user_id = request .user_id ,
268+ document_id = request .id
269+ )
270+ return {"Result" : response_message }
271+ except ValidationError as e :
272+ raise BadRequestException (detail = str (e ))
273+ except NotFoundException as e :
274+ raise NotFoundException (detail = str (e ))
275+ except Exception as e :
276+ raise InternalServerErrorException (detail = str (e ))
277+
278+ chatbot_router = APIRouter () # Chatbot 관련 라우터 정의
279+
280+ @chatbot_router .post ("/create" , summary = "유저 채팅방 ID 생성" )
281+ async def create_chat (request : Id_Request ):
171282 '''
172283 새로운 유저 채팅 문서(채팅 로그)를 MongoDB에 생성합니다.
173284 '''
174285 try :
175- document_id = await mongo_handler .create_chatlog_collection (user_id = request .user_id )
286+ document_id = await mongo_handler .create_chatbot_collection (user_id = request .user_id )
176287 return {"Document ID" : document_id }
177288 except Exception as e :
178289 raise InternalServerErrorException (detail = str (e ))
179290
180- @mongo_router .put ("/chat /save_log" , summary = "유저 채팅 저장" )
181- async def save_chat_log (request : ChatLog_Create_Request ):
291+ @chatbot_router .put ("/save_log" , summary = "유저 채팅 저장" )
292+ async def save_chat_log (request : ChatBot_Create_Request ):
182293 '''
183294 생성된 채팅 문서에 유저의 채팅 데이터를 저장합니다.
184295 '''
@@ -187,7 +298,7 @@ async def save_chat_log(request: ChatLog_Create_Request):
187298 request_data = request .model_dump ()
188299 filtered_data = {key : value for key , value in request_data .items () if key != 'id' }
189300
190- response_message = await mongo_handler .add_chatlog_value (
301+ response_message = await mongo_handler .add_chatbot_log (
191302 user_id = request .user_id ,
192303 document_id = request .id ,
193304 new_data = filtered_data
@@ -200,8 +311,8 @@ async def save_chat_log(request: ChatLog_Create_Request):
200311 except Exception as e :
201312 raise InternalServerErrorException (detail = str (e ))
202313
203- @mongo_router .put ("/chat /update_log" , summary = "유저 채팅 업데이트" )
204- async def update_chat_log (request : ChatLog_Update_Request ):
314+ @chatbot_router .put ("/update_log" , summary = "유저 채팅 업데이트" )
315+ async def update_chat_log (request : ChatBot_Update_Request ):
205316 '''
206317 기존 채팅 문서에 유저의 채팅 데이터를 수정합니다.
207318 '''
@@ -210,7 +321,7 @@ async def update_chat_log(request: ChatLog_Update_Request):
210321 request_data = request .model_dump ()
211322 filtered_data = {key : value for key , value in request_data .items () if key != 'id' }
212323
213- response_message = await mongo_handler .update_chatlog_value (
324+ response_message = await mongo_handler .update_chatbot_log (
214325 user_id = request .user_id ,
215326 document_id = request .id ,
216327 new_Data = filtered_data
@@ -224,18 +335,18 @@ async def update_chat_log(request: ChatLog_Update_Request):
224335 raise InternalServerErrorException (detail = str (e ))
225336
226337
227- @mongo_router .post ("/chat/ load_log" , response_model = ChatData_Response , summary = "유저 채팅 불러오기" )
228- async def load_chat_log (request : ChatLog_Identifier_Request ) -> ChatData_Response :
338+ @chatbot_router .post ("/load_log" , response_model = Response , summary = "유저 채팅 불러오기" )
339+ async def load_chat_log (request : Identifier_Request ) -> Response :
229340 '''
230341 생성된 채팅 문서의 채팅 로그를 MongoDB에서 불러옵니다.
231342 '''
232343 try :
233- chat_logs = await mongo_handler .get_chatlog_value (
344+ chat_logs = await mongo_handler .get_chatbot_log (
234345 user_id = request .user_id ,
235346 document_id = request .id
236347
237348 )
238- response_data = ChatData_Response (
349+ response_data = Response (
239350 id = request .id ,
240351 value = chat_logs
241352 )
@@ -247,13 +358,13 @@ async def load_chat_log(request: ChatLog_Identifier_Request) -> ChatData_Respons
247358 except Exception as e :
248359 raise InternalServerErrorException (detail = str (e ))
249360
250- @mongo_router .delete ("/chat /delete_log" , summary = "유저 채팅 일부 지우기" )
251- async def delete_chat_log (request : ChatLog_Delete_Request ):
361+ @chatbot_router .delete ("/delete_log" , summary = "유저 채팅 일부 지우기" )
362+ async def delete_chat_log (request : Log_Delete_Request ):
252363 '''
253364 최신 대화 ~ 선택된 채팅을 로그에서 삭제합니다.
254365 '''
255366 try :
256- response_message = await mongo_handler .remove_chatlog_value (
367+ response_message = await mongo_handler .remove_chatbot_log (
257368 user_id = request .user_id ,
258369 document_id = request .id ,
259370 selected_count = request .index
@@ -266,13 +377,13 @@ async def delete_chat_log(request: ChatLog_Delete_Request):
266377 except Exception as e :
267378 raise InternalServerErrorException (detail = str (e ))
268379
269- @mongo_router .delete ("/chat /delete_room" , summary = "유저 채팅 지우기" )
270- async def delete_chat_room (request : ChatRoom_Delete_Request ):
380+ @chatbot_router .delete ("/delete_room" , summary = "유저 채팅 지우기" )
381+ async def delete_chat_room (request : Room_Delete_Request ):
271382 '''
272383 유저의 채팅방을 삭제합니다.
273384 '''
274385 try :
275- response_message = await mongo_handler .remove_chatroom_value (
386+ response_message = await mongo_handler .remove_chatbot_collection (
276387 user_id = request .user_id ,
277388 document_id = request .id
278389 )
@@ -284,20 +395,18 @@ async def delete_chat_room(request: ChatRoom_Delete_Request):
284395 except Exception as e :
285396 raise InternalServerErrorException (detail = str (e ))
286397
398+ # mongo_router에 세분화된 라우터 추가
399+ mongo_router .include_router (office_router , prefix = "/office" , tags = ["MongoDB Router / Office Router" ])
400+ mongo_router .include_router (chatbot_router , prefix = "/chatbot" , tags = ["MongoDB Router / Chatbot Router" ])
401+
402+ # FastAPI 애플리케이션에 mongo_router를 추가
287403app .include_router (
288404 mongo_router ,
289405 prefix = "/mongo" ,
290406 tags = ["MongoDB Router" ],
291407 responses = {500 : {"description" : "Internal Server Error" }}
292408)
293409
294- @app .get ("/" )
295- async def health_check ():
296- '''
297- 서버의 상태를 확인하는 헬스 체크 엔드포인트입니다.
298- '''
299- return {"Connection" : "Success" }
300-
301410@app .middleware ("http" )
302411async def catch_exceptions_middleware (request : Request , call_next ):
303412 """
0 commit comments