feat(failed-jobs): add database-agnostic failed jobs with bulk actions

- Create custom implementation to replace vendor plugin
  - Add database-agnostic JSON queries (MySQL, MariaDB, PG, SQLite, SQLSRV)
  - Implement Retry/Prune header actions with queue selection
  - Maintain all original features: filters, search, actions, bulk operations

  BREAKING CHANGE: New route /failed-jobs/compatible-failed-jobs

  Fixes MariaDB JSON syntax errors
This commit is contained in:
idevakk
2025-12-02 10:23:55 -08:00
parent d767c6cf59
commit 2eaf38e139
4 changed files with 252 additions and 2 deletions

View File

@@ -0,0 +1,68 @@
<?php
namespace App\Filament\Resources\FailedJobs\Pages;
use App\Filament\Resources\FailedJobs\CompatibleFailedJobResource;
use BinaryBuilds\FilamentFailedJobs\Models\FailedJob;
use Filament\Actions\Action;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Pages\ListRecords;
use Illuminate\Support\Facades\Artisan;
class CompatibleListFailedJobs extends ListRecords
{
protected static string $resource = CompatibleFailedJobResource::class;
protected function getHeaderActions(): array
{
return [
Action::make(__('Retry Jobs'))
->requiresConfirmation()
->schema(function () {
$queues = FailedJob::query()
->select('queue')
->distinct()
->pluck('queue')
->toArray();
$options = [
'all' => 'All Queues',
];
$descriptions = [
'all' => 'Retry all Jobs',
];
foreach ($queues as $queue) {
$options[$queue] = $queue;
$descriptions[$queue] = 'Retry jobs from '.$queue.' queue';
}
return [
Radio::make('queue')
->options($options)
->descriptions($descriptions)
->default('all')
->required(),
];
})
->successNotificationTitle(__('Jobs pushed to queue successfully!'))
->action(fn (array $data) => Artisan::call('queue:retry '.$data['queue'])),
Action::make(__('Prune Jobs'))
->requiresConfirmation()
->schema([
TextInput::make('hours')
->numeric()
->required()
->default(1)
->helperText(__("Prune's all failed jobs older than given hours.")),
])
->color('danger')
->successNotificationTitle(__('Jobs pruned successfully!'))
->action(fn (array $data) => Artisan::call('queue:prune-failed --hours='.$data['hours'])),
];
}
}