Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 60 additions & 33 deletions app/api/chat_tab_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

from app.core.response import ResponseMessage
from app.core.status import CommonCode
from app.schemas.chat_tab.create_model import ChatTabCreate
from app.schemas.chat_tab.response_model import ChatTabResponse
from app.schemas.chat_tab.base_model import ChatTabBase
from app.schemas.chat_tab.response_model import ChatMessagesResponse, ChatTabResponse
from app.schemas.chat_tab.update_model import ChatTabUpdate
from app.services.chat_tab_service import ChatTabService, chat_tab_service

Expand All @@ -13,13 +13,13 @@


@router.post(
"/actions",
"/create",
response_model=ResponseMessage[ChatTabResponse],
summary="Chat Tab 생성",
summary="새로운 Chat Tab 생성",
description="새로운 Chat Tab을 생성하여 로컬 데이터베이스에 저장합니다.",
)
def store_chat_tab(
chatName: ChatTabCreate, service: ChatTabService = chat_tab_service_dependency
chatName: ChatTabBase, service: ChatTabService = chat_tab_service_dependency
) -> ResponseMessage[ChatTabResponse]:
"""
- **name**: 새로운 Chat_tab 이름 (예: "채팅 타이틀")
Expand All @@ -34,6 +34,57 @@ def store_chat_tab(
)
return ResponseMessage.success(value=response_data, code=CommonCode.SUCCESS_CHAT_TAB_CREATE)


@router.get(
"/find",
response_model=ResponseMessage[list[ChatTabResponse]],
summary="저장된 모든 Chat_tab 정보 조회",
description="""
chat_tab 테이블에 저장된 모든 chat tab들을 확인합니다.
""",
)
def get_all_chat_tab(
service: ChatTabService = chat_tab_service_dependency,
) -> ResponseMessage[list[ChatTabResponse]]:
"""저장된 모든 chat_tab의 메타데이터를 조회하여 등록 여부를 확인합니다."""
chat_tabs_in_db = service.get_all_chat_tab()

response_data = [
ChatTabResponse(
id=chat_tab.id,
name=chat_tab.name,
created_at=chat_tab.created_at,
updated_at=chat_tab.updated_at,
)
for chat_tab in chat_tabs_in_db
]
return ResponseMessage.success(value=response_data, code=CommonCode.SUCCESS_GET_CHAT_TAB)


@router.get(
"/find/{tabId}",
response_model=ResponseMessage[ChatMessagesResponse],
summary="특정 탭의 메시지 전체 조회",
)
def get_chat_messages_by_tabId(
tabId: str = Path(..., description="채팅 탭 고유 ID"), service: ChatTabService = chat_tab_service_dependency
) -> ResponseMessage[list[ChatMessagesResponse]]:
"""tabId를 기준으로 해당 chat_tab의 전체 메시지를 가져옵니다."""
chat_tab = service.get_chat_tab_by_tabId(tabId)

chat_messages = service.get_chat_messages_by_tabId(tabId)

response_data = ChatMessagesResponse(
id=chat_tab.id,
name=chat_tab.name,
created_at=chat_tab.created_at,
updated_at=chat_tab.updated_at,
messages=chat_messages,
)

return ResponseMessage.success(value=response_data, code=CommonCode.SUCCESS_GET_CHAT_MESSAGES)


@router.put(
"/modify/{tabId}",
response_model=ResponseMessage[ChatTabResponse],
Expand All @@ -42,7 +93,7 @@ def store_chat_tab(
def updated_chat_tab(
chatName: ChatTabUpdate,
tabId: str = Path(..., description="수정할 채팅 탭의 고유 ID"),
service: ChatTabService = chat_tab_service_dependency
service: ChatTabService = chat_tab_service_dependency,
) -> ResponseMessage[ChatTabResponse]:
"""
채팅 탭 ID를 기준으로 채팅 탭의 이름을 새로운 값으로 수정합니다.
Expand All @@ -60,43 +111,19 @@ def updated_chat_tab(

return ResponseMessage.success(value=response_data, code=CommonCode.SUCCESS_CHAT_TAB_UPDATE)


@router.delete(
"/remove/{tabId}",
response_model=ResponseMessage,
summary="특정 Chat Tab 삭제",
)
def delete_chat_tab(
tabId: str = Path(..., description="수정할 채팅 탭의 고유 ID"),
service: ChatTabService = chat_tab_service_dependency
tabId: str = Path(..., description="수정할 채팅 탭의 고유 ID"),
service: ChatTabService = chat_tab_service_dependency,
) -> ResponseMessage:
"""
채팅 탭 ID를 기준으로 채팅 탭을 삭제합니다.
- **id**: 삭제할 채팅 탭 ID
"""
service.delete_chat_tab(tabId)
return ResponseMessage.success(code=CommonCode.SUCCESS_CHAT_TAB_DELETE)

@router.get(
"/result",
response_model=ResponseMessage[list[ChatTabResponse]],
summary="저장된 모든 Chat_tab 정보 조회",
description="""
chat_tab 테이블에 저장된 모든 chat tab들을 확인합니다.
""",
)
def get_all_chat_tab(
service: ChatTabService = chat_tab_service_dependency,
) -> ResponseMessage[list[ChatTabResponse]]:
"""저장된 모든 chat_tab의 메타데이터를 조회하여 등록 여부를 확인합니다."""
chat_tabs_in_db = service.get_all_chat_tab()

response_data = [
ChatTabResponse(
id=chat_tab.id,
name=chat_tab.name,
created_at=chat_tab.created_at,
updated_at=chat_tab.updated_at,
)
for chat_tab in chat_tabs_in_db
]
return ResponseMessage.success(value=response_data, code=CommonCode.SUCCESS_GET_CHAT_TAB)
47 changes: 19 additions & 28 deletions app/api/user_db_api.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# app/api/user_db_api.py


from fastapi import APIRouter, Depends
from typing import List

from app.core.exceptions import APIException
from app.core.response import ResponseMessage
from app.schemas.user_db.db_profile_model import DBProfileInfo, UpdateOrCreateDBProfile
from app.schemas.user_db.result_model import ColumnInfo, DBProfile
from app.services.user_db_service import UserDbService, user_db_service
from app.schemas.user_db.result_model import DBProfile, ColumnInfo

user_db_service_dependency = Depends(lambda: user_db_service)

Expand All @@ -23,14 +23,14 @@ def connection_test(
db_info: DBProfileInfo,
service: UserDbService = user_db_service_dependency,
) -> ResponseMessage[bool]:

db_info.validate_required_fields()
result = service.connection_test(db_info)

if not result.is_successful:
raise APIException(result.code)
return ResponseMessage.success(value=result.is_successful, code=result.code)


@router.post(
"/create/profile",
response_model=ResponseMessage[str],
Expand All @@ -40,14 +40,14 @@ def create_profile(
create_db_info: UpdateOrCreateDBProfile,
service: UserDbService = user_db_service_dependency,
) -> ResponseMessage[str]:

create_db_info.validate_required_fields()
result = service.create_profile(create_db_info)

if not result.is_successful:
raise APIException(result.code)
return ResponseMessage.success(value=result.view_name, code=result.code)


@router.put(
"/modify/profile",
response_model=ResponseMessage[str],
Expand All @@ -57,14 +57,14 @@ def update_profile(
update_db_info: UpdateOrCreateDBProfile,
service: UserDbService = user_db_service_dependency,
) -> ResponseMessage[str]:

update_db_info.validate_required_fields()
result = service.update_profile(update_db_info)

if not result.is_successful:
raise APIException(result.code)
return ResponseMessage.success(value=result.view_name, code=result.code)


@router.delete(
"/remove/{profile_id}",
response_model=ResponseMessage[str],
Expand All @@ -74,75 +74,66 @@ def delete_profile(
profile_id: str,
service: UserDbService = user_db_service_dependency,
) -> ResponseMessage[str]:

result = service.delete_profile(profile_id)

if not result.is_successful:
raise APIException(result.code)
return ResponseMessage.success(value=result.view_name, code=result.code)


@router.get(
"/find/all",
response_model=ResponseMessage[List[DBProfile]],
response_model=ResponseMessage[list[DBProfile]],
summary="DB 프로필 전체 조회",
)
def find_all_profile(
service: UserDbService = user_db_service_dependency,
) -> ResponseMessage[List[DBProfile]]:

) -> ResponseMessage[list[DBProfile]]:
result = service.find_all_profile()

if not result.is_successful:
raise APIException(result.code)
return ResponseMessage.success(value=result.profiles, code=result.code)


@router.get(
"/find/schemas/{profile_id}",
response_model=ResponseMessage[List[str]],
response_model=ResponseMessage[list[str]],
summary="특정 DB의 전체 스키마 조회",
)
def find_schemas(
profile_id: str,
service: UserDbService = user_db_service_dependency
) -> ResponseMessage[List[str]]:

def find_schemas(profile_id: str, service: UserDbService = user_db_service_dependency) -> ResponseMessage[list[str]]:
db_info = service.find_profile(profile_id)
result = service.find_schemas(db_info)

if not result.is_successful:
raise APIException(result.code)
return ResponseMessage.success(value=result.schemas, code=result.code)


@router.get(
"/find/tables/{profile_id}/{schema_name}",
response_model=ResponseMessage[List[str]],
response_model=ResponseMessage[list[str]],
summary="특정 스키마의 전체 테이블 조회",
)
def find_tables(
profile_id: str,
schema_name: str,
service: UserDbService = user_db_service_dependency
) -> ResponseMessage[List[str]]:

profile_id: str, schema_name: str, service: UserDbService = user_db_service_dependency
) -> ResponseMessage[list[str]]:
db_info = service.find_profile(profile_id)
result = service.find_tables(db_info, schema_name)

if not result.is_successful:
raise APIException(result.code)
return ResponseMessage.success(value=result.tables, code=result.code)


@router.get(
"/find/columns/{profile_id}/{schema_name}/{table_name}",
response_model=ResponseMessage[List[ColumnInfo]],
response_model=ResponseMessage[list[ColumnInfo]],
summary="특정 테이블의 전체 컬럼 조회",
)
def find_columns(
profile_id: str,
schema_name: str,
table_name: str,
service: UserDbService = user_db_service_dependency
) -> ResponseMessage[List[ColumnInfo]]:

profile_id: str, schema_name: str, table_name: str, service: UserDbService = user_db_service_dependency
) -> ResponseMessage[list[ColumnInfo]]:
db_info = service.find_profile(profile_id)
result = service.find_columns(db_info, schema_name, table_name)

Expand Down
4 changes: 2 additions & 2 deletions app/core/all_logging.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# app/core/all_logging.py

import logging

from fastapi import Request

# 로깅 기본 설정 (애플리케이션 시작 시 한 번만 구성)
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s", # [수정] 로그 레벨(INFO, ERROR)을 포함
format="%(asctime)s - %(levelname)s - %(message)s", # [수정] 로그 레벨(INFO, ERROR)을 포함
datefmt="%Y-%m-%d %H:%M:%S",
)

