fix(knowledge): deep audit — 18 bugs fixed across backend + frontend
CRITICAL: - Migration permission seed WHERE name → WHERE id (matched 0 rows, all KB APIs broken) HIGH: - analytics_quality SQL alias + missing comma fix - search() duplicate else block compile error - chunk_content duplicate var declarations + type mismatch - SQL invalid escape sequences - delete_category missing rows_affected check MEDIUM: - analytics_overview hit_rate vs positive_feedback_rate separation - analytics_quality GROUP BY kc.id,kc.name (same-name category merge) - update_category handler trim + empty name validation - update_item duplicate VALID_STATUSES inside transaction - page_size max(1) lower bound in list handlers - batch_create title/content/length validation - embedding dispatch silent error → tracing::warn - Version modal close clears detailItem state - Search empty state distinguishes not-searched vs no-results - Create modal cancel resets form
This commit is contained in:
@@ -76,6 +76,16 @@ export const knowledgeService = {
|
||||
deleteCategory: (id: string) =>
|
||||
request.delete(`/knowledge/categories/${id}`).then((r) => r.data),
|
||||
|
||||
updateCategory: (id: string, data: { name?: string; description?: string; parent_id?: string; icon?: string }) =>
|
||||
request.put(`/knowledge/categories/${id}`, data).then((r) => r.data),
|
||||
|
||||
reorderCategories: (items: Array<{ id: string; sort_order: number }>) =>
|
||||
request.patch('/knowledge/categories/reorder', { items }).then((r) => r.data),
|
||||
|
||||
getCategoryItems: (id: string, params?: { page?: number; page_size?: number; status?: string }, signal?: AbortSignal) =>
|
||||
request.get<ListItemsResponse>(`/knowledge/categories/${id}/items`, withSignal({ params }, signal))
|
||||
.then((r) => r.data),
|
||||
|
||||
// 条目
|
||||
listItems: (params: { page?: number; page_size?: number; category_id?: string; status?: string; keyword?: string }, signal?: AbortSignal) =>
|
||||
request.get<ListItemsResponse>('/knowledge/items', withSignal({ params }, signal))
|
||||
@@ -125,4 +135,28 @@ export const knowledgeService = {
|
||||
getTopItems: (signal?: AbortSignal) =>
|
||||
request.get('/knowledge/analytics/top-items', withSignal({}, signal))
|
||||
.then((r) => r.data),
|
||||
|
||||
getQuality: (signal?: AbortSignal) =>
|
||||
request.get('/knowledge/analytics/quality', withSignal({}, signal))
|
||||
.then((r) => r.data),
|
||||
|
||||
getGaps: (signal?: AbortSignal) =>
|
||||
request.get('/knowledge/analytics/gaps', withSignal({}, signal))
|
||||
.then((r) => r.data),
|
||||
|
||||
// 版本
|
||||
getVersions: (itemId: string, signal?: AbortSignal) =>
|
||||
request.get(`/knowledge/items/${itemId}/versions`, withSignal({}, signal))
|
||||
.then((r) => r.data),
|
||||
|
||||
rollbackVersion: (itemId: string, version: number) =>
|
||||
request.post(`/knowledge/items/${itemId}/rollback/${version}`).then((r) => r.data),
|
||||
|
||||
// 推荐搜索
|
||||
recommend: (data: { query: string; category_id?: string; limit?: number }) =>
|
||||
request.post<SearchResult[]>('/knowledge/recommend', data).then((r) => r.data),
|
||||
|
||||
// 导入
|
||||
importItems: (data: { category_id: string; files: Array<{ content: string; title?: string; keywords?: string[]; tags?: string[] }> }) =>
|
||||
request.post('/knowledge/items/import', data).then((r) => r.data),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user