From b38f03c0e7218762d90fa5092696b127f24f36db Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 25 Jan 2026 07:07:26 +0000
Subject: [PATCH] =Some logical flaws in Queue.php, Queue.js, ContentExecutor.php, UploadExecutor.php - particularly with timeline ordering, frontend queue updates, etc

---
 inc/managers/ReferralManager.php |  154 ++++++++++++++++++++++++++++-----------------------
 1 files changed, 84 insertions(+), 70 deletions(-)

diff --git a/inc/managers/ReferralManager.php b/inc/managers/ReferralManager.php
index ade87e0..b3c1644 100644
--- a/inc/managers/ReferralManager.php
+++ b/inc/managers/ReferralManager.php
@@ -24,7 +24,9 @@
 {
 	protected $wpdb;
 	protected MagicLinkManager $magic_link;
-	protected CacheManager $cache;
+	protected Cache $cache;
+	protected Cache $requestCache;
+	protected Cache $statsCache;
 	protected string $referrals_table;
 	protected ?int $referralPage = null;
 	protected string $rewards_table;
@@ -48,7 +50,10 @@
 	{
 		global $wpdb;
 		$this->wpdb = $wpdb;
-		$this->cache = CacheManager::for('referrals', WEEK_IN_SECONDS);
+		$this->cache = Cache::for('referrals', WEEK_IN_SECONDS);
+		$this->requestCache = Cache::for('referral_requests', WEEK_IN_SECONDS)->connect('referrals', true);
+		$this->statsCache = Cache::for('referral_stats', WEEK_IN_SECONDS)->connect('referrals', true);
+
 		$this->referrals_table = $wpdb->prefix . BASE . 'referrals';
 		$this->rewards_table = $wpdb->prefix . BASE . 'referral_rewards';
 
@@ -355,7 +360,7 @@
 		}
 
 		// Clear caches
-		$this->cache->clear();
+		$this->cache->flush();
 
 		// Fire action for tracking
 		do_action('jvb_referral_processed', $user_id, $referrer->ID, $referral_code);
@@ -519,19 +524,19 @@
 	 */
 	public function getUserReferrals(int $user_id, array $args = []): array
 	{
-		return $this->cache->remember(
-			$user_id,
+		$defaults = [
+			'status' => 'all',
+			'limit' => 100,
+			'offset' => 0,
+			'orderby' => 'referred_at',
+			'order' => 'DESC'
+		];
+
+		$args = wp_parse_args($args, $defaults);
+
+		return $this->requestCache->remember(
+			$this->requestCache->generateKey(array_merge(['user'=>$user_id], $args)),
 			function() use ($user_id, $args) {
-				$defaults = [
-					'status' => 'all',
-					'limit' => 100,
-					'offset' => 0,
-					'orderby' => 'referred_at',
-					'order' => 'DESC'
-				];
-
-				$args = wp_parse_args($args, $defaults);
-
 				$where = $this->wpdb->prepare("WHERE referrer_id = %d", $user_id);
 
 				if ($args['status'] !== 'all') {
@@ -575,37 +580,33 @@
 	 */
 	public function getUserStats(int $user_id): array
 	{
-		$cache_key = 'stats_' . $user_id;
-		$cached = $this->cache->get($cache_key);
-
-		if ($cached !== false) {
-			return $cached;
-		}
-
-		$stats = $this->wpdb->get_row($this->wpdb->prepare(
-			"SELECT
+		return $this->statsCache->remember(
+			$user_id,
+			function() use ($user_id) {
+				$stats = $this->wpdb->get_row($this->wpdb->prepare(
+					"SELECT
 			COUNT(*) as code_used,
 			SUM(CASE WHEN status IN ('consulted', 'treated') THEN 1 ELSE 0 END) as consultations,
 			SUM(CASE WHEN status = 'treated' THEN 1 ELSE 0 END) as treatments,
 			SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending
 		FROM {$this->referrals_table}
 		WHERE referrer_id = %d",
-			$user_id
-		), ARRAY_A);
+					$user_id
+				), ARRAY_A);
 
-		// Get total rewards earned (available + redeemed)
-		$rewards = $this->wpdb->get_var($this->wpdb->prepare(
-			"SELECT SUM(amount)
+				// Get total rewards earned (available + redeemed)
+				$rewards = $this->wpdb->get_var($this->wpdb->prepare(
+					"SELECT SUM(amount)
 		FROM {$this->rewards_table}
 		WHERE user_id = %d AND reward_type = 'referrer'",
-			$user_id
-		));
+					$user_id
+				));
 
-		$stats['total_rewards'] = floatval($rewards ?? 0);
-		$stats['user_id'] = $user_id;
-		$this->cache->set($cache_key, $stats, HOUR_IN_SECONDS);
-
-		return $stats;
+				$stats['total_rewards'] = floatval($rewards ?? 0);
+				$stats['user_id'] = $user_id;
+				return $stats;
+			}
+		);
 	}
 
 	/**
@@ -617,20 +618,23 @@
 	 */
 	public function getTopReferrers(int $limit = 10, string $period = 'all'): array
 	{
-		$where = '';
+		return $this->statsCache->remember(
+			$this->statsCache->generateKey(['limit'=>$limit, 'period' => $period]),
+			function() use ($limit, $period) {
+				$where = '';
 
-		if ($period !== 'all') {
-			$date_where = match($period) {
-				'day' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 DAY)",
-				'week' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 WEEK)",
-				'month' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH)",
-				default => "1=1"
-			};
+				if ($period !== 'all') {
+					$date_where = match($period) {
+						'day' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 DAY)",
+						'week' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 WEEK)",
+						'month' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH)",
+						default => "1=1"
+					};
 
-			$where = "WHERE {$date_where}";
-		}
+					$where = "WHERE {$date_where}";
+				}
 
-		$query = "SELECT
+				$query = "SELECT
                     referrer_id,
                     COUNT(*) as referral_count,
                     SUM(CASE WHEN status = 'treated' THEN 1 ELSE 0 END) as treated_count
@@ -640,16 +644,19 @@
                   ORDER BY referral_count DESC
                   LIMIT {$limit}";
 
-		$results = $this->wpdb->get_results($query);
+				$results = $this->wpdb->get_results($query);
 
-		// Enrich with user data
-		foreach ($results as &$result) {
-			$user = get_user_by('ID', $result->referrer_id);
-			$result->user_name = $user ? $user->display_name : 'Unknown';
-			$result->user_email = $user ? $user->user_email : '';
-		}
+				// Enrich with user data
+				foreach ($results as &$result) {
+					$user = get_user_by('ID', $result->referrer_id);
+					$result->user_name = $user ? $user->display_name : 'Unknown';
+					$result->user_email = $user ? $user->user_email : '';
+				}
 
-		return $results;
+				return $results;
+			}
+		);
+
 	}
 
 	/**
@@ -772,23 +779,30 @@
 	 */
 	protected function generateCSV(array $referrals): string
 	{
-		$csv = "Referred By,Referee Name,Referee Email,Referee Phone,Referral Code,Status,Referred At,Treated At\n";
+		$cache = Cache::for('referralCSV', HOUR_IN_SECONDS)->connect('referrals');
+		return $cache->remember(
+			'csv',
+			function () use ($referrals) {
+				$csv = "Referred By,Referee Name,Referee Email,Referee Phone,Referral Code,Status,Referred At,Treated At\n";
 
-		foreach ($referrals as $referral) {
-			$csv .= sprintf(
-				'"%s","%s","%s","%s","%s","%s","%s","%s"' . "\n",
-				$referral->referrer_name ?? 'Unknown',
-				$referral->referee_name,
-				$referral->referee_email,
-				$referral->referee_phone,
-				$referral->referral_code,
-				$referral->status,
-				$referral->referred_at,
-				$referral->treated_at ?? 'Not yet'
-			);
-		}
+				foreach ($referrals as $referral) {
+					$csv .= sprintf(
+						'"%s","%s","%s","%s","%s","%s","%s","%s"' . "\n",
+						$referral->referrer_name ?? 'Unknown',
+						$referral->referee_name,
+						$referral->referee_email,
+						$referral->referee_phone,
+						$referral->referral_code,
+						$referral->status,
+						$referral->referred_at,
+						$referral->treated_at ?? 'Not yet'
+					);
+				}
 
-		return $csv;
+				return $csv;
+			}
+		);
+
 	}
 
 	/**

--
Gitblit v1.10.0