File: /wordpress/plugins/wp-cloud-client/1.1.8/src/Api/Controller/ActionController.php
<?php
declare(strict_types=1);
namespace VPlugins\WPCloudClient\Api\Controller;
use VPlugins\WPCloudClient\Api\ApiResponse;
use VPlugins\WPCloudClient\Handler\HandlerRegistry;
use VPlugins\WPCloudClient\Support\Logger;
use WP_REST_Request;
use WP_REST_Response;
final readonly class ActionController {
/**
* Construct the action controller.
*
* @param HandlerRegistry $registry Handler registry instance.
* @param Logger $logger Logger instance.
*/
public function __construct(
private HandlerRegistry $registry,
private Logger $logger,
) {}
/**
* Dispatch an incoming action request to the appropriate handler.
*
* @param WP_REST_Request $request The incoming REST request.
* @return WP_REST_Response The REST response.
*/
public function dispatch( WP_REST_Request $request ): WP_REST_Response {
$action = $request->get_param( 'action' );
$params = $request->get_param( 'params' ) ?? [];
if ( ! $action || ! is_string( $action ) ) {
return ApiResponse::error(
'missing_action',
'The "action" field is required.',
400,
)->toWpResponse();
}
if ( ! is_array( $params ) ) {
return ApiResponse::error(
'invalid_params',
'The "params" field must be an object.',
400,
)->toWpResponse();
}
$handler = $this->registry->get( $action );
if ( ! $handler ) {
return ApiResponse::error(
'unknown_action',
sprintf( 'Unknown action: %s', $action ),
404,
)->toWpResponse();
}
try {
$result = $handler->execute( $params );
$this->logger->info( sprintf( 'Action "%s" completed successfully', $action ) );
return ApiResponse::success( $result )->toWpResponse();
} catch ( \InvalidArgumentException $e ) {
$this->logger->warning( sprintf( 'Action "%s" validation failed', $action ), $e );
return ApiResponse::error( 'validation_error', $e->getMessage(), 400 )->toWpResponse();
} catch ( \Throwable $e ) {
$this->logger->error( sprintf( 'Action "%s" failed', $action ), $e );
return ApiResponse::error( 'action_failed', $e->getMessage(), 500 )->toWpResponse();
}
}
/**
* Handle a health check request.
*
* @param WP_REST_Request $request The incoming REST request.
* @return WP_REST_Response The REST response.
*/
public function health( WP_REST_Request $request ): WP_REST_Response {
$handler = $this->registry->get( 'health_check' );
if ( ! $handler ) {
return ApiResponse::error( 'handler_not_found', 'Health check handler not registered.', 500 )->toWpResponse();
}
$result = $handler->execute( [] );
return ApiResponse::success( $result )->toWpResponse();
}
}