Expand All @@ -30,4 +31,3 @@ async def log_requests_middleware(request: Request, call_next):
logging.error(f"ERROR 엔드포인트: {endpoint}", exc_info=True)
# 예외를 다시 발생시켜 FastAPI의 전역 예외 처리기가 최종 응답을 만들도록 합니다.
raise e

2 changes: 1 addition & 1 deletion app/core/enum/db_key_prefix_name.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ class DBSaveIdEnum(Enum):
user_db = "USER-DB"
driver = "DRIVER"
api_key = "API-KEY"
chat_tab = "CHAT_TAB"
chat_tab = "CHAT-TAB"
4 changes: 3 additions & 1 deletion app/core/status.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ class CommonCode(Enum):
SUCCESS_UPDATE_PROFILE = (status.HTTP_200_OK, "2150", "디비 연결 정보를 업데이트 하였습니다.")
SUCCESS_DELETE_PROFILE = (status.HTTP_200_OK, "2170", "디비 연결 정보를 삭제 하였습니다.")


""" KEY 성공 코드 - 22xx """
SUCCESS_DELETE_API_KEY = (status.HTTP_204_NO_CONTENT, "2200", "API KEY가 성공적으로 삭제되었습니다.")
SUCCESS_UPDATE_API_KEY = (status.HTTP_200_OK, "2201", "API KEY가 성공적으로 수정되었습니다.")
Expand All @@ -39,6 +38,7 @@ class CommonCode(Enum):
SUCCESS_CHAT_TAB_UPDATE = (status.HTTP_200_OK, "2301", "채팅 탭 이름이 성공적으로 수정되었습니다.")
SUCCESS_CHAT_TAB_DELETE = (status.HTTP_200_OK, "2302", "채팅 탭을 성공적으로 삭제되었습니다.")
SUCCESS_GET_CHAT_TAB = (status.HTTP_200_OK, "2303", "모든 채팅 탭을 성공적으로 조회하였습니다.")
SUCCESS_GET_CHAT_MESSAGES = (status.HTTP_200_OK, "2304", "채팅 탭의 모든 메시지를 성공적으로 불러왔습니다.")

