74 lines
1.9 KiB
Go
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
|
|
}
|