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.9/src/Handler/TriggerAllThemeUpdatesHandler.php
<?php

declare(strict_types=1);

namespace VPlugins\WPCloudClient\Handler;

use VPlugins\WPCloudClient\Support\Logger;

/**
 * Triggers updates for every theme that has one available.
 *
 * Action name: trigger_all_theme_updates
 *
 * Response example:
 * {
 *   "results": [
 *     { "updated": true, "slug": "twentytwentyfour", "previous_version": "1.0", "new_version": "1.1", "message": "..." }
 *   ],
 *   "failures": [
 *     { "slug": "some-theme", "message": "Update failed for theme ..." }
 *   ],
 *   "succeeded": 1,
 *   "failed":    1
 * }
 */
final class TriggerAllThemeUpdatesHandler extends AbstractHandler {

	/**
	 * Class constructor.
	 *
	 * @param HandlerInterface $single Per-theme update handler (expected to be TriggerThemeUpdateHandler).
	 * @param Logger           $logger Logger instance.
	 */
	public function __construct(
		private readonly HandlerInterface $single,
		private readonly Logger $logger,
	) {}

	/**
	 * Return the action name.
	 *
	 * @return string
	 */
	public function action(): string {
		return 'trigger_all_theme_updates';
	}

	/**
	 * Run updates for every theme with one available.
	 *
	 * @param array<string, mixed> $params Action parameters.
	 * @return array<string, mixed> Aggregate result.
	 */
	public function execute( array $params ): array {
		$slugs    = $this->collectUpdatableSlugs();
		$results  = [];
		$failures = [];

		foreach ( $slugs as $slug ) {
			try {
				$result = $this->single->execute( [ 'slug' => $slug ] );
				if ( ! empty( $result['updated'] ) ) {
					$results[] = $result;
				} else {
					$failures[] = [
						'slug'    => $slug,
						'message' => (string) ( $result['message'] ?? 'Update skipped.' ),
					];
				}
			} catch ( \Throwable $e ) {
				$this->logger->error(
					'Bulk theme update failed for slug',
					[
						'slug'  => $slug,
						'error' => $e->getMessage(),
					]
				);
				$failures[] = [
					'slug'    => $slug,
					'message' => $e->getMessage(),
				];
			}
		}

		return [
			'results'   => $results,
			'failures'  => $failures,
			'succeeded' => count( $results ),
			'failed'    => count( $failures ),
		];
	}

	/**
	 * Return theme stylesheet slugs that the update transient reports have updates available.
	 *
	 * @return list<string>
	 */
	private function collectUpdatableSlugs(): array {
		$transient = get_site_transient( 'update_themes' );
		if ( ! is_object( $transient ) || ! isset( $transient->response ) ) {
			return [];
		}

		$response = (array) $transient->response;
		return array_values( array_map( 'strval', array_keys( $response ) ) );
	}
}