• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

daycry / jobs / 24514486770

05 Apr 2026 08:48AM UTC coverage: 53.982% (-2.2%) from 56.164%
24514486770

push

github

daycry
Optimize

50 of 192 new or added lines in 14 files covered. (26.04%)

3 existing lines in 3 files now uncovered.

1220 of 2260 relevant lines covered (53.98%)

4.43 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/Commands/QueuePurgeCommand.php
1
<?php
2

3
declare(strict_types=1);
4

5
/**
6
 * This file is part of Daycry Queues.
7
 *
8
 * (c) Daycry <daycry9@proton.me>
9
 *
10
 * For the full copyright and license information, please view
11
 * the LICENSE file that was distributed with this source code.
12
 */
13

14
namespace Daycry\Jobs\Commands;
15

16
use CodeIgniter\CLI\BaseCommand;
17
use CodeIgniter\CLI\CLI;
18
use Daycry\Jobs\Models\QueueModel;
19

20
/**
21
 * Purge completed or failed jobs from the queue table.
22
 * Essential for maintenance as the queue table grows indefinitely.
23
 */
24
class QueuePurgeCommand extends BaseCommand
25
{
26
    protected $group       = 'Jobs';
27
    protected $name        = 'jobs:queue:purge';
28
    protected $description = 'Purge completed/failed jobs from the queue table';
29
    protected $usage       = 'jobs:queue:purge [options]';
30
    protected $arguments   = [];
31
    protected $options     = [
32
        '--status'  => 'Status to purge: completed, failed, or all (default: completed)',
33
        '--queue'   => 'Purge only a specific queue',
34
        '--before'  => 'Purge jobs created before this date (e.g. "2026-01-01" or "-7 days")',
35
        '--dry-run' => 'Show count without deleting',
36
        '--force'   => 'Skip confirmation prompt',
37
    ];
38

39
    public function run(array $params): void
40
    {
NEW
41
        $status = CLI::getOption('status') ?? 'completed';
×
NEW
42
        $queue  = CLI::getOption('queue');
×
NEW
43
        $before = CLI::getOption('before');
×
NEW
44
        $dryRun = CLI::getOption('dry-run') !== null || array_key_exists('dry-run', $params);
×
NEW
45
        $force  = CLI::getOption('force') !== null || array_key_exists('force', $params);
×
46

NEW
47
        $validStatuses = ['completed', 'failed', 'all'];
×
NEW
48
        if (! in_array($status, $validStatuses, true)) {
×
NEW
49
            CLI::error("Invalid --status value '{$status}'. Use: completed, failed, or all");
×
50

NEW
51
            return;
×
52
        }
53

NEW
54
        $queueModel = new QueueModel();
×
55

56
        // Build query
NEW
57
        if ($status !== 'all') {
×
NEW
58
            $queueModel->where('status', $status);
×
59
        } else {
NEW
60
            $queueModel->whereIn('status', ['completed', 'failed']);
×
61
        }
62

NEW
63
        if ($queue) {
×
NEW
64
            $queueModel->where('queue', $queue);
×
65
        }
66

NEW
67
        if ($before) {
×
NEW
68
            $timestamp = strtotime($before);
×
NEW
69
            if ($timestamp === false) {
×
NEW
70
                CLI::error("Invalid --before date format: '{$before}'");
×
71

NEW
72
                return;
×
73
            }
NEW
74
            $queueModel->where('created_at <', date('Y-m-d H:i:s', $timestamp));
×
75
        }
76

NEW
77
        $count = $queueModel->countAllResults(false);
×
78

NEW
79
        if ($count === 0) {
×
NEW
80
            CLI::write('No matching jobs found to purge.', 'yellow');
×
81

NEW
82
            return;
×
83
        }
84

NEW
85
        $label = $queue ? "in queue '{$queue}'" : 'across all queues';
×
NEW
86
        CLI::write("Found {$count} {$status} job(s) {$label} to purge.", 'yellow');
×
87

NEW
88
        if ($dryRun) {
×
NEW
89
            CLI::write('[Dry Run] No records were deleted.', 'cyan');
×
90

NEW
91
            return;
×
92
        }
93

NEW
94
        if (! $force) {
×
NEW
95
            $confirm = CLI::prompt('Are you sure you want to delete these records?', ['y', 'n']);
×
NEW
96
            if ($confirm !== 'y') {
×
NEW
97
                CLI::write('Purge cancelled.', 'yellow');
×
98

NEW
99
                return;
×
100
            }
101
        }
102

103
        // Re-build query for deletion (countAllResults with false resets the query partially)
NEW
104
        $deleteModel = new QueueModel();
×
105

NEW
106
        if ($status !== 'all') {
×
NEW
107
            $deleteModel->where('status', $status);
×
108
        } else {
NEW
109
            $deleteModel->whereIn('status', ['completed', 'failed']);
×
110
        }
111

NEW
112
        if ($queue) {
×
NEW
113
            $deleteModel->where('queue', $queue);
×
114
        }
115

NEW
116
        if ($before) {
×
NEW
117
            $deleteModel->where('created_at <', date('Y-m-d H:i:s', strtotime($before)));
×
118
        }
119

NEW
120
        $deleted = $deleteModel->delete();
×
121

NEW
122
        if ($deleted) {
×
NEW
123
            CLI::write("Successfully purged {$count} job(s).", 'green');
×
124
        } else {
NEW
125
            CLI::error('Failed to purge jobs. Check database connection.');
×
126
        }
127
    }
128
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc