From a1a4cd884caed47887d4ab3312244e0bea4e3e44 Mon Sep 17 00:00:00 2001
From: Javier Urbano <jurbano@zafirus.tech>
Date: Sat, 28 May 2022 15:19:43 -0400
Subject: [PATCH 1/3] create VideoTitleUpdate Command

---
 .../Update/UpdateVideoTitleCommand.php        | 22 +++++++++++++++++++
 .../Update/UpdateVideoTitleCommandHandler.php | 21 ++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php
 create mode 100644 src/Mooc/Videos/Application/Update/UpdateVideoTitleCommandHandler.php

diff --git a/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php b/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php
new file mode 100644
index 00000000..a6d431f7
--- /dev/null
+++ b/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Videos\Application\Update;
+
+use CodelyTv\Shared\Domain\Bus\Command\Command;
+
+final class UpdateVideoTitleCommand implements Command
+{
+    public function __construct(private string $id, private string $title) { }
+
+    public function id(): string
+    {
+        return $this->id;
+    }
+
+    public function title(): string
+    {
+        return $this->title;
+    }
+}
\ No newline at end of file
diff --git a/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommandHandler.php b/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommandHandler.php
new file mode 100644
index 00000000..babc6431
--- /dev/null
+++ b/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommandHandler.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Videos\Application\Update;
+
+use CodelyTv\Mooc\Videos\Domain\VideoId;
+use CodelyTv\Mooc\Videos\Domain\VideoTitle;
+use CodelyTv\Shared\Domain\Bus\Command\CommandHandler;
+
+final class UpdateVideoTitleCommandHandler implements CommandHandler
+{
+    public function __construct(private VideoTitleUpdater $updater) { }
+
+    public function __invoke(UpdateVideoTitleCommand $command) {
+        $id       = new VideoId($command->id());
+        $title    = new VideoTitle($command->title());
+
+        $this->updater->__invoke($id, $title);
+    }
+}
\ No newline at end of file

From 6272a4573889f0f7818212832170149cb52f7deb Mon Sep 17 00:00:00 2001
From: Javier Urbano <jurbano@zafirus.tech>
Date: Mon, 21 Nov 2022 06:03:02 -0400
Subject: [PATCH 2/3] add CoursesQuery

---
 .../Courses/CoursesPostWebController.php      |  4 +--
 .../Application/Find/CoursesFinder.php        | 24 +++++++++++++++
 .../Application/Find/CoursesResponse.php      | 26 +++++++++++++++++
 .../Find/CoursesResponseConverter.php         | 17 +++++++++++
 .../Application/Find/FindCoursesQuery.php     | 12 ++++++++
 .../Find/FindCoursesQueryHandler.php          | 29 +++++++++++++++++++
 src/Mooc/Courses/Domain/CourseRepository.php  |  2 ++
 src/Mooc/Courses/Domain/CoursesFinder.php     | 24 +++++++++++++++
 src/Mooc/Courses/Domain/CoursesNotFound.php   | 25 ++++++++++++++++
 .../Persistence/DoctrineCourseRepository.php  |  5 ++++
 .../Persistence/FileCourseRepository.php      |  6 ++++
 11 files changed, 172 insertions(+), 2 deletions(-)
 create mode 100644 src/Mooc/Courses/Application/Find/CoursesFinder.php
 create mode 100644 src/Mooc/Courses/Application/Find/CoursesResponse.php
 create mode 100644 src/Mooc/Courses/Application/Find/CoursesResponseConverter.php
 create mode 100644 src/Mooc/Courses/Application/Find/FindCoursesQuery.php
 create mode 100644 src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php
 create mode 100644 src/Mooc/Courses/Domain/CoursesFinder.php
 create mode 100644 src/Mooc/Courses/Domain/CoursesNotFound.php

