From a1f251233940843796239f015343d89bdcde04d2 Mon Sep 17 00:00:00 2001
From: "a.shamavov" <a.shamavov@iqdev.digital>
Date: Tue, 16 Apr 2024 10:13:42 +0500
Subject: [PATCH] temp commit

---
 src/Requests/BaseRequest.php         | 62 ++++++++++++++++++++++++++++
 src/Requests/DiffDaysRequest.php     | 14 +++++++
 src/Requests/MenuRequest.php         | 16 +++++++
 src/Requests/SearchRequest.php       | 20 +++++++++
 src/Requests/SortPriceRequest.php    | 16 +++++++
 src/Requests/UniqElementsRequest.php | 16 +++++++
 src/Validation/ArrayValidation.php   | 26 ------------
 src/Validation/DateValidation.php    | 14 -------
 8 files changed, 144 insertions(+), 40 deletions(-)
 create mode 100644 src/Requests/BaseRequest.php
 create mode 100644 src/Requests/DiffDaysRequest.php
 create mode 100644 src/Requests/MenuRequest.php
 create mode 100644 src/Requests/SearchRequest.php
 create mode 100644 src/Requests/SortPriceRequest.php
 create mode 100644 src/Requests/UniqElementsRequest.php
 delete mode 100644 src/Validation/ArrayValidation.php
 delete mode 100644 src/Validation/DateValidation.php

diff --git a/src/Requests/BaseRequest.php b/src/Requests/BaseRequest.php
new file mode 100644
index 0000000..9bebc7d
--- /dev/null
+++ b/src/Requests/BaseRequest.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Component\Validator\Validator\ValidatorInterface;
+
+abstract class BaseRequest
+{
+    public function __construct(protected ValidatorInterface $validator)
+    {
+        $this->populate();
+
+        if ($this->autoValidateRequest()) {
+            $this->validate();
+        }
+    }
+
+    public function validate(): void
+    {
+        $errors = $this->validator->validate($this);
+
+        $messages = ['message' => 'validation_failed', 'errors' => []];
+
+        /** @var ConstraintViolation $errors */
+        foreach ($errors as $message) {
+            $messages['errors'][] = [
+                'property' => $message->getPropertyPath(),
+                'value' => $message->getInvalidValue(),
+                'message' => $message->getMessage(),
+            ];
+        }
+
+        if (count($messages['errors']) > 0) {
+            $response = new JsonResponse($messages, 201);
+            $response->send();
+
+            exit;
+        }
+    }
+
+    public function getRequest(): Request
+    {
+        return Request::createFromGlobals();
+    }
+
+    protected function populate(): void
+    {
+        foreach ($this->getRequest()->request->all() as $property => $value) {
+            if (property_exists($this, $property)) {
+                $this->{$property} = $value;
+            }
+        }
+    }
+
+    protected function autoValidateRequest(): bool
+    {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/src/Requests/DiffDaysRequest.php b/src/Requests/DiffDaysRequest.php
new file mode 100644
index 0000000..8cba54e
--- /dev/null
+++ b/src/Requests/DiffDaysRequest.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\Validator\Constraints as Assert;
+
+class DiffDaysRequest extends BaseRequest
+{
+    #[Assert\Type('date')]
+    public $startDate;
+
+    #[Assert\Type('date')]
+    public $endDate;
+}
\ No newline at end of file
diff --git a/src/Requests/MenuRequest.php b/src/Requests/MenuRequest.php
new file mode 100644
index 0000000..e012d13
--- /dev/null
+++ b/src/Requests/MenuRequest.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\Validator\Constraints as Assert;
+
+class MenuRequest extends BaseRequest
+{
+    #[Assert\All([
+        new Assert\Collection([
+            'name' => new Assert\Type('string'),
+            'depth' => new Assert\Type('int'),
+        ])
+    ])]
+    public array $items;
+}
\ No newline at end of file
diff --git a/src/Requests/SearchRequest.php b/src/Requests/SearchRequest.php
new file mode 100644
index 0000000..eb03843
--- /dev/null
+++ b/src/Requests/SearchRequest.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\Validator\Constraints as Assert;
+
+class SearchRequest extends BaseRequest
+{
+    #[Assert\All([
+        new Assert\Collection([
+            'id' => new Assert\Type('int'),
+            'name' => new Assert\Type('string'),
+            'age' => new Assert\Type('int'),
+        ])
+    ])]
+    public array $items;
+
+    #[Assert\Type('int')]
+    public int $id;
+}
\ No newline at end of file
diff --git a/src/Requests/SortPriceRequest.php b/src/Requests/SortPriceRequest.php
new file mode 100644
index 0000000..38bdf00
--- /dev/null
+++ b/src/Requests/SortPriceRequest.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\Validator\Constraints as Assert;
+
+class SortPriceRequest extends BaseRequest
+{
+    #[Assert\All([
+        new Assert\Collection([
+            'price' => new Assert\Type('int'),
+            'count' => new Assert\Type('int')
+        ])
+    ])]
+    public array $items;
+}
\ No newline at end of file
diff --git a/src/Requests/UniqElementsRequest.php b/src/Requests/UniqElementsRequest.php
new file mode 100644
index 0000000..f53156b
--- /dev/null
+++ b/src/Requests/UniqElementsRequest.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\Validator\Constraints as Assert;
+
+class UniqElementsRequest extends BaseRequest
+{
+    #[Assert\All([
+        new Assert\Type('array'),
+        new Assert\All([
+            new Assert\Type('string'),
+        ])
+    ])]
+    public array $items;
+}
\ No newline at end of file
diff --git a/src/Validation/ArrayValidation.php b/src/Validation/ArrayValidation.php
deleted file mode 100644
index 5807a44..0000000
--- a/src/Validation/ArrayValidation.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-namespace App\Validation;
-
-class ArrayValidation
-{
-    public static function validateFunc1(array $array): bool
-    {
-        $prices = array_column($array, 'price');
-        $counts = array_column($array, 'count');
-        return ctype_digit(implode('',$prices)) && ctype_digit(implode('', $counts));
-    }
-
-    public static function validateFunc2(array $array): bool
-    {
-        $ids = array_column($array, 'id');
-        $ages = array_column($array, 'age');
-        return ctype_digit(implode('', $ids)) && ctype_digit(implode('', $ages));
-    }
-
-    public static function validateFunc4(array $array): bool
-    {
-        $depths = array_column($array, 'depth');
-        return ctype_digit(implode('', $depths));
-    }
-}
\ No newline at end of file
diff --git a/src/Validation/DateValidation.php b/src/Validation/DateValidation.php
deleted file mode 100644
index 18046f8..0000000
--- a/src/Validation/DateValidation.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace App\Validation;
-
-class DateValidation
-{
-    public static function validate(string $date): bool
-    {
-        if (strtotime($date)) {
-            return true;
-        }
-        return false;
-    }
-}
\ No newline at end of file
-- 
GitLab