from fastapi import APIRouter, Depends, Request, UploadFile, File from fastapi.responses import FileResponse from sqlalchemy.orm import Session from pydantic import BaseModel from typing import Optional from database import get_db from models.total import PolicyFile from services.oss_service import oss_service import time import json import os router = APIRouter() @router.post("/oss/upload") async def upload( request: Request, file: UploadFile = File(...) ): """OSS上传 - 对齐Go版本函数名""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: content = await file.read() file_url = oss_service.upload_file(content, file.filename) return { "statusCode": 200, "msg": "上传成功", "data": {"file_url": file_url} } except Exception as e: return {"statusCode": 500, "msg": f"上传失败: {str(e)}"} @router.post("/oss/shudao/upload_image") async def upload_image( request: Request, file: UploadFile = File(...) ): """上传图片""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: content = await file.read() file_url = oss_service.upload_image(content, file.filename) return { "statusCode": 200, "msg": "上传成功", "data": {"image_url": file_url} } except Exception as e: return {"statusCode": 500, "msg": f"上传失败: {str(e)}"} class UploadJsonRequest(BaseModel): filename: str content: dict @router.post("/oss/shudao/upload_json") async def upload_ppt_json( request: Request, data: UploadJsonRequest ): """上传JSON文件 - 对齐Go版本函数名""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: json_str = json.dumps(data.content, ensure_ascii=False) file_url = oss_service.upload_json(json_str, data.filename) return { "statusCode": 200, "msg": "上传成功", "data": {"file_url": file_url} } except Exception as e: return {"statusCode": 500, "msg": f"上传失败: {str(e)}"} @router.get("/oss/parse") async def parse_oss(url: str, request: Request): """OSS解析 - 对齐Go版本函数名""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: decrypted_url = oss_service.parse_url(url) return { "statusCode": 200, "msg": "success", "data": {"url": decrypted_url} } except Exception as e: return {"statusCode": 500, "msg": f"解析失败: {str(e)}"} @router.get("/get_file_link") async def get_file_link( filename: str, request: Request ): """获取文件链接""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: file_url = oss_service.get_signed_url(filename) return { "statusCode": 200, "msg": "success", "data": {"file_url": file_url} } except Exception as e: return {"statusCode": 500, "msg": f"获取失败: {str(e)}"} # 以下路由已在 total.py / chat.py 中实现(含完整逻辑),此处不重复定义: # - GET /download_file → routers/total.py(流式代理下载OSS) # - POST /policy_file_count → routers/total.py(view/download计数,字段 count_type) # - POST /save_ppt_outline → routers/chat.py(更新AIMessage.content) # - POST /save_edit_document → routers/chat.py(更新AIMessage.content)