Skip to content

Commit 9fdcb3c

Browse files
authored
Merge pull request #25 from TreeNut-KR/develop
v0.2.0 (Develop 병합)
2 parents 48a7465 + 7b5e92b commit 9fdcb3c

29 files changed

Lines changed: 1107 additions & 172 deletions

File tree

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
gradlew text eol=lf

.github/workflows/build-and-push.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ jobs:
4949
# FastAPI 관련 .env 파일 생성
5050
mkdir -p fastapi/sources
5151
echo "${{ secrets.FASTAPI_ENV }}" > ./fastapi/sources/.env
52-
52+
53+
# springboot 관련 application.properties 파일 생성
54+
mkdir -p ./springboot/src/main/resources
55+
echo "${{ secrets.SPRING_ENV }}" > ./springboot/src/main/resources/application.properties
5356

5457
- name: Build and push Nginx image
5558
uses: docker/build-push-action@v3
@@ -86,3 +89,12 @@ jobs:
8689
tags: |
8790
ghcr.io/treenut-kr/mongodb:latest
8891
ghcr.io/treenut-kr/mongodb:${{ github.ref_name }}
92+
93+
- name: Build and push SpringBoot image
94+
uses: docker/build-push-action@v3
95+
with:
96+
context: ./springboot
97+
push: true
98+
tags: |
99+
ghcr.io/treenut-kr/springboot:latest
100+
ghcr.io/treenut-kr/springboot:${{ github.ref_name }}

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ cython_debug/
191191
# PyCharm
192192

193193

194-
194+
springboot/src/main/resources/application.properties
195195
springboot/gradlew
196196
springboot/HELP.md
197197
springboot/.gradle
@@ -230,3 +230,6 @@ springboot/.nb-gradle/
230230

231231
### VS Code ###
232232
springboot/.vscode/
233+
springboot/gradlew
234+
springboot/.gradle/8.8/fileHashes/fileHashes.bin
235+
springboot/.gradle/8.8/fileHashes/fileHashes.lock

.vscode/settings.json

Lines changed: 0 additions & 3 deletions
This file was deleted.

fastapi/sources/server.py

Lines changed: 162 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
import os
2+
from pydantic import ValidationError
23
from contextlib import asynccontextmanager
34

45
from fastapi.middleware.cors import CORSMiddleware
56
from fastapi.openapi.utils import get_openapi
6-
from pydantic import ValidationError
7+
78
from starlette.middleware.base import BaseHTTPMiddleware
89
from starlette.middleware.sessions import SessionMiddleware
910
from starlette.responses import JSONResponse
11+
1012
from utils.DB_mongo import MongoDBHandler
1113
from 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

2026
from 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-
7378
def 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-
10597
app.openapi = custom_openapi
10698

107-
# MySQL 관련 라우터 정의
108-
mysql_router = APIRouter()
99+
mysql_router = APIRouter() # MySQL 관련 라우터 정의
109100

110101
@mysql_router.get("/tables", summary="테이블 목록 가져오기")
111102
async 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="데이터베이스 목록 가져오기")
148138
async 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를 추가
287403
app.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")
302411
async def catch_exceptions_middleware(request: Request, call_next):
303412
"""

0 commit comments

Comments
 (0)