Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
d46e345
edit project.py; add api_project_find_professor func
kimch0612 Feb 26, 2025
8dcf95e
Merge branch 'master' of https://github.com/kimch0612/Backend
kimch0612 Feb 26, 2025
9969f0f
edit logger.py; add uvicorn log policy
kimch0612 Feb 27, 2025
8f07d56
edit logger.py; add uvicorn log policy
kimch0612 Feb 27, 2025
6769bd3
edit account.py; add functions
kimch0612 Mar 7, 2025
cc4c2c4
edit project.py; 프로젝트 삭제 기능에 logger 기능 추가
kimch0612 Mar 7, 2025
dc97c74
edit project.py; add logger func
kimch0612 Mar 7, 2025
c25477b
edit project.py; add logger func
kimch0612 Mar 7, 2025
e04d71a
edit main.py; add logger func
kimch0612 Mar 7, 2025
bbdbd31
edit main.py; add logger func
kimch0612 Mar 7, 2025
c4b9169
edit main.py; add logger func
kimch0612 Mar 7, 2025
c76c2de
edit main.py; add logger func
kimch0612 Mar 7, 2025
a0ed45c
edit account.py; add logger functions
kimch0612 Mar 7, 2025
f0721e2
edit account.py; add logger functions
kimch0612 Mar 7, 2025
d68014f
edit ccp.py; add logger functions
kimch0612 Mar 7, 2025
5782df3
edit push.py; add logger functions
kimch0612 Mar 7, 2025
aa488b6
edit subject.py; add logger functions
kimch0612 Mar 7, 2025
89e0962
edit task.py; add logger functions
kimch0612 Mar 7, 2025
bb1d261
edit grade.py; add logger functions
kimch0612 Mar 7, 2025
0a5cd4e
edit ccp.py; csv 파일 업로드 기능 누락 해결
kimch0612 Mar 7, 2025
ab6701c
Edit output.py; fix variable name
kimch0612 Mar 8, 2025
6613991
Edit llm.py; edit interact func
kimch0612 Mar 11, 2025
3b888ac
Edit llm.py; 불필요한 내용 제거
kimch0612 Mar 11, 2025
44da999
Edit llm.py; edit prompt_init
kimch0612 Mar 11, 2025
5d482ff
edit functions; add llm data, edit upload other output files
kimch0612 Mar 16, 2025
1d9acf9
edit output.py; add logger
kimch0612 Mar 16, 2025
d072851
edit output.py; add retry option
kimch0612 Mar 16, 2025
8e02a9a
add professor.py
kimch0612 Mar 17, 2025
1d31f75
Edit project.py; edit api_project_load func
kimch0612 Mar 17, 2025
8e208aa
Edit professor.py; add functions
kimch0612 Mar 17, 2025
091ee02
Edit professor.py; add functions
kimch0612 Mar 17, 2025
f10a5b4
edit main.py; add professor router
kimch0612 Mar 17, 2025
3aa7009
edit professor.py; add professor router
kimch0612 Mar 17, 2025
81f1710
Edit professor.py; edit function name
kimch0612 Mar 17, 2025
7ac1d15
edit llm.py; add menu function
kimch0612 Mar 17, 2025
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
117 changes: 78 additions & 39 deletions account.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
생성자 : 김창환

생성일 : 2024/10/16
업데이트 : 2025/02/24
업데이트 : 2025/03/08

