diff --git a/backend/app/api/doclib.py b/backend/app/api/doclib.py index d7b187107..629a81698 100644 --- a/backend/app/api/doclib.py +++ b/backend/app/api/doclib.py @@ -4,7 +4,13 @@ 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.schemas.doclib import ( + BatchShareBody, + DeleteFilesBody, + FolderCreateBody, + FolderUpdateBody, + ShareBody, +) from app.services.doclib_service import DoclibService from app.services.doclib_storage import download_document, upload_document @@ -87,6 +93,11 @@ def delete_document_files(body: DeleteFilesBody, svc: DoclibService = Depends(se return success_response() +@router.post('/web/doclib/files/batch-shares') +def batch_share_documents(body: BatchShareBody, svc: DoclibService = Depends(service)): + return success_response(svc.set_shares_batch(body.ids, body.userIds)) + + @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)) diff --git a/backend/app/schemas/doclib.py b/backend/app/schemas/doclib.py index cccf13e4d..93474978a 100644 --- a/backend/app/schemas/doclib.py +++ b/backend/app/schemas/doclib.py @@ -28,5 +28,10 @@ class ShareBody(_Body): userIds: List[str] = Field(max_length=500) +class BatchShareBody(_Body): + ids: List[str] = Field(min_length=1, max_length=100) + userIds: List[str] = Field(max_length=500) + + class DeleteFilesBody(_Body): ids: List[str] = Field(min_length=1, max_length=100) diff --git a/backend/app/services/doclib_service.py b/backend/app/services/doclib_service.py index 0a578a98f..b241f93c9 100644 --- a/backend/app/services/doclib_service.py +++ b/backend/app/services/doclib_service.py @@ -228,23 +228,38 @@ class DoclibService: self.db.commit() return result - def set_shares(self, file_id, user_ids): + def _apply_shares(self, file_id, user_ids): row = self._file(file_id, manage=True, lock=True) requested = set(user_ids) - {row.create_by} - valid = {u.id for u in self._base(SysUser).filter(SysUser.id.in_(requested), SysUser.status == '1').all()} - if requested != valid: - raise HTTPException(400, '分享人员不存在、已停用或不属于当前租户') + if requested: + valid = {u.id for u in self._base(SysUser).filter( + SysUser.id.in_(requested), SysUser.status == '1').all()} + if requested != valid: + raise HTTPException(400, '分享人员不存在、已停用或不属于当前租户') history = {s.user_id: s for s in self.db.query(DoclibShare).filter( - DoclibShare.tenant_no == self.tenant, DoclibShare.file_id == file_id).populate_existing().with_for_update().all()} + DoclibShare.tenant_no == self.tenant, DoclibShare.file_id == file_id + ).populate_existing().with_for_update().all()} for uid, share in history.items(): share.del_flag = 0 if uid in requested else 1 share.update_by = self.uid for uid in requested - set(history): self.db.add(DoclibShare(file_id=file_id, user_id=uid, **self._public())) row.update_by, row.update_time = self.uid, datetime.now() + return row + + def set_shares(self, file_id, user_ids): + row = self._apply_shares(file_id, user_ids) self.db.commit() return self._serialize_files([row])[0] + def set_shares_batch(self, ids, user_ids): + file_ids = sorted({str(i).strip() for i in ids if str(i).strip()}) + if not file_ids: + raise HTTPException(400, '请选择要设置分享的文档') + rows = [self._apply_shares(fid, user_ids) for fid in file_ids] + self.db.commit() + return self._serialize_files(rows) + def delete_files(self, ids): rows = [self._file(fid, manage=True, lock=True) for fid in sorted(set(ids))] for row in rows: