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/Mail/MailCleaner.php
<?php

declare(strict_types=1);

namespace VPlugins\WPCloudClient\Mail;

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

/**
 * REST handler for the mail cleanup endpoint.
 *
 * POST wp-cloud/v1/mail/clean
 * Body: { "mail_id": 1234567890 }
 *
 * Requires API key authentication (same as /actions).
 *
 * Ported from wsp-bootstrapper: api/wsp-mail-clean.php
 */
final readonly class MailCleaner {

	/**
	 * Constructor.
	 *
	 * @param MailManager    $manager Mail manager instance.
	 * @param AuthMiddleware $auth    HMAC authentication middleware.
	 * @param Logger         $logger  Logger instance.
	 */
	public function __construct(
		private MailManager $manager,
		private AuthMiddleware $auth,
		private Logger $logger,
	) {}

	/**
	 * Register the REST cleanup route.
	 */
	public function register(): void {
		register_rest_route(
			'wp-cloud/v1',
			'/mail/clean',
			[
				'methods'             => 'POST',
				'callback'            => [ $this, 'handle' ],
				'permission_callback' => [ $this->auth, 'check' ],
			]
		);
	}

	/**
	 * Handle the cleanup request.
	 *
	 * @param WP_REST_Request $request Incoming REST request.
	 * @return WP_REST_Response
	 */
	public function handle( WP_REST_Request $request ): WP_REST_Response {
		$params = $request->get_json_params();
		$mailId = isset( $params['mail_id'] ) ? (int) $params['mail_id'] : 0;

		if ( $mailId <= 0 ) {
			return ApiResponse::error( 'wpcc_invalid_mail_id', 'Invalid or missing mail_id.', 400 )->toWpResponse();
		}

		// Honour debug flag that prevents deletion during local development.
		if ( defined( 'WPCC_KEEP_EMAIL' ) && WPCC_KEEP_EMAIL ) {
			$this->logger->info( 'MailCleaner: skipping delete (WPCC_KEEP_EMAIL is set)', [ 'mail_id' => $mailId ] );
			return ApiResponse::success(
				[
					'mail_id' => $mailId,
					'kept'    => true,
				]
			)->toWpResponse();
		}

		try {
			$this->manager->clean( $mailId );
		} catch ( \Throwable $e ) {
			$this->logger->error( 'MailCleaner: failed to clean mail', $e );
			return ApiResponse::error( 'wpcc_clean_failed', 'Failed to clean mail.', 500 )->toWpResponse();
		}

		return ApiResponse::success(
			[
				'mail_id' => $mailId,
				'cleaned' => true,
			]
		)->toWpResponse();
	}
}