细节优化
This commit is contained in:
@@ -4,7 +4,9 @@ HTML/MD/TXT/JSON/搜索全部通过此 Service 获取数据,不各自写查询
|
||||
支持目录树结构和分类过滤。
|
||||
"""
|
||||
|
||||
from app.core.errors import NotFoundError
|
||||
from datetime import datetime
|
||||
|
||||
from app.core.errors import LinkExpiredError, NotFoundError
|
||||
from app.core.security import hash_token
|
||||
from app.models.document import Document
|
||||
from app.models.document_category import DocumentCategory
|
||||
@@ -14,6 +16,8 @@ from app.repositories.kb_repo import KnowledgeBaseRepository
|
||||
from sqlalchemy import func, select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
_TIME_FMT = "%Y-%m-%d %H:%M:%S"
|
||||
|
||||
|
||||
class KbPublicService:
|
||||
def __init__(self, session: Session) -> None:
|
||||
@@ -22,13 +26,35 @@ class KbPublicService:
|
||||
self._doc_repo = DocumentRepository(session)
|
||||
|
||||
def get_kb_by_token(self, token: str) -> KnowledgeBase:
|
||||
"""通过 token 获取知识库。不存在/禁用/删除 → 404。"""
|
||||
"""通过 token 获取知识库。
|
||||
|
||||
不存在/禁用/删除 → 404;存在但已过期 → 410(LinkExpiredError)。
|
||||
"""
|
||||
token_hash = hash_token(token)
|
||||
kb = self._kb_repo.get_by_token_hash(token_hash)
|
||||
if kb is None or not kb.enabled or kb.status == "DELETED":
|
||||
raise NotFoundError("知识库不存在。")
|
||||
|
||||
if kb.token_expires_at:
|
||||
try:
|
||||
expires = datetime.strptime(kb.token_expires_at, _TIME_FMT)
|
||||
except ValueError:
|
||||
expires = None
|
||||
if expires is not None and datetime.now() > expires:
|
||||
raise LinkExpiredError()
|
||||
return kb
|
||||
|
||||
@staticmethod
|
||||
def is_expired(kb: KnowledgeBase) -> bool:
|
||||
"""判断知识库链接是否已过期(管理端展示用)。"""
|
||||
if not kb.token_expires_at:
|
||||
return False
|
||||
try:
|
||||
expires = datetime.strptime(kb.token_expires_at, _TIME_FMT)
|
||||
except ValueError:
|
||||
return False
|
||||
return datetime.now() > expires
|
||||
|
||||
def get_category_tree(self, kb: KnowledgeBase) -> list[dict]:
|
||||
"""获取目录树(含文档数量)。"""
|
||||
stmt = (
|
||||
|
||||
Reference in New Issue
Block a user