From 48b0e95da20d7859eb912cffa1f96f0beb7467b9 Mon Sep 17 00:00:00 2001
From: "Alex. Plokhikh" <a.plohih@iqdev.digital>
Date: Tue, 16 Apr 2024 03:24:28 +0500
Subject: [PATCH] add diff days action | controller | req

---
 src/Actions/DiffDaysAction.php        | 21 +++++++++++++++++++
 src/Controller/DiffDaysController.php | 14 ++++++-------
 src/Requests/DiffDaysRequest.php      | 29 +++++++++++++++++++++++++++
 3 files changed, 57 insertions(+), 7 deletions(-)
 create mode 100644 src/Actions/DiffDaysAction.php
 create mode 100644 src/Requests/DiffDaysRequest.php

diff --git a/src/Actions/DiffDaysAction.php b/src/Actions/DiffDaysAction.php
new file mode 100644
index 0000000..c3ee3c2
--- /dev/null
+++ b/src/Actions/DiffDaysAction.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Actions;
+
+use DateTimeImmutable;
+
+class DiffDaysAction
+{
+    /**
+     * Вернет кол-во дней между датами
+     * @param DateTimeImmutable $dateStart дата начала
+     * @param DateTimeImmutable $dateEnd дата окончания
+     * @return int
+     * */
+    public function act(
+        DateTimeImmutable $dateStart,
+        DateTimeImmutable $dateEnd
+    ): int {
+        return (int) $dateStart->diff($dateEnd)->format('%a');
+    }
+}
diff --git a/src/Controller/DiffDaysController.php b/src/Controller/DiffDaysController.php
index a5c7c11..8c74584 100644
--- a/src/Controller/DiffDaysController.php
+++ b/src/Controller/DiffDaysController.php
@@ -2,6 +2,8 @@
 
 namespace App\Controller;
 
+use App\Actions\DiffDaysAction;
+use App\Requests\DiffDaysRequest;
 use DateTimeImmutable;
 use HttpResponse;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@@ -14,16 +16,14 @@ class DiffDaysController extends AbstractController
 {
     /**
      * Контроллер вернет кол-во дней между датами
-     * @param Request $request
+     * @param DiffDaysRequest $request
+     * @param DiffDaysAction $action
      * @return Response
      */
     #[Route('/diff/days', name: 'app_diff_days', methods: ['POST'])]
-    public function index(Request $request): Response
+    public function index(DiffDaysRequest $request, DiffDaysAction $action): Response
     {
-        $dateStart = new DateTimeImmutable($request->toArray()['date_start']);
-        $dateEnd = new DateTimeImmutable($request->toArray()['date_end']);
-
-        return new JsonResponse(["interval"=>($dateStart->diff($dateEnd)->format("%a"))]
-            , Response::HTTP_OK);
+        $array = $request->serialise();
+        return new JsonResponse($action->act($array[0], $array[1]));
     }
 }
diff --git a/src/Requests/DiffDaysRequest.php b/src/Requests/DiffDaysRequest.php
new file mode 100644
index 0000000..95295fd
--- /dev/null
+++ b/src/Requests/DiffDaysRequest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Requests;
+
+use DateTimeImmutable;
+use Symfony\Component\Validator\Constraints\Date;
+use Symfony\Component\Validator\Constraints\NotBlank;
+
+class DiffDaysRequest extends BaseRequest
+{
+    #[Date]
+    #[NotBlank]
+    public $startDate;
+
+    #[Date]
+    #[NotBlank]
+    public $endDate;
+
+    /**
+     * @return mixed
+     */
+    public function serialise(): mixed
+    {
+        return [
+            'startDate' => new DateTimeImmutable($this->startDate),
+            'endDate' => new DateTimeImmutable($this->endDate),
+        ];
+    }
+}
\ No newline at end of file
-- 
GitLab