feat(doclib): 增加批量设置分享接口并复用单文档写入逻辑。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
wuzilongandCursor committed 2026-11-12 17:42:34 +08:00
1 parent 92a8b3f6da
commit dd4fdf1e6e
3 files changed
+37 -6

No files matched your search

+12 -1
View File
@@ -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))
+5
View File
@@ -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)
+20 -5
View File
@@ -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: