Skip to content

Commit 481e33b

Browse files
fix(restore): clear queue when restore fails
Fixes #65
1 parent ed10233 commit 481e33b

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

src/Jobs/RestoreJob.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
namespace Itiden\Backup\Jobs;
66

77
use Illuminate\Contracts\Queue\ShouldQueue;
8+
use Illuminate\Contracts\Cache\Repository;
89
use Illuminate\Foundation\Queue\Queueable;
910
use Itiden\Backup\Restorer;
11+
use Itiden\Backup\StateManager;
1012
use Statamic\Contracts\Auth\User;
1113

1214
final class RestoreJob implements ShouldQueue
@@ -24,9 +26,17 @@ public function __construct(
2426
/**
2527
* Execute the job.
2628
*/
27-
public function handle(Restorer $backuper): void
29+
public function handle(Restorer $backuper, Repository $cache): void
2830
{
2931
auth()->login($this->user); // ugly but it works;
32+
3033
$backuper->restoreFromId($this->id);
34+
35+
$cache->forget(StateManager::JOB_QUEUED_KEY);
36+
}
37+
38+
public function failed(): void
39+
{
40+
app(Repository::class)->forget(StateManager::JOB_QUEUED_KEY);
3141
}
3242
}

tests/Feature/CreateBackupTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22

33
declare(strict_types=1);
44

5+
use Illuminate\Support\Facades\Cache;
56
use Illuminate\Support\Facades\Event;
67
use Itiden\Backup\Contracts\Repositories\BackupRepository;
78
use Itiden\Backup\DataTransferObjects\BackupDto;
9+
use Itiden\Backup\Enums\State;
810
use Itiden\Backup\Events\BackupCreated;
911
use Itiden\Backup\Events\BackupFailed;
1012
use Itiden\Backup\Exceptions\RestoreFailed;
1113
use Itiden\Backup\Facades\Backuper;
1214
use Itiden\Backup\Facades\Restorer;
15+
use Itiden\Backup\StateManager;
1316
use Itiden\Backup\Tests\SkippingPipe;
1417

1518
use function Itiden\Backup\Tests\user;
@@ -85,6 +88,8 @@
8588
postJson(cp_route('api.itiden.backup.store'));
8689

8790
Event::assertDispatched(BackupFailed::class);
91+
expect(Cache::has(StateManager::JOB_QUEUED_KEY))->toBeFalse();
92+
expect(app(StateManager::class)->getState())->toBe(State::BackupFailed);
8893
});
8994

9095
it('sets created by metadata when user is authenticated', function (): void {

tests/Feature/RestoreBackupTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
declare(strict_types=1);
44

55
use Illuminate\Http\Response;
6+
use Illuminate\Support\Facades\Cache;
67
use Illuminate\Support\Facades\Event;
78
use Illuminate\Support\Facades\File;
89
use Illuminate\Support\Facades\Storage;
10+
use Itiden\Backup\Enums\State;
911
use Itiden\Backup\Events\BackupRestored;
12+
use Itiden\Backup\Events\RestoreFailed;
1013
use Itiden\Backup\Facades\Backuper;
14+
use Itiden\Backup\StateManager;
1115

1216
use function Itiden\Backup\Tests\fixtures_path;
1317
use function Itiden\Backup\Tests\user;
@@ -41,6 +45,24 @@
4145
expect($response->status())->toBe(Response::HTTP_INTERNAL_SERVER_ERROR);
4246
});
4347

48+
it('sets correct states if restore fails', function (): void {
49+
Event::fake();
50+
$backup = Backuper::backup();
51+
52+
$user = user();
53+
54+
$user->assignRole('super admin')->save();
55+
56+
actingAs($user);
57+
58+
config()->set('backup.pipeline', ['im-not-valid']);
59+
postJson(cp_route('api.itiden.backup.restore', $backup->id));
60+
61+
Event::assertDispatched(RestoreFailed::class);
62+
expect(Cache::has(StateManager::JOB_QUEUED_KEY))->toBeFalse();
63+
expect(app(StateManager::class)->getState())->toBe(State::RestoreFailed);
64+
});
65+
4466
it('can restore by id', function (): void {
4567
$backup = Backuper::backup();
4668

0 commit comments

Comments
 (0)