diff --git a/apps/backoffice/frontend/src/Controller/Courses/CoursesPostWebController.php b/apps/backoffice/frontend/src/Controller/Courses/CoursesPostWebController.php
index d77b9633..d4c5a37b 100644
--- a/apps/backoffice/frontend/src/Controller/Courses/CoursesPostWebController.php
+++ b/apps/backoffice/frontend/src/Controller/Courses/CoursesPostWebController.php
@@ -47,9 +47,9 @@ private function createCourse(Request $request): RedirectResponse
     {
         $this->dispatch(
             new CreateCourseCommand(
-                $request->request->getAlpha('id'),
+                $request->request->get('id'),
                 $request->request->getAlpha('name'),
-                $request->request->getAlpha('duration')
+                $request->request->get('duration')
             )
         );
 
diff --git a/src/Mooc/Courses/Application/Find/CoursesFinder.php b/src/Mooc/Courses/Application/Find/CoursesFinder.php
new file mode 100644
index 00000000..1e8b6a70
--- /dev/null
+++ b/src/Mooc/Courses/Application/Find/CoursesFinder.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Courses\Application\Find;
+
+use CodelyTv\Mooc\Courses\Domain\CourseRepository;
+use CodelyTv\Mooc\Courses\Domain\CoursesFinder as DomainCoursesFinder;
+
+final class CoursesFinder
+{
+    /** @var DomainCoursesFinder */
+    private $finder;
+
+    public function __construct(CourseRepository $repository)
+    {
+        $this->finder = new DomainCoursesFinder($repository);
+    }
+
+    public function __invoke(): array
+    {
+        return $this->finder->__invoke();
+    }
+}
diff --git a/src/Mooc/Courses/Application/Find/CoursesResponse.php b/src/Mooc/Courses/Application/Find/CoursesResponse.php
new file mode 100644
index 00000000..9414a507
--- /dev/null
+++ b/src/Mooc/Courses/Application/Find/CoursesResponse.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Courses\Application\Find;
+
+use CodelyTv\Shared\Domain\Bus\Query\Response;
+
+final class CoursesResponse implements Response
+{
+    /** @var array */
+    private $courses;
+
+    /**
+     * CoursesResponse constructor
+     */
+    public function __construct(array $courses)
+    {
+        $this->courses = $courses;
+    }
+
+    public function courses(): array
+    {
+        return $this->courses;
+    }
+}
\ No newline at end of file
diff --git a/src/Mooc/Courses/Application/Find/CoursesResponseConverter.php b/src/Mooc/Courses/Application/Find/CoursesResponseConverter.php
new file mode 100644
index 00000000..6178f687
--- /dev/null
+++ b/src/Mooc/Courses/Application/Find/CoursesResponseConverter.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Courses\Application\Find;
+
+final class CoursesResponseConverter
+{
+    /**
+     * @param array
+     * @return CoursesResponse
+     */
+    public function __invoke(array $courses): CoursesResponse
+    {
+        return new CoursesResponse($courses);
+    }
+}
\ No newline at end of file
diff --git a/src/Mooc/Courses/Application/Find/FindCoursesQuery.php b/src/Mooc/Courses/Application/Find/FindCoursesQuery.php
new file mode 100644
index 00000000..7bf7ae3a
--- /dev/null
+++ b/src/Mooc/Courses/Application/Find/FindCoursesQuery.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Courses\Application\Find;
+
+use CodelyTv\Shared\Domain\Bus\Query\Query;
+
+final class FindCoursesQuery implements Query
+{
+    
+}
\ No newline at end of file
diff --git a/src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php b/src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php
new file mode 100644
index 00000000..394b269c
--- /dev/null
+++ b/src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php
@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Courses\Application\Find;
+
+use CodelyTv\Shared\Domain\Bus\Query\QueryHandler;
+use function Lambdish\Phunctional\apply;
+use function Lambdish\Phunctional\pipe;
+
+final class FindCoursesQueryHandler implements QueryHandler
+{
+
+    /** @var callable */
+    private $finder;
+
+    /**
+     * @param CoursesFinder $finder
+     */
+    public function __construct(CoursesFinder $finder)
+    {
+        $this->finder = pipe($finder, new CoursesResponseConverter());
+    }
+
+    public function __invoke(FindCoursesQuery $query): CoursesResponse
+    {
+        return apply($this->finder);
+    }
+}
\ No newline at end of file
diff --git a/src/Mooc/Courses/Domain/CourseRepository.php b/src/Mooc/Courses/Domain/CourseRepository.php
index bf12fad1..b1381909 100644
--- a/src/Mooc/Courses/Domain/CourseRepository.php
+++ b/src/Mooc/Courses/Domain/CourseRepository.php
@@ -11,4 +11,6 @@ interface CourseRepository
     public function save(Course $course): void;
 
     public function search(CourseId $id): ?Course;
+
+    public function all(): ?array;
 }
diff --git a/src/Mooc/Courses/Domain/CoursesFinder.php b/src/Mooc/Courses/Domain/CoursesFinder.php
new file mode 100644
index 00000000..50bf66f8
--- /dev/null
+++ b/src/Mooc/Courses/Domain/CoursesFinder.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Courses\Domain;
+
+final class CoursesFinder
+{
+    public function __construct(private CourseRepository $repository)
+    {
+    }
+
+    public function __invoke(): array
+    {
+        /** @var array */
+        $courses = $this->repository->all();
+
+        if (null === $courses) {
+            throw new CoursesNotFound();
+        }
+
+        return $courses;
+    }
+}
\ No newline at end of file
diff --git a/src/Mooc/Courses/Domain/CoursesNotFound.php b/src/Mooc/Courses/Domain/CoursesNotFound.php
new file mode 100644
index 00000000..990b9a0b
--- /dev/null
+++ b/src/Mooc/Courses/Domain/CoursesNotFound.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+
+namespace CodelyTv\Mooc\Courses\Domain;
+
+use CodelyTv\Shared\Domain\DomainError;
+
+final class CoursesNotFound extends DomainError
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function errorCode(): string
+    {
+        return 'courses_not_found';
+    }
+
+    protected function errorMessage(): string
+    {
+        return sprintf('Oops! Courses not found.');
+    }
+}
diff --git a/src/Mooc/Courses/Infrastructure/Persistence/DoctrineCourseRepository.php b/src/Mooc/Courses/Infrastructure/Persistence/DoctrineCourseRepository.php
index b17007d9..ac7a6b46 100644
--- a/src/Mooc/Courses/Infrastructure/Persistence/DoctrineCourseRepository.php
+++ b/src/Mooc/Courses/Infrastructure/Persistence/DoctrineCourseRepository.php
@@ -20,4 +20,9 @@ public function search(CourseId $id): ?Course
     {
         return $this->repository(Course::class)->find($id);
     }