설명 : 계정 생성, 로그인, 세션 관리를 위한 API 엔드포인트 정의
"""
Expand Down Expand Up @@ -58,8 +58,9 @@ class PwReset_Payload(BaseModel):
class FineName_Payload(BaseModel):
univ_id: int

class FindProf_Payload(BaseModel):
department: int
class LoadProfPayload(BaseModel):
subj_no: int


def generate_token():
"""랜덤한 15자리 토큰 생성"""
Expand All @@ -73,12 +74,15 @@ async def check_session(payload: Checksession_Payload):
try:
is_valid = account_DB.validate_user_token(payload.user_id, payload.token)
if isinstance(is_valid, Exception):
logger.error(f"Invalid session for user {payload.user_id}: {str(is_valid)}", exc_info=True)
raise HTTPException(status_code=401, detail=f"Invalid session: {str(is_valid)}")
if is_valid:
logger.info(f"Session valid for user {payload.user_id}")
return {"RESULT_CODE": 200, "RESULT_MSG": "Session valid"}
logger.warning(f"Invalid session token for user {payload.user_id}")
raise HTTPException(status_code=401, detail="Invalid session token")
except Exception as e:
logger.debug(f"Error validating session: {str(e)}")
logger.error(f"Unexpected error validating session for user {payload.user_id}: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unexpected error validating session: {str(e)}")


Expand All @@ -89,31 +93,35 @@ async def api_acc_signup_post(payload: SignUp_Payload):
token = generate_token()
result = account_DB.insert_user(payload, token)
if result is True:
logger.info(f"User {payload.univ_id} signed up successfully")
return {"RESULT_CODE": 200, "RESULT_MSG": "Signup successful", "PAYLOADS": {"Token": token}}
elif isinstance(result, tuple) and result[0] == 1062:
if isinstance(result, tuple) and result[0] == 1062:
logger.warning(f"Duplicate signup attempt: {payload.univ_id} is already registered")
return {"RESULT_CODE": 409, "RESULT_MSG": "Duplicate entry: This univ_id is already registered"}
else:
# print(result)
raise HTTPException(status_code=500, detail=f"Error during signup: {str(result)}")
logger.error(f"Unexpected signup error: {str(result)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Error during signup: {str(result)}")
except Exception as e:
if "1062" in str(e):
return {"RESULT_CODE": 409, "RESULT_MSG": "Duplicate entry: This univ_id is already registered"}
else:
raise HTTPException(status_code=500, detail=f"Unhandled exception during signup: {str(e)}")
logger.error(f"Unhandled exception during signup: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unhandled exception during signup: {str(e)}")


@router.post("/acc/signin")
async def api_acc_signin_post(payload: Signin_Payload):
"""사용자 로그인"""
try:
s_no = account_DB.validate_user(payload.id, payload.pw)
if s_no is None: # 로그인 실패 처리
if s_no is None:
logger.warning(f"Invalid login attempt: {payload.id}")
raise HTTPException(status_code=401, detail="Invalid credentials")
if isinstance(s_no, Exception): # 예외 발생 처리
if isinstance(s_no, Exception):
logger.error(f"Internal error during validation: {str(s_no)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Internal error during validation: {str(s_no)}")
token = generate_token()
save_result = account_DB.save_signin_user_token(payload.id, token)
if isinstance(save_result, Exception): # 토큰 저장 중 오류 처리
if isinstance(save_result, Exception):
logger.error(f"Error saving session token for user {payload.id}: {str(save_result)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Error saving session token: {str(save_result)}")
logger.info(f"User {payload.id} signed in successfully")
return {
"RESULT_CODE": 200,
"RESULT_MSG": "Login successful",
Expand All @@ -125,6 +133,7 @@ async def api_acc_signin_post(payload: Signin_Payload):
except HTTPException as http_err:
raise http_err
except Exception as e:
logger.error(f"Unhandled exception during login for user {payload.id}: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unhandled exception during login: {str(e)}")

@router.post("/acc/signout")
Expand All @@ -133,12 +142,15 @@ async def api_acc_signout_post(payload: SignOut_Payload):
try:
result = account_DB.signout_user(payload.token)
if isinstance(result, Exception):
logger.error(f"Error during logout: {str(result)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Error during logout: {str(result)}")
if result is True:
logger.info("User logged out successfully")
return {"RESULT_CODE": 200, "RESULT_MSG": "Logout successful"}
else:
raise HTTPException(status_code=500, detail="Logout failed")
logger.warning("Logout failed")
raise HTTPException(status_code=500, detail="Logout failed")
except Exception as e:
logger.error(f"Unhandled exception during logout: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unhandled exception during logout: {str(e)}")

@router.post("/acc/delacc")
Expand All @@ -147,12 +159,15 @@ async def api_acc_delacc_post(payload: DelAcc_Payload):
try:
result = account_DB.delete_user(payload.id)
if isinstance(result, Exception):
logger.error(f"Error during account deletion: {str(result)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Error during account deletion: {str(result)}")
if result is True:
logger.info(f"Account {payload.id} deleted successfully")
return {"RESULT_CODE": 200, "RESULT_MSG": "Account deleted successfully"}
else:
raise HTTPException(status_code=500, detail="Account deletion failed")
logger.warning(f"Account deletion failed for {payload.id}")
raise HTTPException(status_code=500, detail="Account deletion failed")
except Exception as e:
logger.error(f"Unhandled exception during account deletion: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unhandled exception during account deletion: {str(e)}")

@router.post("/acc/checkacc")
Expand All @@ -164,48 +179,72 @@ async def api_acc_check(payload: AccCheck_Payload):
"""
try:
result = account_DB.find_user_pw(
univ_id = payload.univ_id,
name = payload.name,
email = payload.email,
id = payload.user_id
univ_id=payload.univ_id,
name=payload.name,
email=payload.email,
id=payload.user_id
)
if result is True:
logger.info(f"Account validation successful for user {payload.user_id}")
return {"RESULT_CODE": 200, "RESULT_MSG": "OK"}
else:
# raise HTTPException(status_code=500, detail="Account validation failed")
return {"RESULT_CODE": 400, "RESULT_MSG": "Account validation failed"}
logger.warning(f"Account validation failed for user {payload.user_id}")
return {"RESULT_CODE": 400, "RESULT_MSG": "Account validation failed"}
except Exception as e:
logger.error(f"Unhandled exception during account validation for user {payload.user_id}: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unhandled exception during account validation: {str(e)}")

