Skip to content

Commit

Permalink
Merge pull request #11 from KaririCode-Framework/develop
Browse files Browse the repository at this point in the history
feat(validator): implement ProcessorValidator and update AttributeHan…
  • Loading branch information
walmir-silva authored Oct 21, 2024
2 parents 3c27472 + 7103d09 commit 71c65ce
Show file tree
Hide file tree
Showing 6 changed files with 259 additions and 80 deletions.
38 changes: 19 additions & 19 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

74 changes: 54 additions & 20 deletions src/AttributeHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,19 @@
use KaririCode\PropertyInspector\Contract\PropertyAttributeHandler;
use KaririCode\PropertyInspector\Contract\PropertyChangeApplier;
use KaririCode\PropertyInspector\Processor\ProcessorConfigBuilder;
use KaririCode\PropertyInspector\Processor\ProcessorValidator;
use KaririCode\PropertyInspector\Utility\PropertyAccessor;

class AttributeHandler implements PropertyAttributeHandler, PropertyChangeApplier
{
private array $processedValues = [];
private array $processingErrors = [];
private array $processingMessages = [];
private array $processedPropertyValues = [];
private array $processingResultErrors = [];
private array $processingResultMessages = [];

public function __construct(
private readonly string $processorType,
private readonly ProcessorBuilder $builder,
private readonly ProcessorValidator $validator = new ProcessorValidator(),
private readonly ProcessorConfigBuilder $configBuilder = new ProcessorConfigBuilder()
) {
}
Expand All @@ -36,20 +38,49 @@ public function handleAttribute(string $propertyName, object $attribute, mixed $

try {
$processedValue = $this->processValue($value, $processorsConfig);
$this->storeProcessedValue($propertyName, $processedValue, $messages);
$errors = $this->validateProcessors($processorsConfig, $messages);

return $processedValue; // Return the processed value, not the original
$this->storeProcessedPropertyValue($propertyName, $processedValue, $messages);

if (!empty($errors)) {
$this->storeProcessingResultErrors($propertyName, $errors);
}

return $processedValue;
} catch (\Exception $e) {
$this->storeProcessingError($propertyName, $e->getMessage());
$this->storeProcessingResultError($propertyName, $e->getMessage());

return $value;
}
}

private function validateProcessors(array $processorsConfig, array $messages): array
{
$errors = [];
foreach ($processorsConfig as $processorName => $config) {
$processor = $this->builder->build($this->processorType, $processorName, $config);
$validationError = $this->validator->validate(
$processor,
$processorName,
$messages
);

if (null !== $validationError) {
$errors[$processorName] = $validationError;
}
}

return $errors;
}

private function storeProcessingResultErrors(string $propertyName, array $errors): void
{
$this->processingResultErrors[$propertyName] = $errors;
}

private function extractCustomMessages(ProcessableAttribute $attribute, array &$processorsConfig): array
{
$messages = [];

if ($attribute instanceof CustomizableMessageAttribute) {
foreach ($processorsConfig as $processorName => &$config) {
$customMessage = $attribute->getMessage($processorName);
Expand All @@ -65,45 +96,48 @@ private function extractCustomMessages(ProcessableAttribute $attribute, array &$

private function processValue(mixed $value, array $processorsConfig): mixed
{
$pipeline = $this->builder->buildPipeline($this->processorType, $processorsConfig);
$pipeline = $this->builder->buildPipeline(
$this->processorType,
$processorsConfig
);

return $pipeline->process($value);
}

private function storeProcessedValue(string $propertyName, mixed $processedValue, array $messages): void
private function storeProcessedPropertyValue(string $propertyName, mixed $processedValue, array $messages): void
{
$this->processedValues[$propertyName] = [
$this->processedPropertyValues[$propertyName] = [
'value' => $processedValue,
'messages' => $messages,
];
$this->processingMessages[$propertyName] = $messages;
$this->processingResultMessages[$propertyName] = $messages;
}

private function storeProcessingError(string $propertyName, string $errorMessage): void
private function storeProcessingResultError(string $propertyName, string $errorMessage): void
{
$this->processingErrors[$propertyName][] = $errorMessage;
$this->processingResultErrors[$propertyName][] = $errorMessage;
}

public function applyChanges(object $entity): void
{
foreach ($this->processedValues as $propertyName => $data) {
foreach ($this->processedPropertyValues as $propertyName => $data) {
$accessor = new PropertyAccessor($entity, $propertyName);
$accessor->setValue($data['value']);
}
}

public function getProcessedValues(): array
public function getProcessedPropertyValues(): array
{
return $this->processedValues;
return $this->processedPropertyValues;
}

public function getProcessingErrors(): array
public function getProcessingResultErrors(): array
{
return $this->processingErrors;
return $this->processingResultErrors;
}

public function getProcessingMessages(): array
public function getProcessingResultMessages(): array
{
return $this->processingMessages;
return $this->processingResultMessages;
}
}
21 changes: 21 additions & 0 deletions src/Contract/PropertyAttributeHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,25 @@ interface PropertyAttributeHandler
* @return mixed The result of handling the attribute
*/
public function handleAttribute(string $propertyName, object $attribute, mixed $value): mixed;

/**
* Retrieves the values after processing.
*
* @return array<string, mixed> The processed values indexed by property name
*/
public function getProcessedPropertyValues(): array;

/**
* Retrieves the messages generated during processing.
*
* @return array<string, array<string, string>> The processing messages indexed by property name and processor
*/
public function getProcessingResultMessages(): array;

/**
* Retrieves the errors encountered during processing.
*
* @return array<string, array<string, string>> The processing errors indexed by property name and processor
*/
public function getProcessingResultErrors(): array;
}
26 changes: 26 additions & 0 deletions src/Processor/ProcessorValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace KaririCode\PropertyInspector\Processor;

use KaririCode\Contract\Processor\Processor;
use KaririCode\Contract\Processor\ProcessorValidator as ProcessorValidatorContract;
use KaririCode\Contract\Processor\ValidatableProcessor;

class ProcessorValidator implements ProcessorValidatorContract
{
public function validate(Processor $processor, string $processorName, array $messages): ?array
{
if ($processor instanceof ValidatableProcessor && !$processor->isValid()) {
$errorKey = $processor->getErrorKey();

return [
'errorKey' => $errorKey,
'message' => $messages[$processorName] ?? "Validation failed for $processorName",
];
}

return null;
}
}
Loading

0 comments on commit 71c65ce

Please sign in to comment.