[Nested Folder] Block move operation that could introduce more than 8 level of depth,… (#59832)
* block move operation that could introduce more than 8 level of depth, forbid circular reference * move getHeight to store, mock store in service * fix linter
This commit is contained in:
@@ -456,9 +456,36 @@ func (s *Service) Move(ctx context.Context, cmd *folder.MoveFolderCommand) (*fol
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// if the new parent is the same as the current parent, we don't need to do anything
|
||||
if foldr.ParentUID == cmd.NewParentUID {
|
||||
return foldr, nil
|
||||
}
|
||||
|
||||
// here we get the folder, we need to get the height of current folder
|
||||
// and the depth of the new parent folder, the sum can't bypass 8
|
||||
folderHeight, err := s.store.GetHeight(ctx, foldr.UID, cmd.OrgID, &cmd.NewParentUID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
parents, err := s.GetParents(ctx, &folder.GetParentsQuery{UID: cmd.NewParentUID, OrgID: cmd.OrgID})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// current folder height + current folder + parent folder + parent folder depth should be less than or equal 8
|
||||
if folderHeight+len(parents)+2 > folder.MaxNestedFolderDepth {
|
||||
return nil, folder.ErrMaximumDepthReached
|
||||
}
|
||||
|
||||
// if the current folder is already a parent of newparent, we should return error
|
||||
for _, parent := range parents {
|
||||
if parent.UID == foldr.UID {
|
||||
return nil, folder.ErrCircularReference
|
||||
}
|
||||
}
|
||||
|
||||
return s.store.Update(ctx, folder.UpdateFolderCommand{
|
||||
Folder: foldr,
|
||||
// NewParentUID: &cmd.NewParentUID,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user