细节优化
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
"""知识库服务:CRUD + Token 管理 + 默认目录树。"""
|
||||
|
||||
from app.core.errors import NotFoundError, PermissionDeniedError
|
||||
from app.core.logging import get_logger
|
||||
from app.models.document_category import DocumentCategory
|
||||
from app.models.knowledge_base import KnowledgeBase
|
||||
from app.models.user import User
|
||||
@@ -8,6 +9,8 @@ from app.repositories.kb_repo import KnowledgeBaseRepository
|
||||
from app.services.token_service import TokenService
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class KnowledgeBaseService:
|
||||
def __init__(self, session: Session) -> None:
|
||||
@@ -96,8 +99,35 @@ class KnowledgeBaseService:
|
||||
def delete(self, kb_id: str, user: User) -> None:
|
||||
kb = self.get_or_404(kb_id, user)
|
||||
self._kb_repo.delete(kb)
|
||||
self._cleanup_kb_files(kb)
|
||||
self._session.commit()
|
||||
|
||||
def _cleanup_kb_files(self, kb: KnowledgeBase) -> None:
|
||||
"""物理删除知识库下所有文档的原始文件与 Markdown 文件(软删后调用)。
|
||||
|
||||
文件删除失败不阻塞删除流程(记录日志,可由后续清理兜底)。
|
||||
"""
|
||||
from sqlalchemy import select
|
||||
|
||||
from app.models.document import Document
|
||||
from app.storage.local_storage import get_storage
|
||||
|
||||
stmt = select(Document).where(Document.knowledge_base_id == kb.id)
|
||||
docs = list(self._session.scalars(stmt).all())
|
||||
storage = get_storage()
|
||||
removed = 0
|
||||
for doc in docs:
|
||||
for key in (doc.storage_path, doc.markdown_path):
|
||||
if not key:
|
||||
continue
|
||||
try:
|
||||
storage.delete(key)
|
||||
removed += 1
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.warning("清理文件失败 key=%s: %s", key, exc)
|
||||
if removed:
|
||||
logger.info("KB %s 软删,已物理清理 %d 个文件", kb.id, removed)
|
||||
|
||||
def regenerate_token(self, kb_id: str, user: User) -> tuple[KnowledgeBase, str]:
|
||||
"""重新生成 Token。旧链接立即失效。"""
|
||||
kb = self.get_or_404(kb_id, user)
|
||||
@@ -117,6 +147,20 @@ class KnowledgeBaseService:
|
||||
self._session.commit()
|
||||
return kb
|
||||
|
||||
def set_expiry(self, kb_id: str, user: User, expires_in_minutes: int | None) -> KnowledgeBase:
|
||||
"""设置链接有效期。None = 长期有效;负数表示已过期(测试用)。"""
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
kb = self.get_or_404(kb_id, user)
|
||||
if expires_in_minutes is None:
|
||||
kb.token_expires_at = None
|
||||
else:
|
||||
kb.token_expires_at = (datetime.now() + timedelta(minutes=expires_in_minutes)).strftime(
|
||||
"%Y-%m-%d %H:%M:%S"
|
||||
)
|
||||
self._session.commit()
|
||||
return kb
|
||||
|
||||
def get_full_token(self, kb: KnowledgeBase) -> str | None:
|
||||
"""解密 token 原文(供后台显示完整链接)。"""
|
||||
if kb.token_encrypted:
|
||||
|
||||
Reference in New Issue
Block a user