refactor(kb): 文件主表 + 文档关联改用雪花ID(弃用按名关联)
把 sundynix_doc 明确为"文件主表",补齐文件基础信息字段; 文档间 [[双链]] 改为以 Doc.ID 关联,查询/渲染一律按文件 ID。 store: - Doc 增 Ext(后缀)/MD5(内容指纹) 字段;ObjectKey 即"存放链接" - DocLink 由 (FromName,ToName) 改为 (FromID,ToID,ToName) · FromID/ToID 关联 Doc.ID;ToName 保留用于悬空链接展示与回填 - SaveDoc 返回新建/更新文件的雪花 ID(供建链) - 新增 GetDocByID(按 ID + owner 取正文,防越权) - ReplaceDocLinks 以 fromID 重建出链,按 [[名称]] 解析目标 ID - 新增 ResolveInboundLinks:目标入库后回填指向它的悬空链接 - ListLinks 只返回已解析(to_id 非空)的 ID→ID 边 - migrateDocLinkToID:旧按名双链表无 from_id 列则重建为按 ID 关联 gateway/handler: - runIngest 计算 ext/md5,SaveDoc 取回 ID 后建链 + 回填悬空 - KbDoc 改为 GET ?id=(按文件 ID 取全文) - KbVault 返回 id+ext;KbLinks 返回 from/to 为 ID desktop: - VaultDoc 增 id/ext;getDoc(docId) 按 ID 取正文 - VaultPanel 选中态/正文/反链/关系图改用 ID,名↔ID 双向映射 渲染;保存笔记后按名定位回其新 ID 验证(gateway+PG+MinIO 实测):vault 带 id+ext;双链 ID→ID 且 A→B 悬空链接在 B 入库后成功回填;按 ID 取大文档(15006字)从 MinIO 完整取回;跨 owner 按 ID 取文档 404(隔离生效)。桌面端 文库 Tab 按 ID 选中/载入/反链渲染正常,无控制台报错。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -37,6 +37,7 @@ func OpenPostgres(dsn string) *Postgres {
|
||||
// 一次性迁移:旧表用整型自增 id,与新雪花字符串 id 不兼容(AutoMigrate 不改主键类型)。
|
||||
// 备份模型密钥(唯一不可再生的数据) → 重建全部表 → 回灌模型。其余为可重建的测试数据。
|
||||
migrateLegacyIntIDs(db)
|
||||
migrateDocLinkToID(db)
|
||||
|
||||
if err := db.AutoMigrate(&User{}, &Task{}, &LLMModel{}, &KB{}, &Doc{}, &Agent{}, &DocLink{}); err != nil {
|
||||
log.Printf("[store] postgres AutoMigrate 失败,降级运行: %v", err)
|
||||
@@ -71,6 +72,19 @@ func migrateLegacyIntIDs(db *gorm.DB) {
|
||||
log.Printf("[store] 已回灌 %d 条模型配置(新雪花 id)", len(saved))
|
||||
}
|
||||
|
||||
// migrateDocLinkToID 把旧的按名双链表(from_name/to_name)迁到按 Doc.ID 关联的新表。
|
||||
// 旧表无 from_id 列即判定为旧 schema:直接删表,由 AutoMigrate 重建;链接随文档再入库/编辑重建。
|
||||
func migrateDocLinkToID(db *gorm.DB) {
|
||||
if !db.Migrator().HasTable("sundynix_doc_link") {
|
||||
return
|
||||
}
|
||||
if db.Migrator().HasColumn(&DocLink{}, "from_id") {
|
||||
return // 已是按 ID 关联的新 schema
|
||||
}
|
||||
log.Println("[store] 双链表升级为按文件 ID 关联,重建 sundynix_doc_link(链接随文档再入库重建)")
|
||||
db.Exec("DROP TABLE IF EXISTS sundynix_doc_link CASCADE")
|
||||
}
|
||||
|
||||
// Enabled 报告是否处于真实持久化模式。
|
||||
func (p *Postgres) Enabled() bool { return p.db != nil }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user