@router.post("/acc/resetpw")
async def api_acc_pwreset(payload: PwReset_Payload):
"""비밀번호 리셋(변경) 함수"""
try:
result = account_DB.edit_user_pw(
payload.univ_id,
payload.pw
)
result = account_DB.edit_user_pw(payload.univ_id, payload.pw)
if result is True:
logger.info(f"Password reset successful for user {payload.univ_id}")
return {"RESULT_CODE": 200, "RESULT_MSG": "OK"}
else:
# raise HTTPException(status_code=500, detail="Password update failed")
return {"RESULT_CODE": 400, "RESULT_MSG": "Password update failed"}
logger.warning(f"Password update failed for user {payload.univ_id}")
return {"RESULT_CODE": 400, "RESULT_MSG": "Password update failed"}
except Exception as e:
logger.error(f"Unhandled exception while updating password for user {payload.univ_id}: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unhandled exception while updating password: {str(e)}")

@router.post("/acc/find_sname")
async def api_acc_find_student_name(payload: FineName_Payload):
"""학번으로 학생 이름을 찾는 기능"""
try:
result = account_DB.fetch_student_name(payload.univ_id)
if isinstance(result, Exception) or result == None:
if isinstance(result, Exception) or result is None:
logger.error(f"Error in find student name operation for univ_id {payload.univ_id}: {str(result)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Error in find student name Operation: {str(result)}")
logger.info(f"Student name found for univ_id {payload.univ_id}: {result}")
return {"RESULT_CODE": 200, "RESULT_MSG": "Find Successful.", "PAYLOAD": {"Result": result}}
except Exception as e:
logger.debug(f"Error in find student name Operation: {str(e)}")
logger.error(f"Unexpected error in find student name operation for univ_id {payload.univ_id}: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unexpected error in find student name Operation: {str(e)}")

# @router.post("/acc/find_prof") # 미사용 주석처리 (25.02.15)
# async def api_acc_find_professor(payload: FindProf_Payload):
# """자신의 학과에 속한 교수 리스트를 불러오는 기능"""
# return
@router.post("/acc/load_dept")
async def api_acc_load_department():
"""모든 학과를 조회하는 기능"""
try:
result = account_DB.fetch_dept_list()
if isinstance(result, Exception):
logger.error(f"Error in load dept operation: {str(result)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Error in load dept Operation: {str(result)}")
logger.info("Department list retrieved successfully")
return {"RESULT_CODE": 200, "RESULT_MSG": "Load Successful.", "PAYLOAD": {"Result": result}}
except Exception as e:
logger.error(f"Unexpected error in load dept operation: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unexpected error in load dept Operation: {str(e)}")

@router.post("/acc/load_prof")
async def api_acc_load_professor_by_subject(payload: LoadProfPayload):
"""특정 교과목이 속한 학과의 교수 리스트를 불러오는 기능"""
try:
result = account_DB.fetch_professor_list_by_subject(payload.subj_no)
if isinstance(result, Exception):
logger.error(f"Error in load professor operation for subject {payload.subj_no}: {str(result)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Error in load professor operation: {str(result)}")
logger.info(f"Professor list retrieved successfully for subject {payload.subj_no}")
return {"RESULT_CODE": 200, "RESULT_MSG": "Load Successful.", "PAYLOAD": {"Result": result}}
except Exception as e:
logger.error(f"Unexpected error in load professor operation for subject {payload.subj_no}: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unexpected error in load professor operation: {str(e)}")
Loading