fix(backend): move node wrong conflict filtering

This commit is contained in:
2025-12-29 00:36:27 +00:00
parent c3a173de66
commit a956481215

View File

@@ -731,34 +731,36 @@ func (vfs *VirtualFS) MoveNodesInSameDirectory(ctx context.Context, db bun.IDB,
} }
// Validate all nodes are accessible // Validate all nodes are accessible
nodeIDs := make([]uuid.UUID, len(allowedNodes))
nodeNames := make([]string, len(allowedNodes)) nodeNames := make([]string, len(allowedNodes))
for i, node := range allowedNodes { for i, node := range allowedNodes {
if !node.IsAccessible() { if !node.IsAccessible() {
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
nodeIDs[i] = node.ID
nodeNames[i] = node.Name nodeNames[i] = node.Name
} }
var conflicts []*Node var destinationConflicts []*Node
err = db.NewSelect().Model(&conflicts). err = db.NewSelect().Model(&destinationConflicts).
Where("account_id = ?", allowedNodes[0].AccountID). Where("account_id = ?", allowedNodes[0].AccountID).
Where("parent_id = ?", newParentID). Where("parent_id = ?", newParentID).
Where("deleted_at IS NULL").
Where("name IN (?)", bun.In(nodeNames)). Where("name IN (?)", bun.In(nodeNames)).
Scan(ctx) Scan(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
conflictID := make(map[uuid.UUID]struct{}) takenNames := make(map[string]struct{}, len(destinationConflicts))
for _, c := range conflicts { for _, c := range destinationConflicts {
conflictID[c.ID] = struct{}{} takenNames[c.Name] = struct{}{}
} }
movableNodes := make([]*Node, 0, len(allowedNodes)-len(conflicts)) conflicts := make([]*Node, 0, len(takenNames))
movableNodes := make([]*Node, 0, len(allowedNodes)-len(takenNames))
for _, node := range allowedNodes { for _, node := range allowedNodes {
if _, ok := conflictID[node.ID]; !ok { if _, ok := takenNames[node.Name]; ok {
conflicts = append(conflicts, node)
} else {
movableNodes = append(movableNodes, node) movableNodes = append(movableNodes, node)
} }
} }
@@ -774,9 +776,14 @@ func (vfs *VirtualFS) MoveNodesInSameDirectory(ctx context.Context, db bun.IDB,
return nil, err return nil, err
} }
movableIDs := make([]uuid.UUID, len(movableNodes))
for i, node := range movableNodes {
movableIDs[i] = node.ID
}
_, err = db.NewUpdate(). _, err = db.NewUpdate().
Model((*Node)(nil)). Model((*Node)(nil)).
Where("id IN (?)", bun.In(nodeIDs)). Where("id IN (?)", bun.In(movableIDs)).
Where("status = ?", NodeStatusReady). Where("status = ?", NodeStatusReady).
Where("deleted_at IS NULL"). Where("deleted_at IS NULL").
Set("parent_id = ?", newParentID). Set("parent_id = ?", newParentID).
@@ -803,7 +810,7 @@ func (vfs *VirtualFS) MoveNodesInSameDirectory(ctx context.Context, db bun.IDB,
} }
} }
for _, node := range allowedNodes { for _, node := range movableNodes {
node.ParentID = newParentID node.ParentID = newParentID
} }