From 18e7e415339ccc9adf8ade562f93abef606da16d Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Wed, 26 Aug 2026 22:24:18 +0000
Subject: [PATCH] =Cache::connects throughout codebase refactored

---
 inc/rest/routes/TermRoutes.php |  322 +++++++++++-----------------------------------------
 1 files changed, 71 insertions(+), 251 deletions(-)

diff --git a/inc/rest/routes/TermRoutes.php b/inc/rest/routes/TermRoutes.php
index 8954448..38772cb 100644
--- a/inc/rest/routes/TermRoutes.php
+++ b/inc/rest/routes/TermRoutes.php
@@ -1,6 +1,10 @@
 <?php
 namespace JVBase\rest\routes;
 
+use JVBase\Instance;
+use JVBase\managers\Cache;
+use JVBase\managers\Errors;
+use JVBase\managers\TaxonomyRelationships;
 use JVBase\registrar\Registrar;
 use JVBase\rest\Rest;
 use JVBase\managers\UserTermsManager;
@@ -15,6 +19,7 @@
 }
 class TermRoutes extends Rest
 {
+	use Instance;
     protected object $term_index_manager;
     protected int $per_page;
 
@@ -22,14 +27,12 @@
     {
         $this->cacheName = 'terms';
         parent::__construct();
-		if (JVB_TESTING) {
-			$this->cache->flush();
-		}
-		$this->cache->connect('taxonomy', true);
+		$this->cache = Cache::for('terms', 'term');
+
+
         $this->per_page = 20;
 
         add_action('edited_term', [$this, 'deleteTermPath']);
-        add_action('wp_login', [$this, 'clearUserTaxonomyCache'], 10, 2);
     }
 
     /**
@@ -88,7 +91,7 @@
 
         // Add relationship data if requested
         if ($request->get_param('include_relationships')) {
-            $relationship_manager = JVB()->termRelationships();
+            $relationship_manager = TaxonomyRelationships::getInstance();
             $related_taxonomies = $request->get_param('related_taxonomies') ?: ['jvb_style', 'jvb_theme', 'jvb_city'];
 
             $data['relationships'] = [];
@@ -122,15 +125,9 @@
 	public function getTermDetails(WP_REST_Request $request): WP_REST_Response
 	{
 		$data = $request->get_params();
-		$taxonomies = array_keys($data);
-
-		$cache_check = $this->checkHeaders($request, $this->cache->generateKey(['termDetails' => $data]));
-		if ($cache_check) {
-			return $cache_check;
-		}
 
 		$terms = $this->cache->remember(
-			$this->cache->generateKey(['termDetails' => $data]),
+			['termDetails' => $data],
 			function() use ($data) {
 				$result = [];
 				foreach ($data as $tax => $IDs) {
@@ -144,7 +141,7 @@
 			}
 		);
 
-		return $this->addCacheHeaders($this->success(['items' => $terms]));
+		return $this->success(['items' => $terms]);
 	}
 
     /**
@@ -156,11 +153,8 @@
     {
 		$data = $request->get_params();
 		$taxonomy = sanitize_text_field($data['taxonomy'])??'';
-		// Check HTTP cache headers
-		$cache_check = $this->checkHeaders($request, $taxonomy);
-		if ($cache_check) {
-			error_log('Header Check failed');
-			return $cache_check;
+		if (empty($taxonomy)) {
+			return $this->success(['message' => 'No taxonomy selected']);
 		}
 
 		// Handle batch request (multiple taxonomies)
@@ -175,41 +169,40 @@
 				'include'	=> $data['termIDs'],
 				'hide_empty'	=> true,
 			];
-			$key = $this->cache->generateKey($args);
-			$cached = $this->cache->get($key);
-			if ($cached) {
-				$response = $this->success($cached);
-				return $this->addCacheHeaders($response);
-			}
+			$data = $this->cache->remember(
+				$args,
+				function() use ($args, $taxonomy) {
+					return $this->formatTerms($args, $taxonomy);
+				}
+			);
 
-			$formatted = $this->formatTerms($args, $taxonomy);
 			$response = [
-				'items'	=> $formatted
+				'items'	=> $data
 			];
-			$this->cache->set($key, $response);
-			$response = $this->success($response);
-			return $this->addCacheHeaders($response);
+
+			return $this->success($response);
 		}
 		if (array_key_exists('content', $data)) {
 			// If content_type is provided, use the specialized endpoint
 			$content_type = $request->get_param('content');
 			$registrar = Registrar::getInstance($content_type);
 			if ($registrar->hasFeature('is_content')) {
-				$response = $this->getTermsForContentType($request);
-				return $this->addCacheHeaders($response);
+				//TODO: Not sure what we're trying for here. Doesn't seem to be used.
+				//TODO: Likely for taxonomy content types, like tattoo shops
+				return $this->emptyResult();
 			}
 		}
 
-        $taxonomy = BASE.$request->get_param('taxonomy');
+        $taxonomy = jvbCheckBase($request->get_param('taxonomy'));
+		if (!taxonomy_exists($taxonomy)) {
+			return $this->emptyResult();
+		}
         $search = $request->get_param('search');
 
 		$parent = (int)$data['parent']??0;
 		$page = max(1, (int)($data['page']??1));
 		$per_page = 25;
 
-        if (!taxonomy_exists($taxonomy)) {
-			return $this->emptyResult();
-        }
 
         $tax_obj = get_taxonomy($taxonomy);
         $is_hierarchical = $tax_obj->hierarchical;
@@ -217,8 +210,8 @@
         // If searching, handle differently
         if (!empty($search)) {
 			error_log('Handling search...');
-            $response = $this->handleTermSearch($request);
-			return $this->addCacheHeaders($response);
+
+			return $this->handleTermSearch($request);
         }
 
         // Get terms for current level with child count
@@ -237,12 +230,11 @@
 
             $main_context = json_decode($request->get_param('main_context'), true);
             $userID = get_post_meta($main_context['id'], BASE.'profile_link', true);
-            $manager = new UserTermsManager();
+            $manager = UserTermsManager::getInstance();
             $related = $manager->fetchUserTerms($userID, $taxonomy);
 
             if (empty($related)) {
-                $response = $this->emptyResult();
-				return $this->addCacheHeaders($response);
+				return $this->emptyResult();
             }
 
             $args['include'] = $related;
@@ -251,12 +243,11 @@
             $main_context = json_decode($request->get_param('main_context'), true);
             $thisTaxonomy = str_replace('taxonomy:', '', $main_context['context']);
             $ID = (int)$main_context['id'];
-            $manager = JVB()->termRelationships();
+            $manager = TaxonomyRelationships::getInstance();
             $related = $manager->getRelatedTerms($ID, BASE.$request->get_param('taxonomy'));
 
             if (empty($related)) {
-                $response = $this->emptyResult();
-				return $this->addCacheHeaders($response);
+				return $this->emptyResult();
             }
             $args['tax_query'] = [
                 'taxonomy'  => $taxonomy,
@@ -269,7 +260,7 @@
             $match = $request->get_param('match') ?? 'any';
             $context = json_decode($request['context'], true);
 
-            $relationshipManager = JVB()->termRelationships();
+            $relationshipManager = TaxonomyRelationships::getInstance();
             // Prepare array to collect term IDs that match the context
             $related_term_ids = [];
 
@@ -305,49 +296,40 @@
                 $args['include'] = $related_term_ids;
             } else {
                 // No related terms found, return empty result
-                $response = $this->emptyResult();
-
-				return $this->addCacheHeaders($response);
+				return $this->emptyResult();
             }
         }
 
+		$response = $this->cache->remember(
+			$args,
+			function() use ($args, $taxonomy, $parent, $per_page, $page, $is_hierarchical) {
+				$formatted_terms = $this->formatTerms($args, $taxonomy);
+				// Get total count for pagination
+				$total_terms = wp_count_terms([
+					'taxonomy' => $taxonomy,
+					'hide_empty' => false,
+					'parent' => $parent
+				]);
 
+				// Calculate pagination
+				$total_pages = ceil($total_terms / $per_page);
+				$has_more = $page < $total_pages;
 
-        $key = $this->cache->generateKey($args);
-        $cache = $this->cache->get($key);
+				return [
+					'items' => $formatted_terms,
+					'is_hierarchical' => $is_hierarchical,
+					'pagination' => [
+						'page' => $page,
+						'per_page' => $per_page,
+						'total_pages' => $total_pages,
+						'total_terms' => (int)$total_terms
+					],
+					'has_more' => $has_more
+				];
+			}
+		);
 
-        if ($cache) {
-            $response = $this->success($cache);
-			return $this->addCacheHeaders($response);
-        }
-
-        $formatted_terms = $this->formatTerms($args, $taxonomy);
-        // Get total count for pagination
-        $total_terms = wp_count_terms([
-            'taxonomy' => $taxonomy,
-            'hide_empty' => false,
-            'parent' => $parent
-        ]);
-
-        // Calculate pagination
-        $total_pages = ceil($total_terms / $per_page);
-        $has_more = $page < $total_pages;
-
-        $response = [
-            'items' => $formatted_terms,
-            'is_hierarchical' => $is_hierarchical,
-            'pagination' => [
-                'page' => $page,
-                'per_page' => $per_page,
-                'total_pages' => $total_pages,
-                'total_terms' => (int)$total_terms
-            ],
-			'has_more' => $has_more
-        ];
-
-        $this->cache->set($key, $response);
-        $response = $this->success($response);
-		return $this->addCacheHeaders($response);
+		return $this->success($response);
     }
 
 	protected function handleBatchTermRequest(string $taxonomy, array $data, WP_REST_Request $request):WP_REST_Response
@@ -384,8 +366,7 @@
 			'has_more' => true,
 		];
 
-		$response = $this->success($response);
-		return $this->addCacheHeaders($response);
+		return $this->success($response);
 	}
 
 
@@ -398,7 +379,7 @@
 	protected function formatTerms(array $args, string $taxonomy): array
 	{
 		return $this->cache->remember(
-			$this->cache->generateKey($args),
+			$args,
 			function() use ($args, $taxonomy) {
 				$terms = get_terms($args);
 
@@ -408,7 +389,7 @@
 
 				$formatted_terms = [];
 				foreach ($terms as $term) {
-					$formatted_terms[] = $this->formatSingleTerm($term, $taxonomy, true);
+					$formatted_terms[] = $this->formatSingleTerm($term, $taxonomy);
 				}
 
 				return $formatted_terms;
@@ -478,7 +459,7 @@
 		];
 
 		$data = $this->cache->remember(
-			$this->cache->generateKey($args),
+			$args,
 			function() use ($args, $taxonomy, $page, $per_page) {
 				$terms = get_terms($args);
 
@@ -508,7 +489,7 @@
 			}
 		);
 
-		return $this->addCacheHeaders($this->success($data));
+		return $this->success($data);
 	}
 
     /**
@@ -550,167 +531,6 @@
         delete_term_meta($termID, BASE.'term_path');
     }
 
-    /**
-     * @param string $username
-     * @param object $user
-     *
-     * @return void
-     */
-    public function clearUserTaxonomyCache(string $username, object $user):void
-    {
-        global $wpdb;
-
-        // Get all transients for this user
-        $like_pattern = $wpdb->esc_like(BASE.'user_' . $user->ID) . '_%';
-
-        $transients = $wpdb->get_col($wpdb->prepare("
-            SELECT option_name
-            FROM {$wpdb->options}
-            WHERE option_name LIKE %s
-            AND option_name LIKE %s
-        ", '_transient_' . $like_pattern, '%'));
-
-        // Delete all found transients
-        foreach ($transients as $transient) {
-            delete_transient(str_replace('_transient_', '', $transient));
-        }
-    }
-
-    /**
-     * @param WP_REST_Request $request
-     *
-     * @return WP_REST_Response
-     */
-    public function getTermsForContentType(WP_REST_Request $request):WP_REST_Response
-    {
-        $manager = JVB()->termRelationships();
-        $content_type = BASE . $request->get_param('content');
-        $taxonomy = BASE . $request->get_param('taxonomy');
-        $search = $request->get_param('search');
-        $page = max(1, intval($request->get_param('page')));
-        $per_page = $request->get_param('per_page') ?: 20;
-
-        // Create cache key
-        $cache_key = "terms_for_{$content_type}_{$taxonomy}_" . md5("{$search}_{$page}_{$per_page}");
-
-        $cache_key = $this->cache->generateKey([
-            'terms_for'     => $content_type,
-            'taxonomy'      => $taxonomy,
-            'search'        => $search,
-            'page'          => $page,
-            'per_page'      => $per_page
-        ]);
-        $cache = $this->cache->get($cache_key);
-        // Try cache first
-        if ($cache !== false) {
-			$response = $this->success($cache);
-            return $this->addCacheHeaders($response);
-        }
-
-        try {
-            global $wpdb;
-
-            // Starting the query building
-            $query_args = [];
-            $terms_query = "
-                SELECT DISTINCT t.term_id, t.name, t.slug, tt.count, tt.taxonomy,
-                       (SELECT COUNT(DISTINCT tm.meta_key) FROM {$wpdb->termmeta} tm WHERE tm.term_id = t.term_id) AS meta_count
-                FROM {$wpdb->terms} t
-                JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
-                JOIN {$manager->getTableName()} tr ON (
-                    (tr.primary_taxonomy = %s AND tr.primary_term_id = t.term_id)
-                    OR (tr.related_taxonomy = %s AND tr.related_term_id = t.term_id)
-                )
-            ";
-
-            $query_args[] = $taxonomy;
-            $query_args[] = $taxonomy;
-
-            // Add content type filter through posts
-            $query_where = " WHERE tt.taxonomy = %s";
-            $query_args[] = $taxonomy;
-
-            // Add search condition if provided
-            if ($search) {
-                $query_where .= " AND (t.name LIKE %s OR t.slug LIKE %s)";
-                $search_like = '%' . $wpdb->esc_like($search) . '%';
-                $query_args[] = $search_like;
-                $query_args[] = $search_like;
-            }
-
-            // Add relationship strength ordering
-            $query_order = " GROUP BY t.term_id";
-            $query_order .= " ORDER BY COUNT(tr.id) DESC, tt.count DESC";
-
-            // Add pagination
-            $query_limit = " LIMIT %d OFFSET %d";
-            $query_args[] = $per_page;
-            $query_args[] = ($page - 1) * $per_page;
-
-            // Combine the query
-            $final_query = $query_where . $query_order . $query_limit;
-
-            // Get terms
-            $terms = $wpdb->get_results(
-                $wpdb->prepare(
-                    $terms_query . $final_query,
-                    $query_args
-                )
-            );
-            // Get total count for pagination
-            $count_query = str_replace($query_limit, '', $query_where);
-            $count_query = "SELECT COUNT(DISTINCT t.term_id) FROM {$wpdb->terms} t
-                           JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
-                           JOIN {$manager->getTableName()} tr ON (
-                               (tr.primary_taxonomy = %s AND tr.primary_term_id = t.term_id)
-                               OR (tr.related_taxonomy = %s AND tr.related_term_id = t.term_id)
-                           ) " . $count_query;
-
-            // Remove pagination args
-            array_pop($query_args);
-            array_pop($query_args);
-
-            $total = $wpdb->get_var(
-                $wpdb->prepare(
-                    $count_query,
-                    $query_args
-                )
-            );
-
-            // Format terms
-            $formatted_terms = [];
-            $is_hierarchical = is_taxonomy_hierarchical($taxonomy);
-
-			foreach ($terms as $term) {
-				$formatted = $this->formatSingleTerm($term, $taxonomy, false);
-				// Add relationship strength which is unique to this method
-				$formatted['relationship_strength'] = $term->relationship_count ?? 0;
-				$formatted_terms[] = $formatted;
-			}
-
-            // Build response
-            $total_pages = ceil($total / $per_page);
-            $results = [
-                'items' => $formatted_terms,
-                'pagination'    => [
-                    'page'      => (int)$page,
-                    'per_page'  => (int)$per_page,
-                    'total_terms'=> $total,
-                    'total_pages'=> $total_pages
-                ],
-				'has_more'  => $page < $total_pages
-            ];
-
-            // Cache results
-            $this->cache->set($cache_key, $results);
-			$response = $this->success($results);
-            return $this->addCacheHeaders($response);
-
-        } catch (Exception $e) {
-			return $this->error('Error getting terms for content: '.$e->getMessage(), 'get_terms_for_content');
-        }
-    }
-
 
     /**
      * @param WP_REST_Request $request
@@ -738,7 +558,7 @@
 
 			$membership = Site::membership();
 			if ($membership && $membership->has('term_approval')) {
-				$approval_routes = JVB()->routes('approvals');
+				$approval_routes = ApprovalRoutes::getInstance();
 				$request_id = $approval_routes->createTermApprovalRequest(
 					$user_id,
 					$taxonomy,
@@ -781,7 +601,7 @@
 			], 201); // 201 Created
 
 		} catch (Exception $e) {
-			JVB()->error()->log(
+			Errors::getInstance()->log(
 				'terms',
 				'Term creation failed: ' . $e->getMessage(),
 				['user_id' => $user_id, 'taxonomy' => $taxonomy, 'name' => $name]

--
Gitblit v1.10.0