59 lines
2.1 KiB
Go
59 lines
2.1 KiB
Go
// Package service 提供知识库条目的增删操作。
|
||
// 此文件专注于"破坏性"操作(删除、清空),与搜索/导入分开放置,
|
||
// 便于代码审计时快速定位所有写入操作。
|
||
package service
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"AI-Expert-Sidebar/internal/database"
|
||
"AI-Expert-Sidebar/internal/models"
|
||
)
|
||
|
||
// DeleteItems 从当前活跃知识库中物理删除指定 ID 的条目。
|
||
//
|
||
// # 设计决策
|
||
//
|
||
// - 使用"物理删除"而非"软删除"(deleted_at 字段):
|
||
// 本项目定位为本地隐私工具,用户期望删除就是彻底删除,
|
||
// 不需要回收站或审计日志,软删除只会增加查询复杂度。
|
||
//
|
||
// - ids 为空时提前返回 nil,避免 GORM 生成 "DELETE ... WHERE id IN ()"
|
||
// 这样的非法 SQL 语句。
|
||
//
|
||
// - 使用 db.Delete(&models.Entry{}, ids) 的原因:
|
||
// GORM 会展开 ids 为 "WHERE id IN (?,?,?)",一次网络往返完成批量删除,
|
||
// 比循环单条删除效率高出 N 倍。
|
||
func DeleteItems(ids []uint) error {
|
||
if len(ids) == 0 {
|
||
return nil
|
||
}
|
||
db := database.Get()
|
||
if db == nil {
|
||
return fmt.Errorf("知识库未初始化,请先选择或创建一个知识库")
|
||
}
|
||
return db.Delete(&models.Entry{}, ids).Error
|
||
}
|
||
|
||
// ClearDatabase 清空当前活跃知识库的所有条目,但保留 entries 表结构。
|
||
//
|
||
// # 与"删除知识库"的区别
|
||
//
|
||
// ClearDatabase 只删除行数据,表和 .db 文件依然存在,
|
||
// 用户可以立刻向空库重新导入新的 CSV/Excel 数据。
|
||
// 对比 DeleteLibrary(删除整个 .db 文件),此操作更轻量,
|
||
// 适合"重置知识库内容但保留库名"的场景。
|
||
//
|
||
// # WHERE 子句说明
|
||
//
|
||
// SQLite 的 GORM 驱动需要显式 WHERE 条件才能执行全表删除,
|
||
// 否则会因缺少 WHERE 子句而报错(与 MySQL 行为不同)。
|
||
// "WHERE id > 0" 是符合 SQL 标准的"全匹配"惯用写法。
|
||
func ClearDatabase() error {
|
||
db := database.Get()
|
||
if db == nil {
|
||
return fmt.Errorf("知识库未初始化,请先选择或创建一个知识库")
|
||
}
|
||
return db.Where("id > 0").Delete(&models.Entry{}).Error
|
||
}
|