added delete_failed_files into SchedulerService.php

This commit is contained in:
Peter Papp
2021-03-14 12:42:25 +01:00
parent d0bd866354
commit bb469f2520
5 changed files with 90 additions and 54 deletions

View File

@@ -34,6 +34,10 @@ class Kernel extends ConsoleKernel
$schedule->call(function () use ($scheduler) {
$scheduler->delete_old_zips();
if (!is_storage_driver(['local'])) {
$scheduler->delete_failed_files();
}
})->everySixHours();
// Run queue jobs every minute

View File

@@ -14,7 +14,7 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Tools\Guardian;
use App\Http\Tools\Editor;
use App\Http\Tools\FileManagerService;
use App\Models\Folder;
use App\Models\File;
use Exception;
@@ -50,7 +50,7 @@ class EditItemsController extends Controller
}
// Create new folder
return Editor::create_folder($request);
return FileManagerService::create_folder($request);
}
/**
@@ -77,7 +77,7 @@ class EditItemsController extends Controller
Guardian::check_item_access($request->parent_id, $shared);
// Create folder
return Editor::create_folder($request, $shared);
return FileManagerService::create_folder($request, $shared);
}
/**
@@ -117,11 +117,11 @@ class EditItemsController extends Controller
// If request have a change folder icon values set the folder icon
if ($request->type === 'folder' && ($request->filled('emoji') || $request->filled('color'))) {
Editor::set_folder_icon($request, $id);
FileManagerService::set_folder_icon($request, $id);
}
// Rename Item
return Editor::rename_item($request, $id);
return FileManagerService::rename_item($request, $id);
}
/**
@@ -160,11 +160,11 @@ class EditItemsController extends Controller
// If request have a change folder icon values set the folder icon
if ($request->type === 'folder' && $request->filled('icon')) {
Editor::set_folder_icon($request, $id);
FileManagerService::set_folder_icon($request, $id);
}
// Rename item
$item = Editor::rename_item($request, $id, $shared);
$item = FileManagerService::rename_item($request, $id, $shared);
// Set public url
if ($item->type !== 'folder') {
@@ -215,7 +215,7 @@ class EditItemsController extends Controller
}
// Delete item
Editor::delete_item($item, $item['id']);
FileManagerService::delete_item($item, $item['id']);
}
return response(null, 204);
@@ -258,7 +258,7 @@ class EditItemsController extends Controller
}
// Delete item
Editor::delete_item($file, $file['id'], $shared);
FileManagerService::delete_item($file, $file['id'], $shared);
}
// Return response
return response('Done', 204);
@@ -292,7 +292,7 @@ class EditItemsController extends Controller
}
// Return new uploaded file
return Editor::upload($request);
return FileManagerService::upload($request);
}
/**
@@ -322,7 +322,7 @@ class EditItemsController extends Controller
Guardian::check_item_access($request->folder_id, $shared);
// Return new uploaded file
$new_file = Editor::upload($request, $shared);
$new_file = FileManagerService::upload($request, $shared);
// Set public access url
$new_file->setPublicUrl($token);
@@ -363,7 +363,7 @@ class EditItemsController extends Controller
abort(404, 'Requested folder doesn\'t exists.');
}
$zip = Editor::zip_folder($id);
$zip = FileManagerService::zip_folder($id);
// Get file
return response([
@@ -396,7 +396,7 @@ class EditItemsController extends Controller
abort(404, 'Requested folder doesn\'t exists.');
}
$zip = Editor::zip_folder($id, $shared);
$zip = FileManagerService::zip_folder($id, $shared);
// Get file
return response([
@@ -440,7 +440,7 @@ class EditItemsController extends Controller
->whereIn('id', $request->input('items'))
->get();
$zip = Editor::zip_files($files);
$zip = FileManagerService::zip_files($files);
// Get file
return response([
@@ -475,7 +475,7 @@ class EditItemsController extends Controller
->whereIn('id', $request->items)
->get();
$zip = Editor::zip_files($files, $shared);
$zip = FileManagerService::zip_files($files, $shared);
// Get file
return response([
@@ -517,7 +517,7 @@ class EditItemsController extends Controller
}
// Move item
Editor::move($request, $to_id);
FileManagerService::move($request, $to_id);
return response('Done!', 204);
}
@@ -566,7 +566,7 @@ class EditItemsController extends Controller
}
}
Editor::move($request, $request->to_id);
FileManagerService::move($request, $request->to_id);
return response('Done!', 204);
}

View File

@@ -1,6 +1,6 @@
<?php
namespace App\Http\Tools;
namespace App\Services;
use App;
use App\Models\Folder;
@@ -25,7 +25,7 @@ use Madnest\Madzipper\Facades\Madzipper;
use Symfony\Component\HttpKernel\Exception\HttpException;
class Editor
class FileManagerService
{
/**
* Store folder icon
@@ -456,9 +456,6 @@ class Editor
// Move files to external storage
if (!is_storage_driver(['local'])) {
// Clear failed uploads if exists
self::clear_failed_files();
// Move file to external storage service
self::move_to_external_storage($disk_file_name, $thumbnail);
}
@@ -483,38 +480,6 @@ class Editor
}
}
/**
* Clear failed files
*/
private static function clear_failed_files()
{
$local_disk = Storage::disk('local');
// Get all files from storage
$files = collect([
$local_disk->allFiles('files'),
$local_disk->allFiles('chunks')
])->collapse();
$files->each(function ($file) use ($local_disk) {
// Get the file's last modification time.
$last_modified = $local_disk->lastModified($file);
// Get diffInHours
$diff = Carbon::parse($last_modified)->diffInHours(Carbon::now());
// Delete if file is in local storage more than 24 hours
if ($diff > 24) {
Log::info('Failed file or chunk ' . $file . ' deleted.');
// Delete file from local storage
$local_disk->delete($file);
}
});
}
/**
* Move file to external storage if is set
*
@@ -546,6 +511,7 @@ class Editor
$client = $adapter->getClient();
// Prepare the upload parameters.
// TODO: replace local files with temp folder
$uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . '/files/' . $file, [
'bucket' => $adapter->getBucket(),
'key' => 'files/' . $file
@@ -570,6 +536,7 @@ class Editor
} else {
// Stream file object to s3
// TODO: replace local files with temp folder
Storage::putFileAs('files', config('filesystems.disks.local.root') . '/files/' . $file, $file, 'private');
}

View File

@@ -7,6 +7,8 @@ namespace App\Services;
use App\Models\Share;
use App\Models\Zip;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
class SchedulerService
{
@@ -45,4 +47,38 @@ class SchedulerService
}
});
}
/**
* Get and delete failed files older than 24 hours
*/
public function delete_failed_files(): void
{
$local_disk = Storage::disk('local');
// Get all files from storage
$files = collect([
//$local_disk->allFiles('files'),
$local_disk->allFiles('chunks')
])->collapse();
$files->each(function ($file) use ($local_disk) {
// Get the file's last modification time.
$last_modified = $local_disk
->lastModified($file);
// Get diffInHours
$diff = Carbon::parse($last_modified)
->diffInHours(Carbon::now());
// Delete if file is in local storage more than 24 hours
if ($diff >= 24) {
Log::info("Failed file or chunk $file deleted.");
// Delete file from local storage
$local_disk->delete($file);
}
});
}
}

View File

@@ -70,4 +70,33 @@ class SchedulerTest extends TestCase
Storage::disk('local')
->assertMissing('zip/EHWKcuvKzA4Gv29v-archive.zip');
}
/**
* @test
*/
public function it_delete_failed_files_older_than_one_day()
{
Storage::fake('local');
$this->setup->create_directories();
$this->travel(-26)->hours();
$file = UploadedFile::fake()
->create('fake-file.zip', 2000, 'application/zip');
collect(['chunks'])
->each(function ($folder) use ($file){
Storage::putFileAs($folder, $file, 'fake-file.zip');
});
$this->scheduler->delete_failed_files();
collect(['chunks'])
->each(function ($folder) {
Storage::disk('local')
->assertMissing("$folder/fake-file.zip");
});
}
}