Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Find all courses #249

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 7 additions & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,25 @@ services:

mooc_mysql:
container_name: codelytv-php_ddd_skeleton-mooc-mysql
image: mysql:8.0
image: mysql/mysql-server:8.0.23
ports:
- 3360:3306
environment:
- MYSQL_ROOT_PASSWORD=
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_ROOT_HOST=%
healthcheck:
test: ["CMD", "mysqladmin", "--user=root", "--password=", "--host=127.0.0.1", "ping", "--silent"]
interval: 2s
timeout: 10s
retries: 10
command: ["--default-authentication-plugin=mysql_native_password"]
command: ["--lower_case_table_names=1"]



backoffice_elasticsearch:
container_name: codelytv-php_ddd_skeleton-backoffice-elastic
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.10
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
ports:
- 9200:9200
- 9300:9300
Expand Down Expand Up @@ -101,4 +104,4 @@ services:
- shared_rabbitmq
- shared_prometheus
- mooc_mysql
command: symfony serve --dir=apps/mooc/backend/public --port=8030 --force-php-discovery
command: symfony serve --dir=apps/mooc/backend/public --port=8030 --force-php-discovery
26 changes: 26 additions & 0 deletions src/Mooc/Courses/Application/Find/AllCoursesFinder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Mooc\Courses\Application\Find;

use CodelyTv\Mooc\Courses\Domain\CourseRepository;
use CodelyTv\Mooc\Courses\Domain\CoursesNotFound;

final class AllCoursesFinder
{
public function __construct(private CourseRepository $repository)
{
}

public function __invoke(): array
{
$courses = $this->repository->findAll();

if (null === $courses) {
throw new CoursesNotFound();
}

return $courses;
}
}
25 changes: 25 additions & 0 deletions src/Mooc/Courses/Application/Find/CoursesResponse.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);


namespace CodelyTv\Mooc\Courses\Application\Find;


use CodelyTv\Shared\Domain\Bus\Query\Response;

final class CoursesResponse implements Response
{
public function __construct(
private array $course
)
{
}

public function getCourse(): array
{
return $this->course;
}


}
12 changes: 12 additions & 0 deletions src/Mooc/Courses/Application/Find/FindAllCoursesQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);


namespace CodelyTv\Mooc\Courses\Application\Find;


final class FindAllCoursesQuery
{

}
19 changes: 19 additions & 0 deletions src/Mooc/Courses/Application/Find/FindAllCoursesQueryHandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);


namespace CodelyTv\Mooc\Courses\Application\Find;


final class FindAllCoursesQueryHandler
{

public function __construct(private AllCoursesFinder $finder)
{
}

public function __invoke(FindAllCoursesQuery $query): CoursesResponse {
return new CoursesResponse($this->finder->__invoke());
}
}
2 changes: 2 additions & 0 deletions src/Mooc/Courses/Domain/CourseRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ interface CourseRepository
public function save(Course $course): void;

public function search(CourseId $id): ?Course;

public function findAll(): ?array;
}
25 changes: 25 additions & 0 deletions src/Mooc/Courses/Domain/CoursesNotFound.php
Original file line number Diff line number Diff line change
@@ -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 'There is not any course';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,9 @@ public function search(CourseId $id): ?Course
{
return $this->repository(Course::class)->find($id);
}

public function findAll(): ?array
{
return $this->repository(Course::class)->findAll();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,9 @@ private function fileName(string $id): string
{
return sprintf('%s.%s.repo', self::FILE_PATH, $id);
}

public function findAll(): ?array
{
return $this->findAll();
}
}
28 changes: 28 additions & 0 deletions src/Mooc/Videos/Application/Update/UpdateVideoTitleCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?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 getId(): string
{
return $this->id;
}

