HEX
Server: nginx
System: Linux pool195-106-36.bur.atomicsites.net 6.12.57+deb12-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.57-1~bpo12+1 (2025-11-17) x86_64
User: (0)
PHP: 8.3.32
Disabled: pcntl_fork
Upload Files
File: /wordpress/plugins/wp-cloud-client/1.1.3/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();
	}
}