mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-18 16:22:14 +00:00
deleted old files
This commit is contained in:
@@ -1,32 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Database\Factories;
|
|
||||||
|
|
||||||
use Domain\Zip\Models\Zip;
|
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
|
||||||
use Illuminate\Support\Str;
|
|
||||||
|
|
||||||
class ZipFactory extends Factory
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The name of the factory's corresponding model.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $model = Zip::class;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define the model's default state.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function definition()
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'id' => $this->faker->uuid,
|
|
||||||
'user_id' => $this->faker->uuid,
|
|
||||||
'shared_token' => Str::random(16),
|
|
||||||
'basename' => $this->faker->word,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
// Get avatars and system images
|
// Get avatars and system images
|
||||||
use Domain\Zip\Controllers\GetZipController;
|
|
||||||
use App\Users\Controllers\GetAvatarController;
|
use App\Users\Controllers\GetAvatarController;
|
||||||
use Domain\Zip\Controllers\VisitorGetZipController;
|
|
||||||
use Domain\Settings\Controllers\GetAppImageController;
|
use Domain\Settings\Controllers\GetAppImageController;
|
||||||
use Domain\Files\Controllers\FileAccess\GetFileController;
|
use Domain\Files\Controllers\FileAccess\GetFileController;
|
||||||
use Domain\Files\Controllers\FileAccess\GetThumbnailController;
|
use Domain\Files\Controllers\FileAccess\GetThumbnailController;
|
||||||
@@ -15,12 +13,10 @@ Route::get('/system/{image}', GetAppImageController::class);
|
|||||||
|
|
||||||
// Get public thumbnails and files
|
// Get public thumbnails and files
|
||||||
Route::get('/thumbnail/{name}/{shared}', VisitorGetThumbnailController::class);
|
Route::get('/thumbnail/{name}/{shared}', VisitorGetThumbnailController::class);
|
||||||
Route::get('/zip/{id}/public/{token}', VisitorGetZipController::class);
|
|
||||||
Route::get('/file/{name}/{shared}', VisitorGetFileController::class);
|
Route::get('/file/{name}/{shared}', VisitorGetFileController::class);
|
||||||
|
|
||||||
// User master,editor,visitor access to image thumbnails and file downloads
|
// User master,editor,visitor access to image thumbnails and file downloads
|
||||||
Route::group(['middleware' => ['auth:sanctum']], function () {
|
Route::group(['middleware' => ['auth:sanctum']], function () {
|
||||||
Route::get('/thumbnail/{name}', GetThumbnailController::class)->name('thumbnail');
|
Route::get('/thumbnail/{name}', GetThumbnailController::class)->name('thumbnail');
|
||||||
Route::get('/file/{name}', GetFileController::class)->name('file');
|
Route::get('/file/{name}', GetFileController::class)->name('file');
|
||||||
Route::get('/zip/{id}', GetZipController::class)->name('zip');
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App\Console;
|
namespace App\Console;
|
||||||
|
|
||||||
use Illuminate\Console\Scheduling\Schedule;
|
use Illuminate\Console\Scheduling\Schedule;
|
||||||
use App\Console\Commands\SetupDevEnvironment;
|
use App\Console\Commands\SetupDevEnvironment;
|
||||||
use App\Console\Commands\SetupProdEnvironment;
|
use App\Console\Commands\SetupProdEnvironment;
|
||||||
use Support\Scheduler\Actions\DeleteOldZipsAction;
|
|
||||||
use Support\Scheduler\Actions\DeleteFailedFilesAction;
|
use Support\Scheduler\Actions\DeleteFailedFilesAction;
|
||||||
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
||||||
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
|
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
|
||||||
@@ -27,22 +27,20 @@ class Kernel extends ConsoleKernel
|
|||||||
*/
|
*/
|
||||||
protected function schedule(Schedule $schedule): void
|
protected function schedule(Schedule $schedule): void
|
||||||
{
|
{
|
||||||
|
if (!is_storage_driver(['local'])) {
|
||||||
|
$schedule->call(
|
||||||
|
fn() => resolve(DeleteFailedFilesAction::class)()
|
||||||
|
)->everySixHours();
|
||||||
|
}
|
||||||
|
|
||||||
$schedule->call(
|
$schedule->call(
|
||||||
fn () => resolve(DeleteExpiredShareLinksAction::class)()
|
fn() => resolve(DeleteExpiredShareLinksAction::class)()
|
||||||
)->everyTenMinutes();
|
)->everyTenMinutes();
|
||||||
|
|
||||||
$schedule->call(
|
$schedule->call(
|
||||||
fn () => resolve(DeleteUnverifiedUsersAction::class)()
|
fn() => resolve(DeleteUnverifiedUsersAction::class)()
|
||||||
)->daily();
|
)->daily();
|
||||||
|
|
||||||
$schedule->call(function () {
|
|
||||||
resolve(DeleteOldZipsAction::class)();
|
|
||||||
|
|
||||||
if (! is_storage_driver(['local'])) {
|
|
||||||
resolve(DeleteFailedFilesAction::class)();
|
|
||||||
}
|
|
||||||
})->everySixHours();
|
|
||||||
|
|
||||||
// Run queue jobs every minute
|
// Run queue jobs every minute
|
||||||
$schedule->command('queue:work --stop-when-empty')
|
$schedule->command('queue:work --stop-when-empty')
|
||||||
->everyMinute()
|
->everyMinute()
|
||||||
|
|||||||
@@ -83,15 +83,6 @@ class ShareController extends Controller
|
|||||||
->where('user_id', Auth::id())
|
->where('user_id', Auth::id())
|
||||||
->firstOrFail()
|
->firstOrFail()
|
||||||
->delete();
|
->delete();
|
||||||
|
|
||||||
// Get zip record if exist
|
|
||||||
$zip = Zip::where('shared_token', $token)
|
|
||||||
->where('user_id', Auth::id())
|
|
||||||
->first();
|
|
||||||
|
|
||||||
if ($zip) {
|
|
||||||
$zip->delete();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return response('Done!', 204);
|
return response('Done!', 204);
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Domain\Zip\Controllers;
|
|
||||||
|
|
||||||
use Domain\Zip\Models\Zip;
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
|
||||||
use Illuminate\Support\Facades\Storage;
|
|
||||||
use Domain\Traffic\Actions\RecordDownloadAction;
|
|
||||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
|
||||||
|
|
||||||
class GetZipController extends Controller
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
private RecordDownloadAction $recordDownload,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get generated zip for user
|
|
||||||
*/
|
|
||||||
public function __invoke(
|
|
||||||
string $id,
|
|
||||||
): StreamedResponse {
|
|
||||||
$disk = Storage::disk('local');
|
|
||||||
|
|
||||||
$zip = Zip::whereId($id)
|
|
||||||
->where('user_id', Auth::id())
|
|
||||||
->firstOrFail();
|
|
||||||
|
|
||||||
// Store user download size
|
|
||||||
($this->recordDownload)(
|
|
||||||
file_size: $disk->size("zip/$zip->basename"),
|
|
||||||
user_id: $zip->user_id,
|
|
||||||
);
|
|
||||||
|
|
||||||
return $disk->download("zip/$zip->basename", $zip->basename, [
|
|
||||||
'Content-Type' => 'application/zip',
|
|
||||||
'Content-Length' => $disk->size("zip/$zip->basename"),
|
|
||||||
'Accept-Ranges' => 'bytes',
|
|
||||||
'Content-Range' => 'bytes 0-600/' . $disk->size("zip/$zip->basename"),
|
|
||||||
'Content-Disposition' => "attachment; filename=$zip->basename",
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Domain\Zip\Controllers;
|
|
||||||
|
|
||||||
use Domain\Zip\Models\Zip;
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Support\Facades\Storage;
|
|
||||||
use Domain\Traffic\Actions\RecordDownloadAction;
|
|
||||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
|
||||||
|
|
||||||
class VisitorGetZipController extends Controller
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
private RecordDownloadAction $recordDownload,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get generated zip for visitor
|
|
||||||
*/
|
|
||||||
public function __invoke(
|
|
||||||
$id,
|
|
||||||
$token,
|
|
||||||
): StreamedResponse {
|
|
||||||
$disk = Storage::disk('local');
|
|
||||||
|
|
||||||
$zip = Zip::where('id', $id)
|
|
||||||
->where('shared_token', $token)
|
|
||||||
->first();
|
|
||||||
|
|
||||||
// Store user download size
|
|
||||||
($this->recordDownload)(
|
|
||||||
file_size: $disk->size("zip/$zip->basename"),
|
|
||||||
user_id: $zip->user_id,
|
|
||||||
);
|
|
||||||
|
|
||||||
return $disk->download("zip/$zip->basename", $zip->basename, [
|
|
||||||
'Content-Type' => 'application/zip',
|
|
||||||
'Content-Length' => $disk->size("zip/$zip->basename"),
|
|
||||||
'Accept-Ranges' => 'bytes',
|
|
||||||
'Content-Range' => 'bytes 0-600/' . $disk->size("zip/$zip->basename"),
|
|
||||||
'Content-Disposition' => 'attachment; filename=' . $zip->basename,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Domain\Zip\Models;
|
|
||||||
|
|
||||||
use App\Users\Models\User;
|
|
||||||
use Illuminate\Support\Str;
|
|
||||||
use Database\Factories\ZipFactory;
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
|
||||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @property string basename
|
|
||||||
* @property string shared_token
|
|
||||||
* @property string id
|
|
||||||
* @property string user_id
|
|
||||||
* @property string created_at
|
|
||||||
* @property string updated_at
|
|
||||||
* @method static where(string $string, string $string1, string $toDateTimeString)
|
|
||||||
*/
|
|
||||||
class Zip extends Model
|
|
||||||
{
|
|
||||||
use HasFactory;
|
|
||||||
|
|
||||||
protected $guarded = ['id'];
|
|
||||||
|
|
||||||
public $incrementing = false;
|
|
||||||
|
|
||||||
protected $keyType = 'string';
|
|
||||||
|
|
||||||
protected static function newFactory(): ZipFactory
|
|
||||||
{
|
|
||||||
return ZipFactory::new();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function user(): HasOne
|
|
||||||
{
|
|
||||||
return $this->hasOne(User::class, 'id', 'user_id');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static function boot()
|
|
||||||
{
|
|
||||||
parent::boot();
|
|
||||||
|
|
||||||
static::creating(function ($model) {
|
|
||||||
$model->id = (string) Str::uuid();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Support\Scheduler\Actions;
|
|
||||||
|
|
||||||
use Domain\Zip\Models\Zip;
|
|
||||||
use Illuminate\Support\Facades\Storage;
|
|
||||||
|
|
||||||
class DeleteOldZipsAction
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Delete old zips
|
|
||||||
*/
|
|
||||||
public function __invoke(): void
|
|
||||||
{
|
|
||||||
Zip::where('created_at', '<=', now()->subDay()->toDateTimeString())
|
|
||||||
->get()
|
|
||||||
->each(function ($zip) {
|
|
||||||
// Delete zip file
|
|
||||||
Storage::disk('local')->delete("zip/$zip->basename");
|
|
||||||
|
|
||||||
// Delete zip record
|
|
||||||
$zip->delete();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -264,11 +264,6 @@ class AdminTest extends TestCase
|
|||||||
$user->favouriteFolders()->attach($folder->id);
|
$user->favouriteFolders()->attach($folder->id);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create zips
|
|
||||||
Zip::factory(Zip::class)
|
|
||||||
->count(2)
|
|
||||||
->create(['user_id' => $user->id]);
|
|
||||||
|
|
||||||
// Create shares
|
// Create shares
|
||||||
Share::factory(Share::class)
|
Share::factory(Share::class)
|
||||||
->count(2)
|
->count(2)
|
||||||
@@ -334,10 +329,6 @@ class AdminTest extends TestCase
|
|||||||
'user_id' => $user->id,
|
'user_id' => $user->id,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertDatabaseMissing('zips', [
|
|
||||||
'user_id' => $user->id,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$file_ids
|
$file_ids
|
||||||
->each(function ($id, $index) use ($user) {
|
->each(function ($id, $index) use ($user) {
|
||||||
Storage::disk('local')
|
Storage::disk('local')
|
||||||
|
|||||||
@@ -97,30 +97,6 @@ class ContentAccessTest extends TestCase
|
|||||||
->assertStatus(200);
|
->assertStatus(200);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @test
|
|
||||||
*/
|
|
||||||
public function it_get_private_user_zip()
|
|
||||||
{
|
|
||||||
$user = User::factory(User::class)
|
|
||||||
->create();
|
|
||||||
|
|
||||||
$file = UploadedFile::fake()
|
|
||||||
->create('archive.zip', 2000, 'application/zip');
|
|
||||||
|
|
||||||
Storage::putFileAs('zip', $file, 'EHWKcuvKzA4Gv29v-archive.zip');
|
|
||||||
|
|
||||||
$zip = Zip::factory(Zip::class)->create([
|
|
||||||
'basename' => 'EHWKcuvKzA4Gv29v-archive.zip',
|
|
||||||
'user_id' => $user->id,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this
|
|
||||||
->actingAs($user)
|
|
||||||
->get("zip/$zip->id")
|
|
||||||
->assertOk();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
*/
|
*/
|
||||||
@@ -175,29 +151,6 @@ class ContentAccessTest extends TestCase
|
|||||||
->assertStatus(404);
|
->assertStatus(404);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @test
|
|
||||||
*/
|
|
||||||
public function logged_user_try_to_get_another_private_user_zip()
|
|
||||||
{
|
|
||||||
$user = User::factory(User::class)
|
|
||||||
->create();
|
|
||||||
|
|
||||||
$file = UploadedFile::fake()
|
|
||||||
->create('archive.zip', 2000, 'application/zip');
|
|
||||||
|
|
||||||
Storage::putFileAs('zip', $file, 'EHWKcuvKzA4Gv29v-archive.zip');
|
|
||||||
|
|
||||||
$zip = Zip::factory(Zip::class)->create([
|
|
||||||
'basename' => 'EHWKcuvKzA4Gv29v-archive.zip',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this
|
|
||||||
->actingAs($user)
|
|
||||||
->get("zip/$zip->id")
|
|
||||||
->assertNotFound();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
*/
|
*/
|
||||||
@@ -207,15 +160,6 @@ class ContentAccessTest extends TestCase
|
|||||||
->assertRedirect();
|
->assertRedirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @test
|
|
||||||
*/
|
|
||||||
public function guest_try_to_get_private_user_zip()
|
|
||||||
{
|
|
||||||
$this->get('zip/EHWKcuvKzA4Gv29v-archive.zip')
|
|
||||||
->assertRedirect();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -186,57 +186,4 @@ class VisitorAccessToItemsTest extends TestCase
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @test
|
|
||||||
*/
|
|
||||||
public function it_download_publicly_zipped_files()
|
|
||||||
{
|
|
||||||
collect([true, false])
|
|
||||||
->each(function ($is_protected) {
|
|
||||||
$user = User::factory(User::class)
|
|
||||||
->create();
|
|
||||||
|
|
||||||
$share = Share::factory(Share::class)
|
|
||||||
->create([
|
|
||||||
'user_id' => $user->id,
|
|
||||||
'type' => 'folder',
|
|
||||||
'is_protected' => $is_protected,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$zip = Zip::factory(Zip::class)->create([
|
|
||||||
'basename' => 'EHWKcuvKzA4Gv29v-archive.zip',
|
|
||||||
'user_id' => $user->id,
|
|
||||||
'shared_token' => $share->token,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$file = UploadedFile::fake()
|
|
||||||
->create($zip->basename, 1000, 'application/zip');
|
|
||||||
|
|
||||||
Storage::putFileAs('zip', $file, $file->name);
|
|
||||||
|
|
||||||
if ($is_protected) {
|
|
||||||
$cookie = [
|
|
||||||
'share_session' => json_encode([
|
|
||||||
'token' => $share->token,
|
|
||||||
'authenticated' => true,
|
|
||||||
]),
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->withCookies($cookie)
|
|
||||||
->get("/zip/$zip->id/$share->token")
|
|
||||||
->assertStatus(200);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! $is_protected) {
|
|
||||||
$this->get("/zip/$zip->id/$share->token")
|
|
||||||
->assertStatus(200);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->assertDatabaseMissing('traffic', [
|
|
||||||
'user_id' => $user->id,
|
|
||||||
'download' => null,
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,8 @@ namespace Tests\Support\Scheduler;
|
|||||||
use Storage;
|
use Storage;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
use App\Users\Models\User;
|
use App\Users\Models\User;
|
||||||
use Domain\Zip\Models\Zip;
|
|
||||||
use Domain\Sharing\Models\Share;
|
use Domain\Sharing\Models\Share;
|
||||||
use Illuminate\Http\UploadedFile;
|
use Illuminate\Http\UploadedFile;
|
||||||
use Support\Scheduler\Actions\DeleteOldZipsAction;
|
|
||||||
use Support\Scheduler\Actions\DeleteFailedFilesAction;
|
use Support\Scheduler\Actions\DeleteFailedFilesAction;
|
||||||
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
|
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
|
||||||
use Support\Scheduler\Actions\DeleteExpiredShareLinksAction;
|
use Support\Scheduler\Actions\DeleteExpiredShareLinksAction;
|
||||||
@@ -32,31 +30,6 @@ class SchedulerTest extends TestCase
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @test
|
|
||||||
*/
|
|
||||||
public function it_delete_zips_older_than_one_day()
|
|
||||||
{
|
|
||||||
$file = UploadedFile::fake()
|
|
||||||
->create('archive.zip', 2000, 'application/zip');
|
|
||||||
|
|
||||||
Storage::putFileAs('zip', $file, 'EHWKcuvKzA4Gv29v-archive.zip');
|
|
||||||
|
|
||||||
$zip = Zip::factory(Zip::class)->create([
|
|
||||||
'basename' => 'EHWKcuvKzA4Gv29v-archive.zip',
|
|
||||||
'created_at' => now()->subDay(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
resolve(DeleteOldZipsAction::class)();
|
|
||||||
|
|
||||||
$this->assertDatabaseMissing('zips', [
|
|
||||||
'id' => $zip->id,
|
|
||||||
]);
|
|
||||||
|
|
||||||
Storage::disk('local')
|
|
||||||
->assertMissing('zip/EHWKcuvKzA4Gv29v-archive.zip');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user