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.7/src/Api/Controller/SubsiteController.php
<?php

declare(strict_types=1);

namespace VPlugins\WPCloudClient\Api\Controller;

use VPlugins\WPCloudClient\Api\ApiResponse;
use VPlugins\WPCloudClient\Support\Logger;
use WP_REST_Request;
use WP_REST_Response;

final readonly class SubsiteController {

	private const MAX_PER_PAGE = 500;

	/**
	 * Construct the subsite controller.
	 *
	 * @param Logger $logger Logger instance.
	 */
	public function __construct(
		private Logger $logger,
	) {}

	/**
	 * Return a paginated subsite list for the network.
	 *
	 * Accepts optional `number` (1–500, default 500) and `offset` (default 0)
	 * query parameters for pagination.
	 *
	 * @param WP_REST_Request $request The incoming REST request.
	 * @return WP_REST_Response
	 */
	public function list( WP_REST_Request $request ): WP_REST_Response {
		if ( ! is_multisite() ) {
			return ApiResponse::error( 'not_multisite', 'This endpoint is only available on multisite installations.', 400 )->toWpResponse();
		}

		try {
			$number = max( 1, min( (int) ( $request->get_param( 'number' ) ?? self::MAX_PER_PAGE ), self::MAX_PER_PAGE ) );
			$offset = max( 0, (int) ( $request->get_param( 'offset' ) ?? 0 ) );

			$allSites = get_sites(
				[
					'number' => $number,
					'offset' => $offset,
				]
			);

			$subsites = [];

			foreach ( $allSites as $site ) {
				if ( $site->spam ) {
					$status = 'spam';
				} elseif ( $site->archived ) {
					$status = 'archived';
				} elseif ( $site->deleted ) {
					$status = 'deactivated';
				} else {
					$status = 'active';
				}

				$subsites[] = [
					'blog_id'      => (int) $site->blog_id,
					'blog_name'    => (string) get_blog_option( (int) $site->blog_id, 'blogname' ),
					'path'         => (string) $site->path,
					'domain'       => (string) $site->domain,
					'status'       => $status,
					'created_at'   => (string) $site->registered,
					'last_updated' => (string) $site->last_updated,
				];
			}

			return ApiResponse::success(
				[
					'subsites' => $subsites,
					'count'    => count( $subsites ),
				]
			)->toWpResponse();
		} catch ( \Throwable $e ) {
			$this->logger->error( 'SubsiteController: failed to list subsites', $e );
			return ApiResponse::error( 'list_failed', 'An internal error occurred while listing subsites.', 500 )->toWpResponse();
		}
	}
}