deleted old files

This commit is contained in:
Peter Papp
2021-07-28 18:33:13 +02:00
parent 71a1eb8e7c
commit 6a805b03fa
14 changed files with 9 additions and 361 deletions

View File

@@ -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,
];
}
}

View File

@@ -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');
});

View File

@@ -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()

View File

@@ -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);

View File

@@ -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",
]);
}
}

View File

@@ -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,
]);
}
}

View File

@@ -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();
});
}
}

View File

@@ -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();
});
}
}

View File

@@ -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')

View File

@@ -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
*/

View File

@@ -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,
]);
});
}
}

View File

@@ -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
*/