optimizer = $optimizer; $this->bundles = $bundles; $this->health = $health; } /** Register REST routes on the correct WordPress hook. */ public function register() { add_action( 'rest_api_init', array( $this, 'routes' ) ); } /** Register endpoints for optimizer status and manual recovery. */ public function routes() { $routes = array( '/optimization/status' => array( WP_REST_Server::READABLE, 'status' ), '/optimization/assets/flush' => array( WP_REST_Server::CREATABLE, 'flush_assets' ), '/optimization/health/resume' => array( WP_REST_Server::CREATABLE, 'resume_health' ), ); foreach ( $routes as $path => $config ) { nbh_performance_register_rest_route( 'nbh-performance/v1', $path, array( 'methods' => $config[0], 'callback' => array( $this, $config[1] ), 'permission_callback' => array( $this, 'permission' ), ) ); } } /** * Ensure the current REST request is authorized. * * @param WP_REST_Request $request The REST request. * @return bool|WP_Error */ public function permission( WP_REST_Request $request ) { if ( ! current_user_can( 'manage_options' ) ) { return new WP_Error( 'nbh_performance_forbidden', __( 'You cannot manage CSS and JavaScript optimization.', 'nbh-performance' ), array( 'status' => 403 ) ); } return \NBH\Performance\Modules\Security\NonceGuard::verify_rest( $request ); } /** * Return the active optimization settings. * * @return \WP_REST_Response */ public function status() { $safe = (bool) get_option( 'nbh_performance_safe_mode', 1 ); $flags = array( 'css_minify' => 'nbh_performance_css_minify_enabled', 'js_minify' => 'nbh_performance_js_minify_enabled', 'combine_assets' => 'nbh_performance_combine_assets_enabled', 'defer_js' => 'nbh_performance_defer_js_enabled', 'delay_js' => 'nbh_performance_delay_js_enabled', ); $data = array( 'safe_mode' => $safe, 'script_manager' => (bool) get_option( 'nbh_performance_script_manager_enabled', 0 ), 'delay_timeout' => absint( get_option( 'nbh_performance_delay_timeout', 5000 ) ), 'assets' => $this->optimizer->status(), ); $active = 0; foreach ( $flags as $label => $setting ) { $on = (bool) get_option( $setting, 0 ); $active += (int) $on; $data[ $label ] = $on && ! $safe; } $data['active_features'] = $active; $data['runtime_ready'] = ! $safe && $active > 0 && empty( $data['assets']['emergency_rollback'] ); return rest_ensure_response( $data ); } /** * Flush optimized assets and their manifests. * * @return \WP_REST_Response */ public function flush_assets() { $result = $this->optimizer->flush_cache(); $this->bundles->flush_manifests(); $result['optimization'] = $this->status()->get_data(); return rest_ensure_response( $result ); } /** * Resume optimization after a safety rollback. * * @return \WP_REST_Response */ public function resume_health() { $result = $this->health->clear_and_resume(); $result['optimization'] = $this->status()->get_data(); return rest_ensure_response( $result ); } }