from fastapi import APIRouter, File, HTTPException, UploadFile from app.schemas.common import ApiResponse from app.services.juming_service import ( get_juming_preferences, get_juming_status, login_jucha_with_juming_cookie, login_juming, update_juming_preferences, upload_juming_cookie, ) from app.services.juming_task_service import create_juming_task, list_juming_tasks, request_stop_juming_task, retry_juming_task router = APIRouter(tags=["juming"]) @router.get("/juming/status", response_model=ApiResponse) def juming_status() -> ApiResponse: return ApiResponse(data=get_juming_status()) @router.get("/juming/preferences", response_model=ApiResponse) def juming_preferences() -> ApiResponse: return ApiResponse(data=get_juming_preferences()) @router.put("/juming/preferences", response_model=ApiResponse) def update_juming_preferences_route(payload: dict) -> ApiResponse: try: data = update_juming_preferences(payload) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="聚名采集偏好已保存", data=data) @router.post("/juming/crawl", response_model=ApiResponse) def juming_crawl(payload: dict) -> ApiResponse: try: data = create_juming_task(payload) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="聚名采集任务已创建", data=data) @router.get("/juming/tasks", response_model=ApiResponse) def juming_tasks() -> ApiResponse: return ApiResponse(data=list_juming_tasks()) @router.post("/juming/tasks/{task_id}/retry", response_model=ApiResponse) def juming_task_retry(task_id: str) -> ApiResponse: try: data = retry_juming_task(task_id) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="聚名采集任务已重新加入队列", data=data) @router.post("/juming/tasks/{task_id}/stop", response_model=ApiResponse) def juming_task_stop(task_id: str) -> ApiResponse: try: data = request_stop_juming_task(task_id) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="聚名采集任务已发送停止请求", data=data) @router.post("/juming/login", response_model=ApiResponse) def juming_login(payload: dict) -> ApiResponse: try: data = login_juming(str(payload.get("email") or ""), str(payload.get("password") or "")) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="聚名登录成功", data=data) @router.post("/juming/jucha-login", response_model=ApiResponse) def juming_jucha_login() -> ApiResponse: try: data = login_jucha_with_juming_cookie() except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="聚查联名登录成功", data=data) @router.post("/juming/cookie/upload", response_model=ApiResponse) async def juming_cookie_upload(file: UploadFile = File(...)) -> ApiResponse: content = await file.read() try: data = upload_juming_cookie(file.filename or "juming_cookies.pkl", content) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="聚名 Cookie 已上传", data=data)