Jake Vanderwerf
2026-08-28 a9654f00c8fbc9934289d761843ddd071025013f
inc/rest/routes/QueueRoutes.php
@@ -1,8 +1,10 @@
<?php
namespace JVBase\rest\routes;
use JVBase\Instance;
use JVBase\managers\Cache;
use JVBase\managers\queue\Operation;
use JVBase\managers\queue\Queue;
use JVBase\rest\Rest;
use JVBase\rest\Route;
use JVBase\rest\Response;
@@ -15,15 +17,15 @@
class QueueRoutes extends Rest
{
   use Instance;
   public function __construct()
   {
      $this->cacheName = 'queue';
      $this->cacheTtl = 300;
      parent::__construct();
      $this->cache = Cache::for($this->cacheName, 'custom', $this->cacheTtl)->user();
      if (JVB_TESTING) {
         $this->cache->flush();
      }
   }
   /**
@@ -41,14 +43,14 @@
            'limit' => 'integer|default:50|min:1|max:100',
         ])
         ->auth('user')
         ->rateLimit(30)
         ->rateLimit()
         ->post([$this, 'handleAction'])
         ->args([
            'ids' => 'array|required',
            'action' => 'string|required|enum:dismiss,retry,cancel',
         ])
         ->auth('user')
         ->rateLimit(30)
         ->rateLimit()
         ->register();
      // Poll endpoint
@@ -59,14 +61,14 @@
            'ids' => 'string',
         ])
         ->auth('user')
         ->rateLimit(15)
         ->rateLimit()
         ->register();
      // Errors endpoint
      Route::for('queue/errors')
         ->get([$this, 'getOperationErrors'])
         ->auth('user')
         ->rateLimit(15)
         ->rateLimit()
         ->register();
      // Single operation with dynamic ID
@@ -74,7 +76,7 @@
         ->get([$this, 'getOperation'])
         ->arg('id', 'string|required')
         ->auth('user')
         ->rateLimit(15)
         ->rateLimit()
         ->register();
   }
@@ -87,33 +89,20 @@
   public function getQueue(WP_REST_Request $request): WP_REST_Response
   {
      $params = $request->get_params();
      $user_id = absint($params['user']);
      $this->cache = Cache::for($user_id.'_queue');
      $status = sanitize_text_field($params['status']);
      $ids = !empty($params['ids'])
         ? array_map('trim', array_map('sanitize_text_field', explode(',', $params['ids'])))
         : [];
      $limit = absint($params['limit']);
      $cacheKey = $this->cache->generateKey(compact('user_id', 'status', 'ids', 'limit'));
      if ($cached = $this->checkHeaders($request, $cacheKey)) {
         return $cached;
      $user_id = get_current_user_id();
      if (!$user_id) {
         return $this->unauthorized();
      }
      $data = $this->cache->tag("user:{$user_id}")->remember($cacheKey, function() use ($user_id, $params) {
         $filters = $this->buildFilters($params);
         $operations = JVB()->queue()->getUserOperations($user_id, $filters);
      $filters = $this->buildFilters($params);
      $ops = Queue::getInstance()->getUserOperations($user_id, $filters);
         return [
            'items' => array_map([$this, 'formatOperation'], $operations),
            'total' => count($operations),
            'queue_stats' => $this->getQueueStats($user_id),
            'server_time' => date('c'),
         ];
      });
      $response = Response::success($data);
      return $this->addCacheHeaders($response);
      return Response::success([
         'items'  => array_map([$this, 'formatOperation'], $ops),
         'total'  => count($ops),
         'queue_stats' => $this->getQueueStats($user_id),
         'server_time'  => date('c')
      ]);
   }
   private function buildFilters(array $params): array
@@ -148,7 +137,10 @@
         : array_map('trim', array_map('sanitize_text_field', explode(',', $data['ids'])));
      $action = sanitize_text_field($data['action'] ?? '');
      $user_id = absint($data['user']);
      $user_id = get_current_user_id();
      if (!$user_id) {
         return $this->unauthorized();
      }
      $this->cache = Cache::for($user_id.'_queue');
@@ -162,7 +154,7 @@
      }
      // Get operations via Queue - verifies ownership
      $operations = JVB()->queue()->getUserOperations($user_id, [
      $operations = Queue::getInstance()->getUserOperations($user_id, [
         'ids' => $ids,
         'limit' => count($ids),
      ]);
@@ -182,7 +174,10 @@
   public function pollQueue(WP_REST_Request $request): WP_REST_Response
   {
      $userId = $request->get_param('user');
      $userId = get_current_user_id();
      if (!$userId) {
         return $this->unauthorized();
      }
      $this->cache = Cache::for($userId.'_queue');
      $since = $request->get_param('since');
      $ids = $request->get_param('ids');
@@ -193,7 +188,7 @@
         $filters['ids'] = array_map('trim', explode(',', $ids));
      }
      $operations = JVB()->queue()->getUserOperations($userId, $filters);
      $operations = Queue::getInstance()->getUserOperations($userId, $filters);
      if ($since) {
         $sinceTime = strtotime($since);
@@ -221,9 +216,12 @@
   public function getOperationErrors(WP_REST_Request $request): WP_REST_Response
   {
      $user_id = absint($request->get_param('user'));
      $user_id = get_current_user_id();
      if (!$user_id) {
         return $this->unauthorized();
      }
      $this->cache = Cache::for($user_id.'_queue');
      $operations = JVB()->queue()->getUserOperations($user_id, [
      $operations = Queue::getInstance()->getUserOperations($user_id, [
         'state' => 'completed',
         'outcome' => ['failed', 'failed_permanent', 'partial'],
         'has_errors' => true,
@@ -247,16 +245,19 @@
   public function getOperation(WP_REST_Request $request): WP_REST_Response
   {
      $id = $request->get_param('id');
      $userId = $request->get_param('user');
      $userId = get_current_user_id();
      if (!$userId) {
         return $this->unauthorized();
      }
      $this->cache = Cache::for($userId.'_queue');
      $op = JVB()->queue()->get($id);
      $op = Queue::getInstance()->get($id);
      if (!$op || $op->userId !== $userId) {
         return Response::notFound('Operation not found');
      }
      return Response::item($this->formatOperation($op, true), 'operation');
      return Response::item($this->formatOperation($op), 'operation');
   }
@@ -267,7 +268,7 @@
   {
      return array_merge(
         ['queued' => 0, 'localProcessing' => 0, 'uploading' => 0],
         JVB()->queue()->getUserStats($userId)
         Queue::getInstance()->getUserStats($userId)
      );
   }
@@ -375,7 +376,7 @@
   private function processAction(string $action, array $operations, int $userId): array
   {
      $queue = JVB()->queue();
      $queue = Queue::getInstance();
      $processed = 0;
      $processedIds = [];