Skip to content

Commit 2e59f0d

Browse files
author
Алексей Тихомиров
committed
fix(rest-api): add missing REST API endpoints for E2E tests
- Add GET /queues/{queue} endpoint for single queue info - Add GET /queues/{queue}/jobs endpoint for queue jobs list - Add POST /queues/{queue}/process endpoint for queue processing - Add GET /stats endpoint for queue statistics - Support 'status' parameter in /logs endpoint (alias for 'filter') Fixes failing E2E test: REST API endpoint /queues/{queue}
1 parent 30221e7 commit 2e59f0d

1 file changed

Lines changed: 117 additions & 1 deletion

File tree

src/Admin/RestApi.php

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,24 @@ public function registerRoutes(): void
2626
'permission_callback' => [$this, 'checkPermission'],
2727
]);
2828

29+
register_rest_route($namespace, '/queues/(?P<queue>[a-z0-9_-]+)', [
30+
'methods' => 'GET',
31+
'callback' => [$this, 'getQueue'],
32+
'permission_callback' => [$this, 'checkPermission'],
33+
]);
34+
35+
register_rest_route($namespace, '/queues/(?P<queue>[a-z0-9_-]+)/jobs', [
36+
'methods' => 'GET',
37+
'callback' => [$this, 'getQueueJobs'],
38+
'permission_callback' => [$this, 'checkPermission'],
39+
]);
40+
41+
register_rest_route($namespace, '/queues/(?P<queue>[a-z0-9_-]+)/process', [
42+
'methods' => 'POST',
43+
'callback' => [$this, 'processQueue'],
44+
'permission_callback' => [$this, 'checkPermission'],
45+
]);
46+
2947
register_rest_route($namespace, '/queues/(?P<queue>[a-z0-9_-]+)/pause', [
3048
'methods' => 'POST',
3149
'callback' => [$this, 'pauseQueue'],
@@ -50,6 +68,12 @@ public function registerRoutes(): void
5068
'permission_callback' => [$this, 'checkPermission'],
5169
]);
5270

71+
register_rest_route($namespace, '/stats', [
72+
'methods' => 'GET',
73+
'callback' => [$this, 'getStats'],
74+
'permission_callback' => [$this, 'checkPermission'],
75+
]);
76+
5377
register_rest_route($namespace, '/logs', [
5478
'methods' => 'GET',
5579
'callback' => [$this, 'getLogs'],
@@ -157,6 +181,98 @@ public function getQueues(): WP_REST_Response
157181
return new WP_REST_Response($queues);
158182
}
159183

184+
public function getQueue(WP_REST_Request $request): WP_REST_Response|WP_Error
185+
{
186+
$queueName = $request->get_param('queue');
187+
$optionName = 'wp_queue_jobs_'.$queueName;
188+
189+
// Проверяем существование очереди
190+
$jobs = get_site_option($optionName, null);
191+
192+
// Очередь существует если есть задачи или это очередь default
193+
if ($jobs === null && $queueName !== 'default') {
194+
return new WP_Error('queue_not_found', 'Queue not found', ['status' => 404]);
195+
}
196+
197+
$jobs = $jobs ?? [];
198+
199+
return new WP_REST_Response([
200+
'name' => $queueName,
201+
'size' => count($jobs),
202+
'status' => WPQueue::isPaused($queueName) ? 'paused' : 'active',
203+
'processing' => WPQueue::isProcessing($queueName),
204+
]);
205+
}
206+
207+
public function getQueueJobs(WP_REST_Request $request): WP_REST_Response
208+
{
209+
$queueName = $request->get_param('queue');
210+
$jobs = get_site_option('wp_queue_jobs_'.$queueName, []);
211+
212+
$result = [];
213+
foreach ($jobs as $index => $job) {
214+
$result[] = [
215+
'id' => $index,
216+
'class' => get_class($job),
217+
'attempts' => $job->attempts ?? 0,
218+
'available_at' => $job->availableAt ?? time(),
219+
];
220+
}
221+
222+
return new WP_REST_Response($result);
223+
}
224+
225+
public function processQueue(WP_REST_Request $request): WP_REST_Response
226+
{
227+
$queueName = $request->get_param('queue');
228+
$maxJobs = (int) ($request->get_param('max_jobs') ?? 10);
229+
230+
$worker = WPQueue::worker();
231+
$worker->setMaxJobs($maxJobs);
232+
233+
$processed = 0;
234+
while ($processed < $maxJobs && $worker->runNextJob($queueName)) {
235+
$processed++;
236+
}
237+
238+
return new WP_REST_Response([
239+
'success' => true,
240+
'processed' => $processed,
241+
]);
242+
}
243+
244+
public function getStats(): WP_REST_Response
245+
{
246+
global $wpdb;
247+
248+
$queues = [];
249+
$totalJobs = 0;
250+
251+
$results = $wpdb->get_col(
252+
$wpdb->prepare(
253+
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s",
254+
'wp_queue_jobs_%',
255+
),
256+
);
257+
258+
foreach ($results as $optionName) {
259+
$jobs = get_site_option($optionName, []);
260+
$totalJobs += count($jobs);
261+
}
262+
263+
// Получаем статистику из логов
264+
$logs = WPQueue::logs();
265+
$metrics = $logs->metrics();
266+
267+
return new WP_REST_Response([
268+
'total_queues' => count($results) ?: 1,
269+
'total_jobs' => $totalJobs,
270+
'total_processed' => $metrics['total'] ?? 0,
271+
'total_failed' => $metrics['failed'] ?? 0,
272+
'total_completed' => $metrics['completed'] ?? 0,
273+
]);
274+
}
275+
160276
public function pauseQueue(WP_REST_Request $request): WP_REST_Response
161277
{
162278
$queue = $request->get_param('queue');
@@ -201,7 +317,7 @@ public function runJob(WP_REST_Request $request): WP_REST_Response|WP_Error
201317

202318
public function getLogs(WP_REST_Request $request): WP_REST_Response
203319
{
204-
$filter = $request->get_param('filter') ?? 'all';
320+
$filter = $request->get_param('filter') ?? $request->get_param('status') ?? 'all';
205321
$limit = (int) ($request->get_param('limit') ?? 100);
206322

207323
$logs = match ($filter) {

0 commit comments

Comments
 (0)