2022-07-13 06:30:54 +00:00
package file
import (
"context"
2023-03-21 20:57:26 +00:00
"fmt"
"path/filepath"
2023-04-19 03:06:53 +00:00
"strings"
2022-07-13 06:30:54 +00:00
"time"
2023-09-01 00:39:29 +00:00
"github.com/stashapp/stash/pkg/models"
)
2023-03-21 20:57:26 +00:00
// GetOrCreateFolderHierarchy gets the folder for the given path, or creates a folder hierarchy for the given path if one if no existing folder is found.
// Does not create any folders in the file system
2023-09-01 00:39:29 +00:00
func GetOrCreateFolderHierarchy ( ctx context . Context , fc models . FolderFinderCreator , path string ) ( * models . Folder , error ) {
2023-03-21 20:57:26 +00:00
// get or create folder hierarchy
folder , err := fc . FindByPath ( ctx , path )
if err != nil {
return nil , err
}
if folder == nil {
parentPath := filepath . Dir ( path )
parent , err := GetOrCreateFolderHierarchy ( ctx , fc , parentPath )
if err != nil {
return nil , err
}
now := time . Now ( )
2023-09-01 00:39:29 +00:00
folder = & models . Folder {
2023-03-21 20:57:26 +00:00
Path : path ,
ParentFolderID : & parent . ID ,
2023-09-01 00:39:29 +00:00
DirEntry : models . DirEntry {
2023-03-21 20:57:26 +00:00
// leave mod time empty for now - it will be updated when the folder is scanned
} ,
CreatedAt : now ,
UpdatedAt : now ,
}
if err = fc . Create ( ctx , folder ) ; err != nil {
return nil , fmt . Errorf ( "creating folder %s: %w" , path , err )
}
}
return folder , nil
}
2023-04-19 03:06:53 +00:00
// TransferZipFolderHierarchy creates the folder hierarchy for zipFileID under newPath, and removes
// ZipFileID from folders under oldPath.
2023-09-01 00:39:29 +00:00
func TransferZipFolderHierarchy ( ctx context . Context , folderStore models . FolderReaderWriter , zipFileID models . FileID , oldPath string , newPath string ) error {
2023-04-19 03:06:53 +00:00
zipFolders , err := folderStore . FindByZipFileID ( ctx , zipFileID )
if err != nil {
return err
}
for _ , oldFolder := range zipFolders {
oldZfPath := oldFolder . Path
// sanity check - ignore folders which aren't under oldPath
if ! strings . HasPrefix ( oldZfPath , oldPath ) {
continue
}
relZfPath , err := filepath . Rel ( oldPath , oldZfPath )
if err != nil {
return err
}
newZfPath := filepath . Join ( newPath , relZfPath )
newFolder , err := GetOrCreateFolderHierarchy ( ctx , folderStore , newZfPath )
if err != nil {
return err
}
// add ZipFileID to new folder
newFolder . ZipFileID = & zipFileID
if err = folderStore . Update ( ctx , newFolder ) ; err != nil {
return err
}
// remove ZipFileID from old folder
oldFolder . ZipFileID = nil
if err = folderStore . Update ( ctx , oldFolder ) ; err != nil {
return err
}
}
return nil
}