fix(api): KB 架構審查修復 I3-I5
- I3: Service 層加 IKnowledgeRepository Protocol 型別標注 - I4: search 方法加入 tags JSONB 搜尋 (cast→String→ilike) - I5: get_categories 獨立方法,不再繞道 list_entries(limit=0) 首席架構師審查 87/100 → 全部 Important issues 已修復 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,7 @@ Knowledge Base Phase 1: CRUD + 搜尋
|
||||
"""
|
||||
|
||||
import structlog
|
||||
from sqlalchemy import func, or_, select, update
|
||||
from sqlalchemy import String, func, or_, select, update
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from src.db.models import KnowledgeEntryRecord
|
||||
@@ -154,7 +154,7 @@ class KnowledgeDBRepository:
|
||||
return [(row.category, row.cnt) for row in result.all()]
|
||||
|
||||
async def search(self, query: str, limit: int = 20) -> list[KnowledgeEntry]:
|
||||
"""關鍵字搜尋 (title + content)"""
|
||||
"""關鍵字搜尋 (title + content + tags)"""
|
||||
like_q = f"%{query}%"
|
||||
result = await self.db.execute(
|
||||
select(KnowledgeEntryRecord)
|
||||
@@ -163,6 +163,7 @@ class KnowledgeDBRepository:
|
||||
or_(
|
||||
KnowledgeEntryRecord.title.ilike(like_q),
|
||||
KnowledgeEntryRecord.content.ilike(like_q),
|
||||
KnowledgeEntryRecord.tags.cast(String).ilike(like_q),
|
||||
),
|
||||
)
|
||||
.order_by(KnowledgeEntryRecord.view_count.desc())
|
||||
|
||||
Reference in New Issue
Block a user