Jake Vanderwerf
2026-09-04 c16a4d78d07e81ecdd2ff9b1b9090560ab2fe488
inc/rest/Rest.php
@@ -1,10 +1,13 @@
<?php
namespace JVBase\rest;
use JVBase\integrations\services\Cloudflare;
use JVBase\managers\Cache;
use JVBase\managers\Errors;
use JVBase\meta\Meta;
use JVBase\registrar\Registrar;
use JVBase\base\Site;
use JVBase\rest\routes\TermRoutes;
use WP_REST_Request;
use WP_REST_Response;
use Exception;
@@ -30,7 +33,7 @@
   protected string $namespace = 'jvb/v1';
   protected ?Cache $cache = null;
   protected string $cacheName = '';
   protected int $cacheTtl = 3600;
   protected int $cacheTtl = HOUR_IN_SECONDS;
   protected static ?string $action;
   public function __construct()
@@ -180,7 +183,7 @@
   /**
    * Convert MySQL datetime to ISO 8601 timestamp
    */
   protected function formatTimestamp(?string $mysqlDatetime): ?string
   public function formatTimestamp(?string $mysqlDatetime): ?string
   {
      return Response::formatTimestamp($mysqlDatetime);
   }
@@ -483,10 +486,20 @@
    */
   protected function checkUser(int $userId): bool
   {
      $cache = Cache::for('checkUser', DAY_IN_SECONDS)->connect('user');
      $cache = Cache::for('checkUser', 'user',DAY_IN_SECONDS);
      return $cache->remember($userId, fn() => (bool) get_userdata($userId));
   }
   protected function checkArray(string $value, array $search, bool $lowercase = true):string|false
   {
      if ($lowercase) {
         $value = strtolower($value);
      }
      return in_array($value, $search) ? $value : false;
   }
   /**
    * Check if term exists (cached)
    */
@@ -499,7 +512,7 @@
         return false;
      }
      $cache = Cache::for('checkTerm', DAY_IN_SECONDS)->connect('taxonomy');
      $cache = Cache::for('checkTerm', 'term', DAY_IN_SECONDS);
      return $cache->remember($termId, fn() => (bool) term_exists($termId, jvbCheckBase($taxonomy)));
   }
@@ -508,7 +521,7 @@
    */
   protected function isVerifiedUser(int $userId): bool
   {
      $cache = Cache::for('verifiedUsers', DAY_IN_SECONDS)->connect('user');
      $cache = Cache::for('verifiedUsers', 'user',DAY_IN_SECONDS);
      return $cache->remember($userId, fn() => user_can($userId, 'skip_moderation'));
   }
@@ -555,11 +568,11 @@
    */
   protected function verifyTurnstile(string $token): bool
   {
      if (!Site::hasIntegration('cloudflare') || !JVB()->connect('cloudflare')->isSetUp()) {
      if (!Site::hasIntegration('cloudflare') || !Cloudflare::getInstance()->isSetUp()) {
         return true;
      }
      return !empty($token) && JVB()->connect('cloudflare')->verifyTurnstile($token);
      return !empty($token) && Cloudflare::getInstance()->verifyTurnstile($token);
   }
   /**
@@ -632,7 +645,7 @@
      ]);
      try {
         JVB()->error()->log('security_audit', $event, $context, 'info');
         Errors::getInstance()->log('security_audit', $event, $context, 'info');
      } catch (Exception $e) {
         error_log("Security Audit: {$event} - " . json_encode($context));
      }
@@ -644,7 +657,7 @@
   protected function logError(string $message, array $context = [], string $severity = 'error'): void
   {
      try {
         JVB()->error()->log(static::class, $message, $context, $severity);
         Errors::getInstance()->log(static::class, $message, $context, $severity);
      } catch (Exception $e) {
         error_log(static::class . " Error: {$message} - " . json_encode($context));
      }
@@ -878,12 +891,12 @@
         return $terms;
      }
      $ids = array_map('absint', explode(',',$value));
      $cache = Cache::for('term_data')->connect('taxonomy');
      $cache = Cache::for('term_data','term');
      $cache->flush();
      if (!array_key_exists($taxonomy, $terms)) {
         $terms[$taxonomy] = [];
         $registrar = Registrar::getInstance($taxonomy);
         $terms[$taxonomy]['icon'] = $registrar ? $registrar->getIcon() : jvbDefaultIcon();;
         $terms[$taxonomy]['icon'] = $registrar ? $registrar->getIcon() : jvbDefaultIcon();
      }
      foreach ($ids as $id) {
         $data = $cache->remember(
@@ -896,7 +909,7 @@
                     'name'   => $term->name,
                     'slug'   => $term->slug,
                     'parent' => $term->parent,
                     'path'   => JVB()->routes('term')->getTermPath($term->term_id, $term->name, $taxonomy),
                     'path'   => TermRoutes::getInstance()->getTermPath($term->term_id, $term->name, $taxonomy),
                     'taxonomy'  => jvbNoBase($term->taxonomy),
                     'count'  => $term->count,
                  ];