Files
YouduWiki/backend/migration/fns/0003_fix_group_ids.go
2026-05-21 19:52:45 +08:00

74 lines
1.9 KiB
Go

package fns
import (
"context"
"fmt"
"github.com/chaitin/panda-wiki/consts"
"github.com/chaitin/panda-wiki/domain"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/repo/mq"
"gorm.io/gorm"
)
type MigrationFixGroupIds struct {
Name string
logger *log.Logger
ragRepo *mq.RAGRepository
}
func NewMigrationFixGroupIds(logger *log.Logger, ragRepo *mq.RAGRepository) *MigrationFixGroupIds {
return &MigrationFixGroupIds{
Name: "0003_fix_group_ids",
logger: logger,
ragRepo: ragRepo,
}
}
func (m *MigrationFixGroupIds) Execute(tx *gorm.DB) error {
var nodes []domain.Node
if err := tx.Model(&domain.Node{}).
Select("id", "kb_id", "doc_id").
Where("permissions->>'answerable' = ?", consts.NodeAccessPermClosed).
Find(&nodes).Error; err != nil {
return fmt.Errorf("get node list failed: %w", err)
}
if len(nodes) == 0 {
return nil
}
nodeIds := make([]string, 0, len(nodes))
for _, node := range nodes {
nodeIds = append(nodeIds, node.ID)
}
var nodeReleases []domain.NodeRelease
if err := tx.Model(&domain.NodeRelease{}).
Where("node_id IN (?)", nodeIds).
Select("DISTINCT ON (node_id) id, node_id, kb_id, doc_id").
Order("node_id, updated_at DESC").
Find(&nodeReleases).Error; err != nil {
return fmt.Errorf("get node release list failed: %w", err)
}
var nodeVectorContentRequests []*domain.NodeReleaseVectorRequest
for _, nodeRelease := range nodeReleases {
if nodeRelease.DocID == "" {
continue
}
nodeVectorContentRequests = append(nodeVectorContentRequests, &domain.NodeReleaseVectorRequest{
KBID: nodeRelease.KBID,
DocID: nodeRelease.DocID,
Action: "update_group_ids",
GroupIds: []int{},
})
}
if len(nodeVectorContentRequests) > 0 {
if err := m.ragRepo.AsyncUpdateNodeReleaseVector(context.Background(), nodeVectorContentRequests); err != nil {
return fmt.Errorf("async update node release vector failed: %w", err)
}
}
return nil
}