Jake Vanderwerf
2026-08-28 5b50afdcafd150186ea5c7b0e1cad98065590b35
inc/managers/OperationQueue.php
@@ -5,6 +5,7 @@
use WP_Error;
use WP_REST_Response;
use WP_REST_Request;
use wpdb;
if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
@@ -27,7 +28,7 @@
    protected string $table = BASE.'_operation_queue';
    protected string $metricsTable = BASE.'stats__operation_queue';
    protected int $max_attempts = 3;
   protected \wpdb $wpdb;
   protected wpdb $wpdb;
    // System load thresholds
    protected array $load_thresholds = [
@@ -59,7 +60,7 @@
    {
      global $wpdb;
      $this->wpdb = $wpdb;
      $this->cache = Cache::for('queue', DAY_IN_SECONDS)->connect('user');
      $this->cache = Cache::for('queue', 'user',DAY_IN_SECONDS)->user();
        add_action('jvb_process_queue', [ $this, 'checkQueue' ]);
      add_action('jvb_queue_maintenance', [$this, 'hourlyMaintenance']);
        add_action('jvbEmailDailyMetricsReport', [$this, 'emailDailyMetricsReport']);
@@ -90,7 +91,7 @@
   }
    public function registerAdminAction():void
    {
        $admin = JVB()->admin();
        $admin = AdminPages::getInstance();
        $admin->registerAction(
            'Restart Stuck Operations',
            'restart-stuck-operations',
@@ -547,7 +548,7 @@
         ];
      } catch (Exception $e) {
         JVB()->error()->log('queue', $e->getMessage(), $data, 'high');
         Errors::getInstance()->log('queue', $e->getMessage(), $data, 'high');
         return new WP_Error('queue_failed', $e->getMessage());
      }
   }
