Skip to content

Commit

Permalink
Add support for custom disk uploads purge (#934)
Browse files Browse the repository at this point in the history
  • Loading branch information
marvindurot authored Feb 20, 2024
1 parent e502c4f commit 7dcfdbb
Showing 1 changed file with 30 additions and 45 deletions.
75 changes: 30 additions & 45 deletions modules/system/console/WinterUtil.php
Original file line number Diff line number Diff line change
Expand Up @@ -299,59 +299,44 @@ protected function utilPurgeUploads()
}

$uploadsDisk = Config::get('cms.storage.uploads.disk', 'local');
if ($uploadsDisk !== 'local') {
$this->error("Purging uploads is only supported on the 'local' disk, current uploads disk is $uploadsDisk");
return;
}

$totalCount = 0;
$validFiles = FileModel::pluck('disk_name')->all();
$uploadsPath = Config::get('filesystems.disks.local.root', storage_path('app')) . '/' . Config::get('cms.storage.uploads.folder', 'uploads');

// Recursive function to scan the directory for files and ensure they exist in system_files.
$purgeFunc = function ($targetDir) use (&$purgeFunc, &$totalCount, $uploadsPath, $validFiles) {
if ($files = File::glob($targetDir.'/*')) {
if ($dirs = File::directories($targetDir)) {
foreach ($dirs as $dir) {
$purgeFunc($dir);

if (File::isDirectoryEmpty($dir) && is_writeable($dir)) {
rmdir($dir);
$this->info('Removed folder: '. str_replace($uploadsPath, '', $dir));
}
}
}
$uploadsFolder = Config::get('cms.storage.uploads.folder', 'uploads');

foreach ($files as $file) {
if (!is_file($file)) {
continue;
}
$totalCount = 0;

// Skip .gitignore files
if ($file === '.gitignore') {
continue;
}
$validFiles = FileModel::pluck('disk_name')->all();

// Skip files unable to be purged
if (!is_writeable($file)) {
$this->warn('Unable to purge file: ' . str_replace($uploadsPath, '', $file));
continue;
}
foreach (Storage::disk($uploadsDisk)->allFiles($uploadsFolder) as $filePath) {
$fileName = basename($filePath);

// Skip valid files
if (in_array(basename($file), $validFiles)) {
$this->warn('Skipped file in use: '. str_replace($uploadsPath, '', $file));
continue;
// Skip .gitignore files
if ($fileName === '.gitignore') {
continue;
}
// Purge invalid files
if (!in_array($fileName, $validFiles)) {
// Purge invalid upload file
Storage::disk($uploadsDisk)->delete($filePath);
$this->info('Purged: ' . $filePath);
// Purge parent directories
$currentDir = dirname($filePath);
while ($currentDir !== $uploadsFolder) {
// Get parent directory children
$children = Storage::disk($uploadsDisk)->directories($currentDir);
// Parent directory is empty
if (count($children) === 0) {
Storage::disk($uploadsDisk)->deleteDirectory($currentDir);
$this->info('Removed folder: ' . $currentDir);
} else {
// Parent directory is not empty
// stop the iteration
break;
}

unlink($file);
$this->info('Purged: '. str_replace($uploadsPath, '', $file));
$totalCount++;
$currentDir = dirname($currentDir);
}
$totalCount++;
}
};

$purgeFunc($uploadsPath);
}

if ($totalCount > 0) {
$this->comment(sprintf('Successfully deleted %d invalid file(s), leaving %d valid files', $totalCount, count($validFiles)));
Expand Down

0 comments on commit 7dcfdbb

Please sign in to comment.