mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-05 18:23:48 +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
|
||||
|
||||
// Get avatars and system images
|
||||
use Domain\Zip\Controllers\GetZipController;
|
||||
use App\Users\Controllers\GetAvatarController;
|
||||
use Domain\Zip\Controllers\VisitorGetZipController;
|
||||
use Domain\Settings\Controllers\GetAppImageController;
|
||||
use Domain\Files\Controllers\FileAccess\GetFileController;
|
||||
use Domain\Files\Controllers\FileAccess\GetThumbnailController;
|
||||
@@ -15,12 +13,10 @@ Route::get('/system/{image}', GetAppImageController::class);
|
||||
|
||||
// Get public thumbnails and files
|
||||
Route::get('/thumbnail/{name}/{shared}', VisitorGetThumbnailController::class);
|
||||
Route::get('/zip/{id}/public/{token}', VisitorGetZipController::class);
|
||||
Route::get('/file/{name}/{shared}', VisitorGetFileController::class);
|
||||
|
||||
// User master,editor,visitor access to image thumbnails and file downloads
|
||||
Route::group(['middleware' => ['auth:sanctum']], function () {
|
||||
Route::get('/thumbnail/{name}', GetThumbnailController::class)->name('thumbnail');
|
||||
Route::get('/file/{name}', GetFileController::class)->name('file');
|
||||
Route::get('/zip/{id}', GetZipController::class)->name('zip');
|
||||
});
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console;
|
||||
|
||||
use Illuminate\Console\Scheduling\Schedule;
|
||||
use App\Console\Commands\SetupDevEnvironment;
|
||||
use App\Console\Commands\SetupProdEnvironment;
|
||||
use Support\Scheduler\Actions\DeleteOldZipsAction;
|
||||
use Support\Scheduler\Actions\DeleteFailedFilesAction;
|
||||
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
||||
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
|
||||
@@ -27,22 +27,20 @@ class Kernel extends ConsoleKernel
|
||||
*/
|
||||
protected function schedule(Schedule $schedule): void
|
||||
{
|
||||
if (!is_storage_driver(['local'])) {
|
||||
$schedule->call(
|
||||
fn() => resolve(DeleteFailedFilesAction::class)()
|
||||
)->everySixHours();
|
||||
}
|
||||
|
||||
$schedule->call(
|
||||
fn () => resolve(DeleteExpiredShareLinksAction::class)()
|
||||
fn() => resolve(DeleteExpiredShareLinksAction::class)()
|
||||
)->everyTenMinutes();
|
||||
|
||||
$schedule->call(
|
||||
fn () => resolve(DeleteUnverifiedUsersAction::class)()
|
||||
fn() => resolve(DeleteUnverifiedUsersAction::class)()
|
||||
)->daily();
|
||||
|
||||
$schedule->call(function () {
|
||||
resolve(DeleteOldZipsAction::class)();
|
||||
|
||||
if (! is_storage_driver(['local'])) {
|
||||
resolve(DeleteFailedFilesAction::class)();
|
||||
}
|
||||
})->everySixHours();
|
||||
|
||||
// Run queue jobs every minute
|
||||
$schedule->command('queue:work --stop-when-empty')
|
||||
->everyMinute()
|
||||
|
||||
@@ -83,15 +83,6 @@ class ShareController extends Controller
|
||||
->where('user_id', Auth::id())
|
||||
->firstOrFail()
|
||||
->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);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
// Create zips
|
||||
Zip::factory(Zip::class)
|
||||
->count(2)
|
||||
->create(['user_id' => $user->id]);
|
||||
|
||||
// Create shares
|
||||
Share::factory(Share::class)
|
||||
->count(2)
|
||||
@@ -334,10 +329,6 @@ class AdminTest extends TestCase
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
|
||||
$this->assertDatabaseMissing('zips', [
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
|
||||
$file_ids
|
||||
->each(function ($id, $index) use ($user) {
|
||||
Storage::disk('local')
|
||||
|
||||
@@ -97,30 +97,6 @@ class ContentAccessTest extends TestCase
|
||||
->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
|
||||
*/
|
||||
@@ -175,29 +151,6 @@ class ContentAccessTest extends TestCase
|
||||
->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
|
||||
*/
|
||||
@@ -207,15 +160,6 @@ class ContentAccessTest extends TestCase
|
||||
->assertRedirect();
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function guest_try_to_get_private_user_zip()
|
||||
{
|
||||
$this->get('zip/EHWKcuvKzA4Gv29v-archive.zip')
|
||||
->assertRedirect();
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 Tests\TestCase;
|
||||
use App\Users\Models\User;
|
||||
use Domain\Zip\Models\Zip;
|
||||
use Domain\Sharing\Models\Share;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Support\Scheduler\Actions\DeleteOldZipsAction;
|
||||
use Support\Scheduler\Actions\DeleteFailedFilesAction;
|
||||
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
|
||||
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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user