Initial commit: AI Interview System
This commit is contained in:
83
backend/app/routers/candidate.py
Normal file
83
backend/app/routers/candidate.py
Normal file
@@ -0,0 +1,83 @@
|
||||
"""
|
||||
候选人相关接口
|
||||
"""
|
||||
import time
|
||||
import uuid
|
||||
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
|
||||
from loguru import logger
|
||||
|
||||
from app.schemas import ApiResponse, SubmitCandidateResponse
|
||||
from app.services.coze_service import coze_service
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
def generate_session_id(name: str) -> str:
|
||||
"""生成会话 ID"""
|
||||
timestamp = int(time.time())
|
||||
random_code = uuid.uuid4().hex[:6]
|
||||
return f"SESS_{timestamp}_{name}_{random_code}"
|
||||
|
||||
|
||||
@router.post("/candidates", response_model=ApiResponse)
|
||||
async def submit_candidate(
|
||||
name: str = Form(..., min_length=2, max_length=20, description="候选人姓名"),
|
||||
resume: UploadFile = File(..., description="简历文件"),
|
||||
):
|
||||
"""
|
||||
提交候选人信息(上传简历)
|
||||
|
||||
- 上传简历到 Coze
|
||||
- 生成 session_id
|
||||
- 返回 session_id 和 file_id
|
||||
"""
|
||||
try:
|
||||
# 验证文件类型
|
||||
allowed_types = [
|
||||
"application/pdf",
|
||||
"application/msword",
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
]
|
||||
if resume.content_type not in allowed_types:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="只支持 PDF、DOC、DOCX 格式的文件"
|
||||
)
|
||||
|
||||
# 验证文件大小(10MB)
|
||||
content = await resume.read()
|
||||
if len(content) > 10 * 1024 * 1024:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="文件大小不能超过 10MB"
|
||||
)
|
||||
|
||||
# 上传文件到 Coze
|
||||
file_result = await coze_service.upload_file(content, resume.filename or "resume.pdf")
|
||||
file_id = file_result.get("id")
|
||||
|
||||
if not file_id:
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail="文件上传失败"
|
||||
)
|
||||
|
||||
# 生成 session_id
|
||||
session_id = generate_session_id(name)
|
||||
|
||||
logger.info(f"Candidate submitted: name={name}, session_id={session_id}, file_id={file_id}")
|
||||
|
||||
return ApiResponse(
|
||||
code=0,
|
||||
message="success",
|
||||
data=SubmitCandidateResponse(
|
||||
sessionId=session_id,
|
||||
fileId=file_id,
|
||||
)
|
||||
)
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Submit candidate error: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
Reference in New Issue
Block a user