mirror of
https://github.com/grokability/snipe-it.git
synced 2026-03-12 17:52:00 +08:00
Add command to clean checkout requests
This commit is contained in:
74
app/Console/Commands/CleanOldCheckoutRequests.php
Normal file
74
app/Console/Commands/CleanOldCheckoutRequests.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\CheckoutRequest;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class CleanOldCheckoutRequests extends Command
|
||||
{
|
||||
private int $deletions = 0;
|
||||
private int $skips = 0;
|
||||
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'snipeit:clean-old-checkout-requests';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Removes checkout requests that reference deleted assets or users.';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$requests = CheckoutRequest::with([
|
||||
'user' => function ($query) {
|
||||
$query->withTrashed();
|
||||
},
|
||||
'requestedItem' => function ($query) {
|
||||
$query->withTrashed();
|
||||
},
|
||||
])->get();
|
||||
|
||||
$this->info("Processing {$requests->count()} checkout requests");
|
||||
|
||||
$this->withProgressBar($requests, function ($request) {
|
||||
if ($this->shouldForceDelete($request)) {
|
||||
$request->forceDelete();
|
||||
$this->deletions++;
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->shouldSoftDelete($request)) {
|
||||
$request->delete();
|
||||
$this->deletions++;
|
||||
return;
|
||||
}
|
||||
|
||||
$this->skips++;
|
||||
});
|
||||
|
||||
$this->info("Final deletion count: $this->deletions, and skip count: $this->skips");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private function shouldForceDelete(CheckoutRequest $request)
|
||||
{
|
||||
// check if the requestable or user relationship is null
|
||||
return !$request->requestable || !$request->user;
|
||||
}
|
||||
|
||||
private function shouldSoftDelete(CheckoutRequest $request)
|
||||
{
|
||||
return $request->requestable->trashed() || $request->user->trashed();
|
||||
}
|
||||
}
|
||||
60
tests/Feature/Console/CleanOldCheckoutRequestsTest.php
Normal file
60
tests/Feature/Console/CleanOldCheckoutRequestsTest.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature\Console;
|
||||
|
||||
use App\Models\Asset;
|
||||
use App\Models\CheckoutRequest;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Tests\TestCase;
|
||||
|
||||
class CleanOldCheckoutRequestsTest extends TestCase
|
||||
{
|
||||
public function test_clean_old_checkout_requests_command_for_soft_deleted_asset()
|
||||
{
|
||||
$validRequest = CheckoutRequest::factory()->create();
|
||||
|
||||
$requestForSoftDeletedAsset = CheckoutRequest::factory()->create();
|
||||
$this->assertInstanceOf(Asset::class, $requestForSoftDeletedAsset->requestedItem);
|
||||
Model::withoutEvents(fn() => $requestForSoftDeletedAsset->requestedItem->delete());
|
||||
|
||||
$this->artisan('snipeit:clean-old-checkout-requests')->assertExitCode(0);
|
||||
|
||||
$this->assertNotSoftDeleted($validRequest);
|
||||
$this->assertSoftDeleted($requestForSoftDeletedAsset->fresh());
|
||||
}
|
||||
|
||||
public function test_clean_old_checkout_requests_command_for_missing_asset()
|
||||
{
|
||||
$validRequest = CheckoutRequest::factory()->create();
|
||||
$missingAsset = CheckoutRequest::factory()->create(['requestable_id' => 99999999]);
|
||||
|
||||
$this->artisan('snipeit:clean-old-checkout-requests')->assertExitCode(0);
|
||||
|
||||
$this->assertNotSoftDeleted($validRequest);
|
||||
$this->assertDatabaseMissing('checkout_requests', ['requestable_id' => $missingAsset->requestable_id]);
|
||||
}
|
||||
|
||||
public function test_clean_old_checkout_requests_command_for_soft_deleted_user()
|
||||
{
|
||||
$validRequest = CheckoutRequest::factory()->create();
|
||||
|
||||
$requestForSoftDeletedUser = CheckoutRequest::factory()->create();
|
||||
Model::withoutEvents(fn() => $requestForSoftDeletedUser->user->delete());
|
||||
|
||||
$this->artisan('snipeit:clean-old-checkout-requests')->assertExitCode(0);
|
||||
|
||||
$this->assertNotSoftDeleted($validRequest);
|
||||
$this->assertSoftDeleted($requestForSoftDeletedUser->fresh());
|
||||
}
|
||||
|
||||
public function test_clean_old_checkout_requests_command_for_missing_user()
|
||||
{
|
||||
$validRequest = CheckoutRequest::factory()->create();
|
||||
$missingUser = CheckoutRequest::factory()->create(['user_id' => 99999999]);
|
||||
|
||||
$this->artisan('snipeit:clean-old-checkout-requests')->assertExitCode(0);
|
||||
|
||||
$this->assertNotSoftDeleted($validRequest);
|
||||
$this->assertDatabaseMissing('checkout_requests', ['user_id' => $missingUser->user_id]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user