@@ -1029,7 +1030,7 @@
                );
                // Log this as a critical error
                JVB()->error()->log(
                Errors::getInstance()->log(
                    '[OperationQueue]:restartStuckOperations',
                    "Operation failed after maximum retries",
                    [
@@ -1057,7 +1058,7 @@
                );
                // Log the backoff
                JVB()->error()->log(
                Errors::getInstance()->log(
                    '[OperationQueue]:restartStuckOperations',
                    "Operation requeued with exponential backoff",
                    [
@@ -1131,7 +1132,7 @@
        $message .= "Please check the error logs for more details.";
        return JVB()->email()->sendEmail($admin_email, $subject, $message);
        return Emails::getInstance()->sendEmail($admin_email, $subject, $message);
    }
    /**
@@ -1184,7 +1185,7 @@
         if (!is_array($filterResult) || !isset($filterResult['success'])) {
            // Log invalid filter response and quit early
            $invalid_response = is_object($filterResult) ? get_class($filterResult) : gettype($filterResult);
            JVB()->error()->log(
            Errors::getInstance()->log(
               '[OperationQueue]:processOperation',
               "Invalid filter response format - expected array with 'success' key",
               [
@@ -1348,7 +1349,7 @@
      } catch (Exception $e) {
         // Handle exception...
         JVB()->error()->log(
         Errors::getInstance()->log(
            '[OperationQueue]:processOperation',
            "Exception during operation processing: " . $e->getMessage(),
            [
@@ -1394,7 +1395,7 @@
     *
     * @param object $operation The current operation
     *
     * @return bool|array false if not batched, the extracted data to process if batchable
     * @return array false if not batched, the extracted data to process if batchable
     */
   protected function getNextChunk(object $operation): array
   {
@@ -1650,36 +1651,36 @@
      $success_rate = round(($total_success / max(1, $total_ops)) * 100, 1);
      $message = JVB()->email()->h1('Daily Queue Performance Report');
      $message = Emails::getInstance()->h1('Daily Queue Performance Report');
      $message .= sprintf('<p>Report for <strong>%s</strong></p>', $yesterday);
      // Summary stats in grid
      $stats = [
         JVB()->email()->stat($total_ops, 'Operations'),
         JVB()->email()->stat($total_success, 'Successful', '✓'),
         JVB()->email()->stat($total_failed, 'Failed', $total_failed > 0 ? '⚠' : ''),
         JVB()->email()->stat($success_rate . '%', 'Success Rate')
         Emails::getInstance()->stat($total_ops, 'Operations'),
         Emails::getInstance()->stat($total_success, 'Successful', '✓'),
         Emails::getInstance()->stat($total_failed, 'Failed', $total_failed > 0 ? '⚠' : ''),
         Emails::getInstance()->stat($success_rate . '%', 'Success Rate')
      ];
      $message .= JVB()->email()->grid($stats, 4);
      $message .= Emails::getInstance()->grid($stats, 4);
      $message .= JVB()->email()->spacer(20);
      $message .= Emails::getInstance()->spacer(20);
      // Alert if success rate is low
      if ($success_rate < 90) {
         $message .= JVB()->email()->alert(
         $message .= Emails::getInstance()->alert(
            sprintf('Success rate of %s%% is below the 90%% threshold', $success_rate),
            'warning'
         );
      }
      $message .= JVB()->email()->h2('Details by Operation Type');
      $message .= Emails::getInstance()->h2('Details by Operation Type');
      // Details for each operation type
      foreach ($metrics as $metric) {
         $details = [];
         $details[] = ['label' => 'Total', 'value' => $metric->total_operations];
         $details[] = ['label' => 'Success', 'value' => JVB()->email()->badge($metric->successful_operations, 'success')];
         $details[] = ['label' => 'Failed', 'value' => $metric->failed_operations > 0 ? JVB()->email()->badge($metric->failed_operations, 'error') : '0'];
         $details[] = ['label' => 'Success', 'value' => Emails::getInstance()->badge($metric->successful_operations, 'success')];
         $details[] = ['label' => 'Failed', 'value' => $metric->failed_operations > 0 ? Emails::getInstance()->badge($metric->failed_operations, 'error') : '0'];
         if ($metric->average_duration) {
            $details[] = ['label' => 'Avg Duration', 'value' => round($metric->average_duration, 2) . 's'];
@@ -1692,8 +1693,8 @@
            $details[] = ['label' => 'Peak Memory', 'value' => $memory_mb . ' MB'];
         }
         $message .= JVB()->email()->card(
            JVB()->email()->table($details),
         $message .= Emails::getInstance()->card(
            Emails::getInstance()->table($details),
            esc_html($metric->type)
         );
      }
@@ -1701,16 +1702,16 @@
      // Current queue status
      $pending_count = $this->getCurrentQueueSize();
      if ($pending_count > 0) {
         $message .= JVB()->email()->spacer(20);
         $message .= JVB()->email()->notice(
         $message .= Emails::getInstance()->spacer(20);
         $message .= Emails::getInstance()->notice(
            sprintf('<strong>Current Queue:</strong> %d operations pending', $pending_count)
         );
      }
      $message .= JVB()->email()->spacer(20);
      $message .= JVB()->email()->button(admin_url('admin.php?page=jvb-queue'), 'View Queue Dashboard');
      $message .= Emails::getInstance()->spacer(20);
      $message .= Emails::getInstance()->button(admin_url('admin.php?page=jvb-queue'), 'View Queue Dashboard');
      JVB()->email()->sendEmail($admin_email, $subject, $message, 'QUEUE REPORT');
      Emails::getInstance()->sendEmail($admin_email, $subject, $message, 'QUEUE REPORT');
   }
    /**
@@ -1887,7 +1888,7 @@
            return $value;
        } catch (Exception $e) {
            JVB()->error()->log(
            Errors::getInstance()->log(
                '[OperationQueue]:getOperationValue',
                'Error retrieving operation value: ' . $e->getMessage(),
                [