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 +}