feat(doclib): 增加批量设置分享接口并复用单文档写入逻辑。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
92a8b3f6da
commit
dd4fdf1e6e
3 files changed
+37
-6
No files matched your search
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user