⚒️ 重大重构 LoveACE V2
引入了 mongodb 对数据库进行了一定程度的数据加密 性能改善 代码简化 统一错误模型和响应 使用 apifox 作为文档
This commit is contained in:
97
loveace/router/endpoint/jwc/exam.py
Normal file
97
loveace/router/endpoint/jwc/exam.py
Normal file
@@ -0,0 +1,97 @@
|
||||
from datetime import datetime
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
from fastapi.responses import JSONResponse
|
||||
from pydantic import ValidationError
|
||||
|
||||
from loveace.router.endpoint.jwc.academic import get_academic_info
|
||||
from loveace.router.endpoint.jwc.model.academic import AcademicInfo
|
||||
from loveace.router.endpoint.jwc.model.exam import ExamInfoResponse
|
||||
from loveace.router.endpoint.jwc.utils.exam import fetch_unified_exam_info
|
||||
from loveace.router.schemas.error import ProtectRouterErrorToCode
|
||||
from loveace.router.schemas.uniresponse import UniResponseModel
|
||||
from loveace.service.remote.aufe import AUFEConnection
|
||||
from loveace.service.remote.aufe.depends import get_aufe_conn
|
||||
|
||||
jwc_exam_router = APIRouter(
|
||||
prefix="/exam",
|
||||
responses=ProtectRouterErrorToCode().gen_code_table(),
|
||||
)
|
||||
|
||||
|
||||
@jwc_exam_router.get(
|
||||
"/info", response_model=UniResponseModel[ExamInfoResponse], summary="获取考试信息"
|
||||
)
|
||||
async def get_exam_info(
|
||||
conn: AUFEConnection = Depends(get_aufe_conn),
|
||||
) -> UniResponseModel[ExamInfoResponse] | JSONResponse:
|
||||
"""
|
||||
获取用户的考试信息
|
||||
|
||||
✅ 功能特性:
|
||||
- 获取当前学期的考试安排
|
||||
- 自动确定考试时间范围
|
||||
- 显示考试时间、地点、课程等信息
|
||||
|
||||
💡 使用场景:
|
||||
- 查看即将进行的考试
|
||||
- 了解考试安排和地点
|
||||
- 提前规划复习计划
|
||||
|
||||
Returns:
|
||||
ExamInfoResponse: 包含考试列表和总数
|
||||
"""
|
||||
try:
|
||||
academic_info = await get_academic_info(conn)
|
||||
if isinstance(academic_info, UniResponseModel):
|
||||
if academic_info.data and isinstance(academic_info.data, AcademicInfo):
|
||||
term_code = academic_info.data.current_term
|
||||
else:
|
||||
result = ExamInfoResponse(exams=[], total_count=0)
|
||||
return UniResponseModel[ExamInfoResponse](
|
||||
success=False,
|
||||
data=result,
|
||||
message="无法获取学期信息",
|
||||
error=None,
|
||||
)
|
||||
elif isinstance(academic_info, AcademicInfo):
|
||||
term_code = academic_info.current_term
|
||||
else:
|
||||
result = ExamInfoResponse(exams=[], total_count=0)
|
||||
return UniResponseModel[ExamInfoResponse](
|
||||
success=False,
|
||||
data=result,
|
||||
message="无法获取学期信息",
|
||||
error=None,
|
||||
)
|
||||
conn.logger.info(f"获取用户 {conn.userid} 的考试信息")
|
||||
|
||||
start_date = datetime.now()
|
||||
# termcode 结尾为 1 为秋季学期,考试应在3月之前,2为春季学期,考试应在9月之前
|
||||
end_date = datetime(
|
||||
year=start_date.year + (1 if term_code.endswith("1") else 0),
|
||||
month=3 if term_code.endswith("1") else 9,
|
||||
day=30,
|
||||
)
|
||||
exam_info = await fetch_unified_exam_info(
|
||||
conn,
|
||||
start_date=start_date.strftime("%Y-%m-%d"),
|
||||
end_date=end_date.strftime("%Y-%m-%d"),
|
||||
term_code=term_code,
|
||||
)
|
||||
return UniResponseModel[ExamInfoResponse](
|
||||
success=True,
|
||||
data=exam_info,
|
||||
message="获取考试信息成功",
|
||||
error=None,
|
||||
)
|
||||
except ValidationError as e:
|
||||
conn.logger.error(f"用户 {conn.userid} 的考试信息数据验证失败: {e}")
|
||||
return ProtectRouterErrorToCode().validation_error.to_json_response(
|
||||
conn.logger.trace_id
|
||||
)
|
||||
except Exception as e:
|
||||
conn.logger.error(f"用户 {conn.userid} 的考试信息获取失败: {e}")
|
||||
return ProtectRouterErrorToCode().server_error.to_json_response(
|
||||
conn.logger.trace_id
|
||||
)
|
||||
Reference in New Issue
Block a user