From 35682d11f0a297133602be78b84f7d7f6484cc5e Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 16 Jul 2025 14:49:45 -0700 Subject: [PATCH] Add command to clean checkout requests --- .../Commands/CleanOldCheckoutRequests.php | 74 +++++++++++++++++++ .../Console/CleanOldCheckoutRequestsTest.php | 60 +++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 app/Console/Commands/CleanOldCheckoutRequests.php create mode 100644 tests/Feature/Console/CleanOldCheckoutRequestsTest.php diff --git a/app/Console/Commands/CleanOldCheckoutRequests.php b/app/Console/Commands/CleanOldCheckoutRequests.php new file mode 100644 index 0000000000..a96a58a349 --- /dev/null +++ b/app/Console/Commands/CleanOldCheckoutRequests.php @@ -0,0 +1,74 @@ + 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(); + } +} diff --git a/tests/Feature/Console/CleanOldCheckoutRequestsTest.php b/tests/Feature/Console/CleanOldCheckoutRequestsTest.php new file mode 100644 index 0000000000..ce3a62bea4 --- /dev/null +++ b/tests/Feature/Console/CleanOldCheckoutRequestsTest.php @@ -0,0 +1,60 @@ +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]); + } +}