From 22e1bb3fcc3b3db1c0f5c2e6a4aecaf408c307a5 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 04 Jan 2026 18:29:46 +0000
Subject: [PATCH] Merge branch 'main' of https://github.com/jakevdwerf/jvb
---
inc/managers/OperationQueue.php | 166 +++++++++++++++++++++++++++++--------------------------
1 files changed, 88 insertions(+), 78 deletions(-)
diff --git a/inc/managers/OperationQueue.php b/inc/managers/OperationQueue.php
index cf6f398..182ca97 100644
--- a/inc/managers/OperationQueue.php
+++ b/inc/managers/OperationQueue.php
@@ -3,6 +3,7 @@
use JVBase\managers\CacheManager;
use Exception;
+use JVBase\utility\Features;
use WP_Error;
use WP_REST_Response;
use WP_REST_Request;
@@ -79,7 +80,7 @@
{
global $wpdb;
$this->wpdb = $wpdb;
- $this->cache = new CacheManager('queue');
+ $this->cache = CacheManager::for('queue', DAY_IN_SECONDS);
add_action('jvb_process_queue', [ $this, 'checkQueue' ]);
add_action('jvb_queue_maintenance', [$this, 'hourlyMaintenance']);
add_action('jvbEmailDailyMetricsReport', [$this, 'emailDailyMetricsReport']);
@@ -579,7 +580,7 @@
$this->updateLastModified($user_id);
$this->invalidateQueueCache();
- $this->cache->invalidate(self::CACHE_USER_QUEUE_PREFIX . $user_id);
+ $this->cache->delete(self::CACHE_USER_QUEUE_PREFIX . $user_id);
$this->runQueueOnShutdown();
return [
@@ -598,7 +599,7 @@
}
protected function updateLastModified(int $user_id) {
- JVB()->routes('queue')->updateUserQueueTimestamp($user_id);
+ CacheManager::updateTimestamp("user_{$user_id}");
}
protected function deepMerge(array $existing, array $new): array
@@ -814,8 +815,8 @@
$this->processOperation($operation);
// Invalidate operation cache after processing
- $this->cache->invalidate(self::CACHE_OPERATION_PREFIX . $operation->id);
- $this->cache->invalidate(self::CACHE_USER_QUEUE_PREFIX . $operation->user_id);
+ $this->cache->delete(self::CACHE_OPERATION_PREFIX . $operation->id);
+ $this->cache->delete(self::CACHE_USER_QUEUE_PREFIX . $operation->user_id);
}
// Batch invalidate caches at the end
@@ -1025,13 +1026,12 @@
$keys = $cacheKeys[$scope] ?? $cacheKeys['all'];
foreach ($keys as $key) {
- $this->cache->invalidate($key);
+ $this->cache->delete($key);
}
if ($scope === 'all') {
// Clear entire group for complete refresh
- $this->cache->invalidateGroup($this->cacheGroup);
- jvbUpdateCacheTimestamp('queue');
+ $this->cache->invalidate();
delete_transient('jvb_queue_status_counts');
}
}
@@ -1180,7 +1180,7 @@
$message .= "Please check the error logs for more details.";
- return jvbMail($admin_email, $subject, $message);
+ return JVB()->email()->sendEmail($admin_email, $subject, $message);
}
/**
@@ -1406,7 +1406,7 @@
}
}
// Clear operation cache after any update
- $this->cache->invalidate(self::CACHE_OPERATION_PREFIX . $operation->id);
+ $this->cache->delete(self::CACHE_OPERATION_PREFIX . $operation->id);
$this->updateLastModified($operation->user_id);
return $filterResult;
@@ -1557,8 +1557,8 @@
protected function updateUserQueueTimestamp(int $user_id)
{
- $key = "{$user_id}_queue_timestamp";
- $this->cache->set($key, time());
+
+ CacheManager::updateTimestamp("user_{$user_id}");
}
/**
@@ -1684,91 +1684,101 @@
* Send daily metrics report to admin
* @return void
*/
- public function emailDailyMetricsReport():void
- {
+ public function emailDailyMetricsReport():void
+ {
+ $metrics_table = $this->wpdb->prefix . $this->metricsTable;
+ $yesterday = date('Y-m-d', strtotime('-1 day'));
- $metrics_table = $this->wpdb->prefix . $this->metricsTable;
- $yesterday = date('Y-m-d', strtotime('-1 day'));
+ $metrics = $this->wpdb->get_results($this->wpdb->prepare(
+ "SELECT * FROM $metrics_table WHERE date = %s",
+ $yesterday
+ ));
- // Get yesterday's metrics
- $metrics = $this->wpdb->get_results($this->wpdb->prepare(
- "SELECT * FROM $metrics_table WHERE date = %s",
- $yesterday
- ));
+ if (empty($metrics)) {
+ return;
+ }
- if (empty($metrics)) {
- return; // No metrics to report
- }
+ $admin_email = get_option('admin_email');
+ $site_name = get_bloginfo('name');
+ $subject = "[$site_name] Daily Queue Performance - " . $yesterday;
- $admin_email = get_option('admin_email');
- $site_name = get_bloginfo('name');
+ // Calculate totals
+ $total_ops = 0;
+ $total_success = 0;
+ $total_failed = 0;
+ $total_items = 0;
- $subject = "[$site_name] Daily Queue Performance Report - " . date('Y-m-d', strtotime('-1 day'));
+ foreach ($metrics as $metric) {
+ $total_ops += $metric->total_operations;
+ $total_success += $metric->successful_operations;
+ $total_failed += $metric->failed_operations;
+ $total_items += $metric->total_items_processed;
+ }
- $message = "Daily Queue Performance Report for $yesterday\n\n";
+ $success_rate = round(($total_success / max(1, $total_ops)) * 100, 1);
- $message .= "SUMMARY:\n";
- $total_ops = 0;
- $total_success = 0;
- $total_failed = 0;
- $total_items = 0;
+ $message = JVB()->email()->h1('Daily Queue Performance Report');
+ $message .= sprintf('<p>Report for <strong>%s</strong></p>', $yesterday);
- foreach ($metrics as $metric) {
- $total_ops += $metric->total_operations;
- $total_success += $metric->successful_operations;
- $total_failed += $metric->failed_operations;
- $total_items += $metric->total_items_processed;
- }
+ // 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')
+ ];
+ $message .= JVB()->email()->grid($stats, 4);
- $message .= "- Total Operations: $total_ops\n";
- $message .= "- Successful: $total_success\n";
- $message .= "- Failed: $total_failed\n";
- $message .= "- Success Rate: " . round(($total_success / max(1, $total_ops)) * 100, 2) . "%\n";
- $message .= "- Total Items Processed: $total_items\n\n";
+ $message .= JVB()->email()->spacer(20);
- $message .= "DETAILS BY OPERATION TYPE:\n";
+ // Alert if success rate is low
+ if ($success_rate < 90) {
+ $message .= JVB()->email()->alert(
+ sprintf('Success rate of %s%% is below the 90%% threshold', $success_rate),
+ 'warning'
+ );
+ }
- foreach ($metrics as $metric) {
- $message .= "• $metric->type:\n";
- $message .= " - Operations: $metric->total_operations\n";
- $message .= " - Success: $metric->successful_operations\n";
- $message .= " - Failed: $metric->failed_operations\n";
+ $message .= JVB()->email()->h2('Details by Operation Type');
- if ($metric->average_duration) {
- $message .= " - Avg. Duration: " . round($metric->average_duration, 2) . " seconds\n";
- }
+ // 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'];
- $message .= " - Items Processed: $metric->total_items_processed\n";
+ if ($metric->average_duration) {
+ $details[] = ['label' => 'Avg Duration', 'value' => round($metric->average_duration, 2) . 's'];
+ }
- if ($metric->peak_queue_size) {
- $message .= " - Peak Queue Size: $metric->peak_queue_size\n";
- }
+ $details[] = ['label' => 'Items Processed', 'value' => number_format($metric->total_items_processed)];
- if ($metric->peak_memory_usage) {
- $memory_mb = round($metric->peak_memory_usage / 1024 / 1024, 2);
- $message .= " - Peak Memory Usage: $memory_mb MB\n";
- }
+ if ($metric->peak_memory_usage) {
+ $memory_mb = round($metric->peak_memory_usage / 1024 / 1024, 2);
+ $details[] = ['label' => 'Peak Memory', 'value' => $memory_mb . ' MB'];
+ }
- if ($metric->peak_cpu_usage) {
- $cpu_percent = round($metric->peak_cpu_usage * 50, 2); // Assuming 2 cores
- $message .= " - Peak CPU Usage: $cpu_percent%\n";
- }
+ $message .= JVB()->email()->card(
+ JVB()->email()->table($details),
+ esc_html($metric->type)
+ );
+ }
- $message .= "\n";
- }
+ // Current queue status
+ $pending_count = $this->getCurrentQueueSize();
+ if ($pending_count > 0) {
+ $message .= JVB()->email()->spacer(20);
+ $message .= JVB()->email()->notice(
+ sprintf('<strong>Current Queue:</strong> %d operations pending', $pending_count)
+ );
+ }
- // Add any outstanding queue items
- $pending_count = $this->getCurrentQueueSize();
- if ($pending_count > 0) {
- $message .= "CURRENT QUEUE STATUS:\n";
- $message .= "- $pending_count operations currently pending in the queue\n\n";
- }
+ $message .= JVB()->email()->spacer(20);
+ $message .= JVB()->email()->button(admin_url('admin.php?page=jvb-queue'), 'View Queue Dashboard');
- $message .= "This is an automated report. Please check the admin dashboard for more details.";
-
- // Send email
- jvbMail($admin_email, $subject, $message);
- }
+ JVB()->email()->sendEmail($admin_email, $subject, $message, 'QUEUE REPORT');
+ }
/**
* @return int
--
Gitblit v1.10.0