From 0afb2c0046b55c123eafb4ab9ee77efa68d12463 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sat, 06 Jun 2026 17:15:31 +0000
Subject: [PATCH] =Starting the Favourites.js setup, converting previous Northeh stuff to new Registrar, fixing up Square.php integration to match

---
 inc/rest/routes/AdminRoutes.php |  225 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 225 insertions(+), 0 deletions(-)

diff --git a/inc/rest/routes/AdminRoutes.php b/inc/rest/routes/AdminRoutes.php
new file mode 100644
index 0000000..4f89e76
--- /dev/null
+++ b/inc/rest/routes/AdminRoutes.php
@@ -0,0 +1,225 @@
+<?php
+namespace JVBase\rest\routes;
+
+use JVBase\JVB;
+use JVBase\managers\Cache;
+use JVBase\managers\IconsManager;
+use JVBase\rest\Rest;
+use JVBase\rest\Route;
+use JVBase\rest\PermissionHandler;
+use WP_Query;
+use WP_Error;
+use WP_REST_Request;
+use WP_REST_Response;
+
+if (!defined('ABSPATH')) {
+    exit; // Exit if accessed directly
+}
+
+class AdminRoutes extends Rest
+{
+    protected array $fields;
+    protected $meta;
+    protected string $metaType;
+    protected string $content;
+
+    public function __construct()
+    {
+        $this->cacheName = 'itsme';
+        parent::__construct();
+    }
+    public function registerRoutes():void
+    {
+		Route::for('admin-cache')
+			->post([$this, 'handleCacheAction'])
+			->auth('admin')
+			->rateLimit(30)
+			->register();
+
+		Route::for('admin-icons')
+			->post([$this, 'handleIconAction'])
+			->auth('admin')
+			->rateLimit(30)
+			->register();
+
+		Route::for('admin-action')
+			->post([$this, 'adminAction'])
+			->auth('admin')
+			->rateLimit()
+			->register();
+    }
+
+    /**
+     * Handles admin actions from the custom WP Admin pages.
+     * Extended by other managers that register admin subpages
+     * @param WP_REST_Request $request
+     *
+     * @return WP_REST_Response
+     */
+    public function adminAction(WP_REST_Request $request):WP_REST_Response
+    {
+        error_log('Request Params: '.print_r($request->get_param('action'), true));
+        return apply_filters(
+            BASE.'admin_action_filter',
+            new WP_REST_Response([
+                'success'   => false,
+                'message'   => 'No filters found'
+            ]),
+            $request,
+            sanitize_text_field($request->get_param('action'))
+        );
+    }
+
+
+    /**
+     * @param array $filters
+     *
+     * @return array
+     */
+    protected function checkFilters(array $filters)
+    {
+        global $karma;
+        $out = [];
+        foreach ($filters as $type => $value) {
+            if (!array_key_exists($type, $karma)) {
+                continue;
+            }
+            $out[$type]  = jvbSanitizeIDList($value);
+        }
+        return $out;
+    }
+
+	/**
+	 * Handle cache-related actions
+	 */
+	public function handleCacheAction(\WP_REST_Request $request): \WP_REST_Response
+	{
+		$action = sanitize_text_field($request->get_param('action'));
+
+		switch ($action) {
+			case 'flush-all':
+				$total = Cache::flushAll();
+				return new \WP_REST_Response([
+					'success' => true,
+					'message' => $total.' caches flushed successfully'
+				]);
+
+			case 'flush-cache':
+				$group = sanitize_text_field($request->get_param('group'));
+				if (empty($group)) {
+					return new \WP_REST_Response([
+						'success' => false,
+						'message' => 'No cache group specified'
+					], 400);
+				}
+
+				Cache::for($group)?->flush();
+
+				return new \WP_REST_Response([
+					'success' => true,
+					'message' => "Cache group '{$group}' flushed successfully"
+				]);
+
+			default:
+				return new \WP_REST_Response([
+					'success' => false,
+					'message' => 'Invalid action'
+				], 400);
+		}
+	}
+
+	/**
+	 * Handle icon-related actions
+	 */
+	public function handleIconAction(\WP_REST_Request $request): \WP_REST_Response
+	{
+		$action = sanitize_text_field($request->get_param('action'));
+		$source = sanitize_text_field($request->get_param('source') ?? 'icons');
+		$icons = IconsManager::for($source);
+
+		switch ($action) {
+			case 'refresh-icons':
+				// Force regenerate CSS immediately
+				$icons->forceRefresh();
+				IconsManager::regenerateAllCSS([$source => true]);
+
+				return new \WP_REST_Response([
+					'success' => true,
+					'message' => "Icon CSS regenerated successfully for '{$source}'"
+				]);
+
+			case 'refresh-all-icons':
+				// Regenerate all icon sources
+				foreach (['icons', 'forms', 'dash'] as $src) {
+					IconsManager::for($src)->forceRefresh();
+				}
+				IconsManager::regenerateAllCSS();
+
+				return new \WP_REST_Response([
+					'success' => true,
+					'message' => 'All icon CSS files regenerated successfully'
+				]);
+
+			case 'restore-icon-version':
+				$timestamp = (int)$request->get_param('timestamp');
+				if (empty($timestamp)) {
+					return new \WP_REST_Response([
+						'success' => false,
+						'message' => 'No timestamp provided'
+					], 400);
+				}
+
+				if ($icons->restoreVersion($timestamp)) {
+					return new \WP_REST_Response([
+						'success' => true,
+						'message' => 'Icon version restored successfully'
+					]);
+				}
+
+				return new \WP_REST_Response([
+					'success' => false,
+					'message' => 'Failed to restore icon version'
+				], 500);
+
+			case 'merge-icon-versions':
+				$timestamps = $request->get_param('timestamps');
+
+				if (empty($timestamps) || !is_array($timestamps)) {
+					return new \WP_REST_Response([
+						'success' => false,
+						'message' => 'No versions selected for merging'
+					], 400);
+				}
+
+				$timestamps = array_map('intval', $timestamps);
+
+				if (count($timestamps) < 2) {
+					return new \WP_REST_Response([
+						'success' => false,
+						'message' => 'Please select at least 2 versions to merge'
+					], 400);
+				}
+
+				if ($icons->mergeVersions($timestamps)) {
+					// Regenerate CSS after merge
+					IconsManager::regenerateAllCSS([$source => true]);
+
+					return new \WP_REST_Response([
+						'success' => true,
+						'message' => 'Icon versions merged successfully'
+					]);
+				}
+
+				return new \WP_REST_Response([
+					'success' => false,
+					'message' => 'Failed to merge icon versions'
+				], 500);
+
+			default:
+				return new \WP_REST_Response([
+					'success' => false,
+					'message' => 'Invalid action'
+				], 400);
+		}
+	}
+}

--
Gitblit v1.10.0