"""门户进入文档库。""" from fastapi import APIRouter, Depends, File, Form, Query, UploadFile from sqlalchemy.orm import Session from app.core.database import get_db from app.core.doclib_upload_route import DoclibRoute from app.schemas.doclib import DeleteFilesBody, FolderCreateBody, FolderUpdateBody, ShareBody from app.services.doclib_service import DoclibService from app.services.doclib_storage import download_document, upload_document from app.core.auth import get_current_user from app.core.response import error_response, success_response from app.services.doclib_sso import consume_ticket, open_session router = APIRouter(tags=["文档库"], route_class=DoclibRoute) @router.post("/web/doclib/sso") def doclib_sso(user: dict = Depends(get_current_user)): """当前门户用户换取文档库一次性进入地址。所有已登录角色都可调用。""" try: data = open_session(user["user_id"], user.get("real_name") or user.get("username") or "") except Exception as exc: return error_response(502, str(exc) or "无法连接文档库") return success_response(data) @router.get("/public/doclib/exchange") def doclib_exchange(code: str = ""): """文档库页面用一次性票据换登录会话。票据 60 秒内只能用一次。""" login = consume_ticket(code) if not login: return error_response(400, "进入票据无效或已过期") return success_response(login) # 门户内文档库复用此路由;上面的旧 SSO 接口保留用于迁移期间兼容。 def service(db: Session = Depends(get_db), user: dict = Depends(get_current_user)): return DoclibService(db, user) @router.get('/web/doclib/tree') def document_tree(svc: DoclibService = Depends(service)): return success_response(svc.tree()) @router.get('/web/doclib/users') def document_users(keyword: str = Query('', max_length=100), svc: DoclibService = Depends(service)): return success_response(svc.users(keyword)) @router.get('/web/doclib/files') def document_list(scope: str = 'mine', folderId: str = Query('', max_length=64), keyword: str = Query('', max_length=255), page: int = Query(1, ge=1), pageSize: int = Query(20, ge=1, le=100), svc: DoclibService = Depends(service)): return success_response(svc.list_files(scope, folderId, keyword, page, pageSize)) @router.post('/web/doclib/folders') def create_document_folder(body: FolderCreateBody, svc: DoclibService = Depends(service)): return success_response(svc.create_folder(body.name, body.parentId)) @router.put('/web/doclib/folders/{folder_id}') def rename_document_folder(folder_id: str, body: FolderUpdateBody, svc: DoclibService = Depends(service)): return success_response(svc.rename_folder(folder_id, body.name)) @router.delete('/web/doclib/folders/{folder_id}') def delete_document_folder(folder_id: str, svc: DoclibService = Depends(service)): svc.delete_folder(folder_id) return success_response() @router.post('/web/doclib/upload') def upload_document_file(file: UploadFile = File(...), folderId: str = Form(''), svc: DoclibService = Depends(service)): try: return success_response(upload_document(svc, file, folderId)) finally: file.file.close() @router.post('/web/doclib/files/batch-delete') def delete_document_files(body: DeleteFilesBody, svc: DoclibService = Depends(service)): svc.delete_files(body.ids) return success_response() @router.get('/web/doclib/files/{file_id}') def document_detail(file_id: str, svc: DoclibService = Depends(service)): return success_response(svc.get_file(file_id)) @router.put('/web/doclib/files/{file_id}/shares') def share_document(file_id: str, body: ShareBody, svc: DoclibService = Depends(service)): return success_response(svc.set_shares(file_id, body.userIds)) @router.get('/web/doclib/files/{file_id}/download') def download_document_file(file_id: str, svc: DoclibService = Depends(service)): return download_document(svc, file_id)