From 42fa8304ddb811b0f725f245130f70c0f5e86a6c Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Tue, 04 Nov 2025 06:12:02 +0000
Subject: [PATCH] =Refactored LoginManager to be more extensible and configurable, as well as an AjaxRateLimiter
---
inc/managers/OperationQueue.php | 50 ++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 40 insertions(+), 10 deletions(-)
diff --git a/inc/managers/OperationQueue.php b/inc/managers/OperationQueue.php
index f10def6..b4e3c9c 100644
--- a/inc/managers/OperationQueue.php
+++ b/inc/managers/OperationQueue.php
@@ -79,7 +79,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 +579,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 [
@@ -604,6 +604,12 @@
protected function deepMerge(array $existing, array $new): array
{
$merged = $existing;
+
+ if (!$this->isAssociativeArray($existing) && !$this->isAssociativeArray($new)) {
+ error_log('It is an associative array!');
+ return array_merge($existing, $new);
+ }
+ error_log('Not an associative array... moving on!');
foreach ($new as $key => $newValue) {
if (!array_key_exists($key, $existing)) {
$merged[$key] = $newValue;
@@ -614,8 +620,15 @@
// Recursive merge going deeper, if any of them are associative arrays
$merged[$key] = $this->deepMerge($existingValue, $newValue);
} else {
- // Unique merge if indexed arrays
- $merged[$key] = array_unique(array_merge($existingValue, $newValue), SORT_REGULAR);
+ $containsComplex = $this->containsComplexData($existingValue) || $this->containsComplexData($newValue);
+
+ if ($containsComplex) {
+ // Just merge and re-index - preserves all items from chunks
+ $merged[$key] = array_values(array_merge($existingValue, $newValue));
+ } else {
+ // Simple scalar arrays - use unique merge
+ $merged[$key] = array_unique(array_merge($existingValue, $newValue), SORT_REGULAR);
+ }
}
} elseif (is_array($existingValue) && !is_array($newValue)) {
// The existing value is an array, but the new one isn't
@@ -663,6 +676,21 @@
return array_keys($arr) !== range(0, count($arr) - 1);
}
+ /**
+ * Check if an array contains complex data (arrays or objects)
+ * @param array $arr
+ * @return bool
+ */
+ protected function containsComplexData(array $arr): bool
+ {
+ foreach ($arr as $item) {
+ if (is_array($item) || is_object($item)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
protected function getEarliestScheduledTime(string $existing, string $new): string
{
$existing_time = strtotime($existing);
@@ -786,8 +814,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
@@ -997,13 +1025,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');
}
}
@@ -1264,8 +1291,11 @@
$filterResult['result'] = [$filterResult['result']];
}
// Store the result data
+ error_log('Merging Old Result: '. print_r($oldResult, true));
+ error_log('With Newer Result: '. print_r($filterResult['result'], true));
$resultToStore = $this->deepMerge($oldResult, $filterResult['result']);
+ error_log('Merged Result: '.print_r($resultToStore, true));
$resultToStore['processed_at'] = current_time('mysql');
@@ -1375,7 +1405,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;
--
Gitblit v1.10.0