""" ANNOTATION 성공 코드 - 24xx """

Expand Down Expand Up @@ -78,6 +78,8 @@ class CommonCode(Enum):
"채팅 탭 이름에 SQL 예약어나 허용되지 않는 특수문자가 포함되어 있습니다. "
"허용되지 않는 특수 문자: 큰따옴표(\"), 작은따옴표('), 세미콜론(;), 꺾쇠괄호(<, >)",
)
INVALID_CHAT_TAB_ID_FORMAT = (status.HTTP_400_BAD_REQUEST, "4303", "채팅 탭 ID의 형식이 올바르지 않습니다.")
NO_CHAT_TAB_DATA = (status.HTTP_404_NOT_FOUND, "4304", "해당 ID를 가진 채팅 탭을 찾을 수 없습니다.")

""" ANNOTATION 클라이언트 에러 코드 - 44xx """

Expand Down
4 changes: 3 additions & 1 deletion app/core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
# 앱 데이터를 저장할 폴더 이름
APP_DATA_DIR_NAME = ".qgenie"


def get_db_path() -> Path:
"""
사용자 홈 디렉터리 내에 앱 데이터 폴더를 만들고,
Expand All @@ -15,9 +16,10 @@ def get_db_path() -> Path:
db_path = app_data_dir / "local_storage.sqlite"
return db_path


def generate_uuid() -> str:
return uuid.uuid4().hex.upper()


def generate_prefixed_uuid(prefix: str) -> str:
return f"{prefix.upper()}-{uuid.uuid4().hex.upper()}"

Loading