Jake Vanderwerf
5 days ago a9b3b28d001941921aa70d37fdc87c758a163a44
inc/rest/routes/AdminRoutes.php
New file
@@ -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);
      }
   }
}