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