public function getTitle(): string
{
return $this->title;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Mooc\Videos\Application\Update;


use CodelyTv\Mooc\Videos\Domain\VideoId;
use CodelyTv\Mooc\Videos\Domain\VideoTitle;

final class UpdateVideoTitleCommandHandler
{

public function __construct(private VideoTitleUpdater $titleUpdater)
{
}

public function __invoke(UpdateVideoTitleCommand $command)
{
$id = new VideoId($command->getId());
$title = new VideoTitle($command->getTitle());

$this->titleUpdater->__invoke($id, $title);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@ public function it_should_create_a_valid_course(): void

$this->dispatch($command, $this->handler);
}
}
}
47 changes: 47 additions & 0 deletions tests/Mooc/Courses/Application/Find/CourseFinderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Tests\Mooc\Courses\Application\Find;


use CodelyTv\Mooc\Courses\Application\Find\CourseFinder;
use CodelyTv\Mooc\Courses\Domain\CourseNotExist;
use CodelyTv\Tests\Mooc\Courses\CoursesModuleUnitTestCase;
use CodelyTv\Tests\Mooc\Courses\Domain\CourseIdMother;
use CodelyTv\Tests\Mooc\Courses\Domain\CourseMother;

class CourseFinderTest extends CoursesModuleUnitTestCase
{
private CourseFinder|null $finder;

protected function setUp(): void
{
parent::setUp();
$this->finder = new CourseFinder($this->repository());
}

/** @test */
public function it_should_throw_an_exception_when_the_course_not_exist(): void
{
$this->expectException(CourseNotExist::class);

$id = CourseIdMother::create();

$this->shouldSearch($id, null);

$this->finder->__invoke($id);
}

/** @test */
public function it_should_find_an_existing_courses(): void
{
$course = CourseMother::create();

$this->shouldSearch($course->id(), $course);

$courseFromRepository = $this->finder->__invoke($course->id());

$this->assertEquals($courseFromRepository, $course);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Tests\Mooc\Courses\Application\Find;


use CodelyTv\Mooc\Courses\Application\Find\AllCoursesFinder;
use CodelyTv\Mooc\Courses\Application\Find\FindAllCoursesQuery;
use CodelyTv\Mooc\Courses\Application\Find\FindAllCoursesQueryHandler;
use CodelyTv\Tests\Mooc\Courses\CoursesModuleUnitTestCase;
use CodelyTv\Tests\Mooc\Courses\Domain\CourseMother;
use CodelyTv\Tests\Mooc\Courses\Domain\CoursesResponseMother;

class FindAllCoursesQueryHandlerTest extends CoursesModuleUnitTestCase
{
private FindAllCoursesQueryHandler|null $handler;

protected function setUp(): void
{
parent::setUp();

$this->handler = new FindAllCoursesQueryHandler(new AllCoursesFinder($this->repository()));
}


/** @test */
public function it_should_find_all_existing_courses(): void
{
$courses = [
CourseMother::create(),
CourseMother::create()
];

$this->shouldFindAll($courses);
$coursesResponse = CoursesResponseMother::create($courses);
$courseFromRepository = $this->handler->__invoke(new FindAllCoursesQuery());

$this->assertEquals($courseFromRepository, $coursesResponse);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,4 @@ public function it_should_throw_an_exception_when_the_course_not_exist(): void

$this->renamer->__invoke($id, CourseNameMother::create());
}
}
}
8 changes: 8 additions & 0 deletions tests/Mooc/Courses/CoursesModuleUnitTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ protected function shouldSearch(CourseId $id, ?Course $course): void
->andReturn($course);
}

protected function shouldFindAll(?array $courses): void
{
$this->repository()
->shouldReceive('findAll')
->once()
->andReturn($courses);
}

protected function repository(): CourseRepository|MockInterface
{
return $this->repository = $this->repository ?? $this->mock(CourseRepository::class);
Expand Down
16 changes: 16 additions & 0 deletions tests/Mooc/Courses/Domain/CoursesResponseMother.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Tests\Mooc\Courses\Domain;

use CodelyTv\Mooc\Courses\Application\Find\CoursesResponse;

final class CoursesResponseMother
{
public static function create(array $courses): CoursesResponse
{
return new CoursesResponse($courses);
}

}