doclib.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. """门户进入文档库。"""
  2. from fastapi import APIRouter, Depends, File, Form, Query, UploadFile
  3. from sqlalchemy.orm import Session
  4. from app.core.database import get_db
  5. from app.core.doclib_upload_route import DoclibRoute
  6. from app.schemas.doclib import DeleteFilesBody, FolderCreateBody, FolderUpdateBody, ShareBody
  7. from app.services.doclib_service import DoclibService
  8. from app.services.doclib_storage import download_document, upload_document
  9. from app.core.auth import get_current_user
  10. from app.core.response import error_response, success_response
  11. from app.services.doclib_sso import consume_ticket, open_session
  12. router = APIRouter(tags=["文档库"], route_class=DoclibRoute)
  13. @router.post("/web/doclib/sso")
  14. def doclib_sso(user: dict = Depends(get_current_user)):
  15. """当前门户用户换取文档库一次性进入地址。所有已登录角色都可调用。"""
  16. try:
  17. data = open_session(user["user_id"], user.get("real_name") or user.get("username") or "")
  18. except Exception as exc:
  19. return error_response(502, str(exc) or "无法连接文档库")
  20. return success_response(data)
  21. @router.get("/public/doclib/exchange")
  22. def doclib_exchange(code: str = ""):
  23. """文档库页面用一次性票据换登录会话。票据 60 秒内只能用一次。"""
  24. login = consume_ticket(code)
  25. if not login:
  26. return error_response(400, "进入票据无效或已过期")
  27. return success_response(login)
  28. # 门户内文档库复用此路由;上面的旧 SSO 接口保留用于迁移期间兼容。
  29. def service(db: Session = Depends(get_db), user: dict = Depends(get_current_user)):
  30. return DoclibService(db, user)
  31. @router.get('/web/doclib/tree')
  32. def document_tree(svc: DoclibService = Depends(service)):
  33. return success_response(svc.tree())
  34. @router.get('/web/doclib/users')
  35. def document_users(keyword: str = Query('', max_length=100), svc: DoclibService = Depends(service)):
  36. return success_response(svc.users(keyword))
  37. @router.get('/web/doclib/files')
  38. def document_list(scope: str = 'mine', folderId: str = Query('', max_length=64),
  39. keyword: str = Query('', max_length=255), page: int = Query(1, ge=1),
  40. pageSize: int = Query(20, ge=1, le=100), svc: DoclibService = Depends(service)):
  41. return success_response(svc.list_files(scope, folderId, keyword, page, pageSize))
  42. @router.post('/web/doclib/folders')
  43. def create_document_folder(body: FolderCreateBody, svc: DoclibService = Depends(service)):
  44. return success_response(svc.create_folder(body.name, body.parentId))
  45. @router.put('/web/doclib/folders/{folder_id}')
  46. def rename_document_folder(folder_id: str, body: FolderUpdateBody, svc: DoclibService = Depends(service)):
  47. return success_response(svc.rename_folder(folder_id, body.name))
  48. @router.delete('/web/doclib/folders/{folder_id}')
  49. def delete_document_folder(folder_id: str, svc: DoclibService = Depends(service)):
  50. svc.delete_folder(folder_id)
  51. return success_response()
  52. @router.post('/web/doclib/upload')
  53. def upload_document_file(file: UploadFile = File(...), folderId: str = Form(''),
  54. svc: DoclibService = Depends(service)):
  55. try:
  56. return success_response(upload_document(svc, file, folderId))
  57. finally:
  58. file.file.close()
  59. @router.post('/web/doclib/files/batch-delete')
  60. def delete_document_files(body: DeleteFilesBody, svc: DoclibService = Depends(service)):
  61. svc.delete_files(body.ids)
  62. return success_response()
  63. @router.get('/web/doclib/files/{file_id}')
  64. def document_detail(file_id: str, svc: DoclibService = Depends(service)):
  65. return success_response(svc.get_file(file_id))
  66. @router.put('/web/doclib/files/{file_id}/shares')
  67. def share_document(file_id: str, body: ShareBody, svc: DoclibService = Depends(service)):
  68. return success_response(svc.set_shares(file_id, body.userIds))
  69. @router.get('/web/doclib/files/{file_id}/download')
  70. def download_document_file(file_id: str, svc: DoclibService = Depends(service)):
  71. return download_document(svc, file_id)