-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathprofessor.py
More file actions
135 lines (118 loc) · 6.4 KB
/
Copy pathprofessor.py
File metadata and controls
135 lines (118 loc) · 6.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""
CodeCraft PMS Backend Project
파일명 : professor.py
생성자 : 김창환
생성일 : 2025/03/17
업데이트 : 2025/03/17
설명 : 교수 계정 관련 엔드포인트
"""
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from logger import logger
import sys, os, random, string, logging
sys.path.append(os.path.abspath('/data/Database Project')) # Database Project와 연동하기 위해 사용
import project_DB
import account_DB
router = APIRouter()
class Signin_Payload(BaseModel):
id: str
pw: str
class Token_Payload(BaseModel):
token: str
class Checksession_Payload(BaseModel):
user_id: str
token: str
class Profnum_Payload(BaseModel):
f_no: int
def generate_token():
"""랜덤한 15자리 토큰 생성"""
characters = string.ascii_letters + string.digits + string.punctuation
return ''.join(random.choices(characters, k=15))
@router.post("/prof/checksession")
async def api_prof_check_session(payload: Checksession_Payload):
"""세션 유효성 확인"""
try:
is_valid = account_DB.validate_professor_token(payload.user_id, payload.token)
if isinstance(is_valid, Exception):
logger.error(f"Invalid session for professor {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 professor {payload.user_id}")
return {"RESULT_CODE": 200, "RESULT_MSG": "Session valid"}
logger.warning(f"Invalid session token for professor {payload.user_id}")
raise HTTPException(status_code=401, detail="Invalid session token")
except Exception as e:
#logger.error(f"Unexpected error validating session for professor {payload.user_id}: {str(e)}", exc_info=True) # 로그 가시성 하락으로 인한 임시 비활성화 (25.03.25)
raise HTTPException(status_code=500, detail=f"Unexpected error validating session: {str(e)}")
@router.post("/prof/signin")
async def api_prof_signin_post(payload: Signin_Payload):
"""사용자 로그인"""
try:
f_no = account_DB.validate_professor(payload.id, payload.pw)
if f_no is None:
logger.warning(f"Invalid login attempt: {payload.id}")
raise HTTPException(status_code=401, detail="Invalid credentials")
if isinstance(f_no, Exception):
logger.error(f"Internal error during validation: {str(f_no)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Internal error during validation: {str(f_no)}")
token = generate_token()
save_result = account_DB.save_signin_professor_token(payload.id, token)
if isinstance(save_result, Exception):
logger.error(f"Error saving session token for professor {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",
"PAYLOADS": {
"Result": save_result
}
}
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("/prof/signout")
async def api_prof_signout_post(payload: Token_Payload):
"""사용자 로그아웃"""
try:
result = account_DB.signout_professor(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("Professor logged out successfully")
return {"RESULT_CODE": 200, "RESULT_MSG": "Logout successful"}
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("/prof/check_acc")
async def api_prof_check_account_type(payload: Token_Payload):
"""이 계정이 학생인지 교수인지 확인하는 함수"""
try:
result = account_DB.check_user_type(payload.token)
if isinstance(result, Exception):
logger.info(f"function api_prof_check_account_type failed: {str(result)}")
raise HTTPException(status_code=500, detail=f"check_acc failed")
elif result == 0:
logger.warning(f"function waring api_prof_check_account_type: Token {payload.token} isn't found in the database.")
raise HTTPException(status_code=404, detail=f"Token {payload.token} isn't found in the database.")
return {"RESULT_CODE": 200, "RESULT_MSG": "Check Successful.", "PAYLOAD": {"Result": result}}
except Exception as e:
logger.error(f"Error while check account token {payload.token}: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unexpected error in check token operation: {str(e)}")
@router.post("/prof/load_project")
async def api_prof_load_project_info(payload: Profnum_Payload):
"""교수용 프로젝트 로드 함수"""
try:
result = project_DB.fetch_project_info_for_professor(payload.f_no)
if isinstance(result, Exception):
logger.info(f"function api_prof_load_project_info failed: {str(result)}")
raise HTTPException(status_code=500, detail=f"load_project failed")
return {"RESULT_CODE": 200, "RESULT_MSG": "Check Successful.", "PAYLOAD": {"Result": result}}
except Exception as e:
logger.error(f"Error while load project {payload.f_no}: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Unexpected error in load project operation: {str(e)}")