From 3cf1657d54b6d9d2282ef6d6403cf5f6211f081e Mon Sep 17 00:00:00 2001
From: Alejandro Celaya <alejandro@alejandrocelaya.com>
Date: Fri, 29 Nov 2019 18:55:27 +0100
Subject: [PATCH] Simplified invalidElements to be a plain list of keys when a
 ValidationException is cast into a problem details error

---
 module/Core/src/Exception/ValidationException.php      | 9 +++++++--
 module/Core/test/Exception/ValidationExceptionTest.php | 2 ++
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/module/Core/src/Exception/ValidationException.php b/module/Core/src/Exception/ValidationException.php
index f3a5c515..abceec91 100644
--- a/module/Core/src/Exception/ValidationException.php
+++ b/module/Core/src/Exception/ValidationException.php
@@ -10,6 +10,7 @@ use Zend\InputFilter\InputFilterInterface;
 use Zend\ProblemDetails\Exception\CommonProblemDetailsExceptionTrait;
 use Zend\ProblemDetails\Exception\ProblemDetailsExceptionInterface;
 
+use function array_keys;
 use function Functional\reduce_left;
 use function is_array;
 use function print_r;
@@ -24,6 +25,9 @@ class ValidationException extends InvalidArgumentException implements ProblemDet
     private const TITLE = 'Invalid data';
     private const TYPE = 'INVALID_ARGUMENT';
 
+    /** @var array */
+    private $invalidElements;
+
     public static function fromInputFilter(InputFilterInterface $inputFilter, ?Throwable $prev = null): self
     {
         return static::fromArray($inputFilter->getMessages(), $prev);
@@ -38,14 +42,15 @@ class ValidationException extends InvalidArgumentException implements ProblemDet
         $e->title = self::TITLE;
         $e->type = self::TYPE;
         $e->status = StatusCodeInterface::STATUS_BAD_REQUEST;
-        $e->additional = ['invalidElements' => $invalidData];
+        $e->invalidElements = $invalidData;
+        $e->additional = ['invalidElements' => array_keys($invalidData)];
 
         return $e;
     }
 
     public function getInvalidElements(): array
     {
-        return $this->additional['invalidElements'];
+        return $this->invalidElements;
     }
 
     public function __toString(): string
diff --git a/module/Core/test/Exception/ValidationExceptionTest.php b/module/Core/test/Exception/ValidationExceptionTest.php
index 069506b5..11bb8026 100644
--- a/module/Core/test/Exception/ValidationExceptionTest.php
+++ b/module/Core/test/Exception/ValidationExceptionTest.php
@@ -12,6 +12,7 @@ use Shlinkio\Shlink\Core\Exception\ValidationException;
 use Throwable;
 use Zend\InputFilter\InputFilterInterface;
 
+use function array_keys;
 use function print_r;
 
 class ValidationExceptionTest extends TestCase
@@ -38,6 +39,7 @@ EOT;
         $e = ValidationException::fromInputFilter($inputFilter->reveal());
 
         $this->assertEquals($invalidData, $e->getInvalidElements());
+        $this->assertEquals(['invalidElements' => array_keys($invalidData)], $e->getAdditionalData());
         $this->assertEquals('Provided data is not valid', $e->getMessage());
         $this->assertEquals(StatusCodeInterface::STATUS_BAD_REQUEST, $e->getCode());
         $this->assertEquals($prev, $e->getPrevious());