Skip to content

Commit 05161c3

Browse files
authored
Adjust bulk request cleanup (#3)
* Adjust bulk request cleanup * Pint * Keep operation for at least one hour * Fix test
1 parent 15fa683 commit 05161c3

File tree

3 files changed

+116
-12
lines changed

3 files changed

+116
-12
lines changed

config/magento-async.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
return [
44
'queue' => 'default',
55

6-
/* Cleanup requests after amount of time (hours) */
7-
'cleanup' => 3,
6+
/* Always cleanup bulk requests after amount of time (hours) */
7+
'cleanup' => 168,
88
];

src/Actions/CleanBulkRequests.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
namespace JustBetter\MagentoAsync\Actions;
44

5+
use Illuminate\Database\Eloquent\Builder;
56
use JustBetter\MagentoAsync\Contracts\CleansBulkRequests;
7+
use JustBetter\MagentoAsync\Enums\OperationStatus;
8+
use JustBetter\MagentoAsync\Models\BulkOperation;
69
use JustBetter\MagentoAsync\Models\BulkRequest;
710

811
class CleanBulkRequests implements CleansBulkRequests
@@ -12,8 +15,21 @@ public function clean(): void
1215
/** @var int $cleanupHours */
1316
$cleanupHours = config('magento-async.cleanup');
1417

18+
// Delete completed statuses
19+
BulkOperation::query()
20+
->where('status', '=', OperationStatus::Complete)
21+
->where('updated_at', '<', now()->subHour()) // Keep completed for at least one hour
22+
->delete();
23+
1524
BulkRequest::query()
16-
->where('created_at', '<', now()->subHours($cleanupHours))
25+
// Delete where there are no more operations
26+
->where(function (Builder $query): void {
27+
$query
28+
->whereDoesntHave('operations')
29+
->where('created_at', '<', now()->subHour()); // Never delete within an hour
30+
})
31+
// Always delete after configured cleanup time
32+
->orWhere('created_at', '<', now()->subHours($cleanupHours))
1733
->delete();
1834
}
1935

tests/Actions/CleanBulkRequestsTest.php

Lines changed: 97 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@
22

33
namespace JustBetter\MagentoAsync\Tests\Actions;
44

5+
use Illuminate\Support\Carbon;
56
use JustBetter\MagentoAsync\Actions\CleanBulkRequests;
7+
use JustBetter\MagentoAsync\Enums\OperationStatus;
68
use JustBetter\MagentoAsync\Models\BulkRequest;
79
use JustBetter\MagentoAsync\Tests\TestCase;
10+
use PHPUnit\Framework\Attributes\DataProvider;
811
use PHPUnit\Framework\Attributes\Test;
912

1013
class CleanBulkRequestsTest extends TestCase
1114
{
1215
#[Test]
13-
public function it_deletes_request(): void
16+
public function it_deletes_completed_operations(): void
1417
{
15-
config()->set('magento-async.cleanup', 1);
16-
17-
BulkRequest::query()->create([
18+
/** @var BulkRequest $request */
19+
$request = BulkRequest::query()->create([
1820
'magento_connection' => '::magento-connection::',
1921
'store_code' => '::store-code::',
2022
'path' => '::path::',
@@ -24,22 +26,108 @@ public function it_deletes_request(): void
2426
'created_at' => now(),
2527
]);
2628

27-
BulkRequest::query()->create([
29+
$request->operations()->create([
30+
'operation_id' => 1,
31+
'status' => OperationStatus::Complete,
32+
'updated_at' => now()->subHours(2),
33+
]);
34+
35+
$request->operations()->create([
36+
'operation_id' => 2,
37+
'status' => OperationStatus::Complete,
38+
]);
39+
40+
$request->operations()->create([
41+
'operation_id' => 3,
42+
'status' => OperationStatus::Open,
43+
]);
44+
45+
/** @var CleanBulkRequests $action */
46+
$action = app(CleanBulkRequests::class);
47+
$action->clean();
48+
49+
$this->assertEquals(2, $request->operations()->count());
50+
}
51+
52+
/** @param array<string, mixed> $operations */
53+
#[Test]
54+
#[DataProvider('cases')]
55+
public function it_deletes_request(Carbon $requestCreatedAt, array $operations, bool $shouldBeDeleted): void
56+
{
57+
config()->set('magento-async.cleanup', 2);
58+
59+
/** @var BulkRequest $request */
60+
$request = BulkRequest::query()->create([
2861
'magento_connection' => '::magento-connection::',
2962
'store_code' => '::store-code::',
3063
'path' => '::path::',
31-
'bulk_uuid' => '::bulk-uuid-2::',
64+
'bulk_uuid' => '::bulk-uuid-1::',
3265
'request' => [],
3366
'response' => [],
34-
'created_at' => now()->subHours(2),
67+
'created_at' => $requestCreatedAt,
3568
]);
3669

70+
foreach ($operations as $operation) {
71+
$request->operations()->create($operation);
72+
}
73+
3774
/** @var CleanBulkRequests $action */
3875
$action = app(CleanBulkRequests::class);
3976
$action->clean();
4077

41-
$this->assertNotNull(BulkRequest::query()->firstWhere('bulk_uuid', '=', '::bulk-uuid-1::'));
42-
$this->assertNull(BulkRequest::query()->firstWhere('bulk_uuid', '=', '::bulk-uuid-2::'));
78+
$deleted = BulkRequest::query()->firstWhere('bulk_uuid', '=', '::bulk-uuid-1::') === null;
79+
$this->assertEquals($shouldBeDeleted, $deleted);
80+
}
81+
82+
/** @return array<string, mixed> */
83+
public static function cases(): array
84+
{
85+
return [
86+
'Pending operation' => [
87+
'requestCreatedAt' => now(),
88+
'operations' => [
89+
[
90+
'operation_id' => 1,
91+
'status' => null,
92+
],
93+
],
94+
'shouldBeDeleted' => false,
95+
],
96+
97+
'Completed operations' => [
98+
'requestCreatedAt' => now()->subHours(2),
99+
'operations' => [
100+
[
101+
'operation_id' => 1,
102+
'status' => OperationStatus::Complete,
103+
'updated_at' => now()->subHours(2),
104+
],
105+
],
106+
'shouldBeDeleted' => true,
107+
],
108+
109+
'Failed operations' => [
110+
'requestCreatedAt' => now()->subHours(1),
111+
'operations' => [
112+
[
113+
'operation_id' => 1,
114+
'status' => OperationStatus::RetriablyFailed,
115+
],
116+
],
117+
'shouldBeDeleted' => false,
118+
],
119+
120+
'Cleanup time' => [
121+
'requestCreatedAt' => now()->subWeek(),
122+
'operations' => [
123+
[
124+
'operation_id' => 1,
125+
'status' => OperationStatus::RetriablyFailed,
126+
],
127+
],
128+
'shouldBeDeleted' => true,
129+
],
43130

131+
];
44132
}
45133
}

0 commit comments

Comments
 (0)