| New file |
| | |
| | | <?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); |
| | | } |
| | | } |
| | | } |