mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 04:14:39 +03:00
Model refactor (#3915)
* Add mockery config file * Move basic file/folder structs to models * Fix hack due to import loop * Move file interfaces to models * Move folder interfaces to models * Move scene interfaces to models * Move scene marker interfaces to models * Move image interfaces to models * Move gallery interfaces to models * Move gallery chapter interfaces to models * Move studio interfaces to models * Move movie interfaces to models * Move performer interfaces to models * Move tag interfaces to models * Move autotag interfaces to models * Regenerate mocks
This commit is contained in:
@@ -10,12 +10,13 @@ import (
|
||||
|
||||
"github.com/stashapp/stash/pkg/job"
|
||||
"github.com/stashapp/stash/pkg/logger"
|
||||
"github.com/stashapp/stash/pkg/models"
|
||||
"github.com/stashapp/stash/pkg/txn"
|
||||
)
|
||||
|
||||
// Cleaner scans through stored file and folder instances and removes those that are no longer present on disk.
|
||||
type Cleaner struct {
|
||||
FS FS
|
||||
FS models.FS
|
||||
Repository Repository
|
||||
|
||||
Handlers []CleanHandler
|
||||
@@ -55,44 +56,44 @@ func (s *Cleaner) Clean(ctx context.Context, options CleanOptions, progress *job
|
||||
}
|
||||
|
||||
type fileOrFolder struct {
|
||||
fileID ID
|
||||
folderID FolderID
|
||||
fileID models.FileID
|
||||
folderID models.FolderID
|
||||
}
|
||||
|
||||
type deleteSet struct {
|
||||
orderedList []fileOrFolder
|
||||
fileIDSet map[ID]string
|
||||
fileIDSet map[models.FileID]string
|
||||
|
||||
folderIDSet map[FolderID]string
|
||||
folderIDSet map[models.FolderID]string
|
||||
}
|
||||
|
||||
func newDeleteSet() deleteSet {
|
||||
return deleteSet{
|
||||
fileIDSet: make(map[ID]string),
|
||||
folderIDSet: make(map[FolderID]string),
|
||||
fileIDSet: make(map[models.FileID]string),
|
||||
folderIDSet: make(map[models.FolderID]string),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *deleteSet) add(id ID, path string) {
|
||||
func (s *deleteSet) add(id models.FileID, path string) {
|
||||
if _, ok := s.fileIDSet[id]; !ok {
|
||||
s.orderedList = append(s.orderedList, fileOrFolder{fileID: id})
|
||||
s.fileIDSet[id] = path
|
||||
}
|
||||
}
|
||||
|
||||
func (s *deleteSet) has(id ID) bool {
|
||||
func (s *deleteSet) has(id models.FileID) bool {
|
||||
_, ok := s.fileIDSet[id]
|
||||
return ok
|
||||
}
|
||||
|
||||
func (s *deleteSet) addFolder(id FolderID, path string) {
|
||||
func (s *deleteSet) addFolder(id models.FolderID, path string) {
|
||||
if _, ok := s.folderIDSet[id]; !ok {
|
||||
s.orderedList = append(s.orderedList, fileOrFolder{folderID: id})
|
||||
s.folderIDSet[id] = path
|
||||
}
|
||||
}
|
||||
|
||||
func (s *deleteSet) hasFolder(id FolderID) bool {
|
||||
func (s *deleteSet) hasFolder(id models.FolderID) bool {
|
||||
_, ok := s.folderIDSet[id]
|
||||
return ok
|
||||
}
|
||||
@@ -113,7 +114,7 @@ func (j *cleanJob) execute(ctx context.Context) error {
|
||||
|
||||
if err := txn.WithReadTxn(ctx, j.Repository, func(ctx context.Context) error {
|
||||
var err error
|
||||
fileCount, err = j.Repository.CountAllInPaths(ctx, j.options.Paths)
|
||||
fileCount, err = j.Repository.FileStore.CountAllInPaths(ctx, j.options.Paths)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -177,7 +178,7 @@ func (j *cleanJob) assessFiles(ctx context.Context, toDelete *deleteSet) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
files, err := j.Repository.FindAllInPaths(ctx, j.options.Paths, batchSize, offset)
|
||||
files, err := j.Repository.FileStore.FindAllInPaths(ctx, j.options.Paths, batchSize, offset)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error querying for files: %w", err)
|
||||
}
|
||||
@@ -221,9 +222,9 @@ func (j *cleanJob) assessFiles(ctx context.Context, toDelete *deleteSet) error {
|
||||
}
|
||||
|
||||
// flagFolderForDelete adds folders to the toDelete set, with the leaf folders added first
|
||||
func (j *cleanJob) flagFileForDelete(ctx context.Context, toDelete *deleteSet, f File) error {
|
||||
func (j *cleanJob) flagFileForDelete(ctx context.Context, toDelete *deleteSet, f models.File) error {
|
||||
// add contained files first
|
||||
containedFiles, err := j.Repository.FindByZipFileID(ctx, f.Base().ID)
|
||||
containedFiles, err := j.Repository.FileStore.FindByZipFileID(ctx, f.Base().ID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error finding contained files for %q: %w", f.Base().Path, err)
|
||||
}
|
||||
@@ -306,7 +307,7 @@ func (j *cleanJob) assessFolders(ctx context.Context, toDelete *deleteSet) error
|
||||
return nil
|
||||
}
|
||||
|
||||
func (j *cleanJob) flagFolderForDelete(ctx context.Context, toDelete *deleteSet, folder *Folder) error {
|
||||
func (j *cleanJob) flagFolderForDelete(ctx context.Context, toDelete *deleteSet, folder *models.Folder) error {
|
||||
// it is possible that child folders may be included while parent folders are not
|
||||
// so we need to check child folders separately
|
||||
toDelete.addFolder(folder.ID, folder.Path)
|
||||
@@ -314,7 +315,7 @@ func (j *cleanJob) flagFolderForDelete(ctx context.Context, toDelete *deleteSet,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (j *cleanJob) shouldClean(ctx context.Context, f File) bool {
|
||||
func (j *cleanJob) shouldClean(ctx context.Context, f models.File) bool {
|
||||
path := f.Base().Path
|
||||
|
||||
info, err := f.Base().Info(j.FS)
|
||||
@@ -336,7 +337,7 @@ func (j *cleanJob) shouldClean(ctx context.Context, f File) bool {
|
||||
return !filter.Accept(ctx, path, info)
|
||||
}
|
||||
|
||||
func (j *cleanJob) shouldCleanFolder(ctx context.Context, f *Folder) bool {
|
||||
func (j *cleanJob) shouldCleanFolder(ctx context.Context, f *models.Folder) bool {
|
||||
path := f.Path
|
||||
|
||||
info, err := f.Info(j.FS)
|
||||
@@ -376,7 +377,7 @@ func (j *cleanJob) shouldCleanFolder(ctx context.Context, f *Folder) bool {
|
||||
return !filter.Accept(ctx, path, info)
|
||||
}
|
||||
|
||||
func (j *cleanJob) deleteFile(ctx context.Context, fileID ID, fn string) {
|
||||
func (j *cleanJob) deleteFile(ctx context.Context, fileID models.FileID, fn string) {
|
||||
// delete associated objects
|
||||
fileDeleter := NewDeleter()
|
||||
if err := txn.WithTxn(ctx, j.Repository, func(ctx context.Context) error {
|
||||
@@ -386,14 +387,14 @@ func (j *cleanJob) deleteFile(ctx context.Context, fileID ID, fn string) {
|
||||
return err
|
||||
}
|
||||
|
||||
return j.Repository.Destroy(ctx, fileID)
|
||||
return j.Repository.FileStore.Destroy(ctx, fileID)
|
||||
}); err != nil {
|
||||
logger.Errorf("Error deleting file %q from database: %s", fn, err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func (j *cleanJob) deleteFolder(ctx context.Context, folderID FolderID, fn string) {
|
||||
func (j *cleanJob) deleteFolder(ctx context.Context, folderID models.FolderID, fn string) {
|
||||
// delete associated objects
|
||||
fileDeleter := NewDeleter()
|
||||
if err := txn.WithTxn(ctx, j.Repository, func(ctx context.Context) error {
|
||||
@@ -410,7 +411,7 @@ func (j *cleanJob) deleteFolder(ctx context.Context, folderID FolderID, fn strin
|
||||
}
|
||||
}
|
||||
|
||||
func (j *cleanJob) fireHandlers(ctx context.Context, fileDeleter *Deleter, fileID ID) error {
|
||||
func (j *cleanJob) fireHandlers(ctx context.Context, fileDeleter *Deleter, fileID models.FileID) error {
|
||||
for _, h := range j.Handlers {
|
||||
if err := h.HandleFile(ctx, fileDeleter, fileID); err != nil {
|
||||
return err
|
||||
@@ -420,7 +421,7 @@ func (j *cleanJob) fireHandlers(ctx context.Context, fileDeleter *Deleter, fileI
|
||||
return nil
|
||||
}
|
||||
|
||||
func (j *cleanJob) fireFolderHandlers(ctx context.Context, fileDeleter *Deleter, folderID FolderID) error {
|
||||
func (j *cleanJob) fireFolderHandlers(ctx context.Context, fileDeleter *Deleter, folderID models.FolderID) error {
|
||||
for _, h := range j.Handlers {
|
||||
if err := h.HandleFolder(ctx, fileDeleter, folderID); err != nil {
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user