+
+    public function all(): ?array
+    {
+        return $this->repository(Course::class)->findAll();
+    }
 }
diff --git a/src/Mooc/Courses/Infrastructure/Persistence/FileCourseRepository.php b/src/Mooc/Courses/Infrastructure/Persistence/FileCourseRepository.php
index 05124081..3924c210 100644
--- a/src/Mooc/Courses/Infrastructure/Persistence/FileCourseRepository.php
+++ b/src/Mooc/Courses/Infrastructure/Persistence/FileCourseRepository.php
@@ -24,6 +24,12 @@ public function search(CourseId $id): ?Course
             : null;
     }
 
+    public function all(): ?array
+    {
+        // TODO
+        return [];
+    }
+
     private function fileName(string $id): string
     {
         return sprintf('%s.%s.repo', self::FILE_PATH, $id);

From fb0d5155a55771679a6b1c78232fe33d542a4647 Mon Sep 17 00:00:00 2001
From: Javier Urbano <jurbano@zafirus.tech>
Date: Mon, 21 Nov 2022 06:19:28 -0400
Subject: [PATCH 3/3] fix endfile. add blank line

---
 src/Mooc/Courses/Application/Find/CoursesResponse.php           | 2 +-
 src/Mooc/Courses/Application/Find/CoursesResponseConverter.php  | 2 +-
 src/Mooc/Courses/Application/Find/FindCoursesQuery.php          | 2 +-
 src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php   | 2 +-
 src/Mooc/Courses/Domain/CoursesFinder.php                       | 2 +-
 src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php  | 2 +-
 .../Application/Update/UpdateVideoTitleCommandHandler.php       | 2 +-
 7 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/Mooc/Courses/Application/Find/CoursesResponse.php b/src/Mooc/Courses/Application/Find/CoursesResponse.php
index 9414a507..8c90d529 100644
--- a/src/Mooc/Courses/Application/Find/CoursesResponse.php
+++ b/src/Mooc/Courses/Application/Find/CoursesResponse.php
@@ -23,4 +23,4 @@ public function courses(): array
     {
         return $this->courses;
     }
-}
\ No newline at end of file
+}
diff --git a/src/Mooc/Courses/Application/Find/CoursesResponseConverter.php b/src/Mooc/Courses/Application/Find/CoursesResponseConverter.php
index 6178f687..723aab7a 100644
--- a/src/Mooc/Courses/Application/Find/CoursesResponseConverter.php
+++ b/src/Mooc/Courses/Application/Find/CoursesResponseConverter.php
@@ -14,4 +14,4 @@ public function __invoke(array $courses): CoursesResponse
     {
         return new CoursesResponse($courses);
     }
-}
\ No newline at end of file
+}
diff --git a/src/Mooc/Courses/Application/Find/FindCoursesQuery.php b/src/Mooc/Courses/Application/Find/FindCoursesQuery.php
index 7bf7ae3a..1b7a56c5 100644
--- a/src/Mooc/Courses/Application/Find/FindCoursesQuery.php
+++ b/src/Mooc/Courses/Application/Find/FindCoursesQuery.php
@@ -9,4 +9,4 @@
 final class FindCoursesQuery implements Query
 {
     
-}
\ No newline at end of file
+}
diff --git a/src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php b/src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php
index 394b269c..4dbaecb0 100644
--- a/src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php
+++ b/src/Mooc/Courses/Application/Find/FindCoursesQueryHandler.php
@@ -26,4 +26,4 @@ public function __invoke(FindCoursesQuery $query): CoursesResponse
     {
         return apply($this->finder);
     }
-}
\ No newline at end of file
+}
diff --git a/src/Mooc/Courses/Domain/CoursesFinder.php b/src/Mooc/Courses/Domain/CoursesFinder.php
index 50bf66f8..464de2c3 100644
--- a/src/Mooc/Courses/Domain/CoursesFinder.php
+++ b/src/Mooc/Courses/Domain/CoursesFinder.php
@@ -21,4 +21,4 @@ public function __invoke(): array
 
         return $courses;
     }
-}
\ No newline at end of file
+}
diff --git a/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php b/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php
index a6d431f7..9787bf2d 100644
--- a/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php
+++ b/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php
@@ -19,4 +19,4 @@ public function title(): string
     {
         return $this->title;
     }
-}
\ No newline at end of file
+}
diff --git a/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommandHandler.php b/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommandHandler.php
index babc6431..2b5e6415 100644
--- a/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommandHandler.php
+++ b/src/Mooc/Videos/Application/Update/UpdateVideoTitleCommandHandler.php
@@ -18,4 +18,4 @@ public function __invoke(UpdateVideoTitleCommand $command) {
 
         $this->updater->__invoke($id, $title);
     }
-}
\ No newline at end of file
+}