<?php
|
namespace JVBase\managers\queue;
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
final class FilteredExecutor implements Executor
|
{
|
public function execute(Operation $operation, Progress $progress): Result
|
{
|
// Process whatever data is passed (Processor handles chunking)
|
$filterResult = $this->callFilter($operation, $operation->requestData);
|
|
$progress->advance($operation->totalItems);
|
|
return new Result(
|
outcome: $filterResult['success'] ? 'success' : 'failed',
|
result: $filterResult['result'] ?? null
|
);
|
}
|
|
private function callFilter(Operation $operation, array $data): array
|
{
|
$filterResult = apply_filters(
|
BASE . 'handle_bulk_operation',
|
['success' => false, 'message' => 'No handler for: ' . $operation->type],
|
(object) [
|
'id' => $operation->id,
|
'type' => $operation->type,
|
'user_id' => $operation->userId,
|
],
|
$data
|
);
|
|
// Normalize WP_Error
|
if (is_wp_error($filterResult)) {
|
return [
|
'success' => false,
|
'message' => $filterResult->get_error_message(),
|
];
|
}
|
|
// Ensure expected format
|
if (!is_array($filterResult) || !isset($filterResult['success'])) {
|
return [
|
'success' => false,
|
'message' => 'Invalid handler response',
|
];
|
}
|
|
return $filterResult;
|
}
|
}
|