Skip to content

Commit be65b40

Browse files
authored
feat: add steps (#379)
* feat: add steps * feat: add steps * feat: delete steps * feat: delete steps on cascade
1 parent c4d2f25 commit be65b40

36 files changed

+703
-30
lines changed

etc/databases/mooc.sql

+64-30
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,35 @@
44

55
-- Generic tables
66

7-
CREATE TABLE `mutations` (
8-
`id` BIGINT AUTO_INCREMENT PRIMARY KEY,
9-
`table_name` VARCHAR(255) NOT NULL,
10-
`operation` ENUM ('INSERT', 'UPDATE', 'DELETE') NOT NULL,
11-
`old_value` JSON NULL,
12-
`new_value` JSON NULL,
13-
`mutation_timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
7+
CREATE TABLE mutations (
8+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
9+
table_name VARCHAR(255) NOT NULL,
10+
operation ENUM ('INSERT', 'UPDATE', 'DELETE') NOT NULL,
11+
old_value JSON NULL,
12+
new_value JSON NULL,
13+
mutation_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1414
) ENGINE = InnoDB
1515
DEFAULT CHARSET = utf8mb4
1616
COLLATE = utf8mb4_unicode_ci;
1717

18-
CREATE TABLE `domain_events` (
19-
`id` CHAR(36) NOT NULL,
20-
`aggregate_id` CHAR(36) NOT NULL,
21-
`name` VARCHAR(255) NOT NULL,
22-
`body` JSON NOT NULL,
23-
`occurred_on` TIMESTAMP NOT NULL,
24-
PRIMARY KEY (`id`)
18+
CREATE TABLE domain_events (
19+
id CHAR(36) NOT NULL,
20+
aggregate_id CHAR(36) NOT NULL,
21+
name VARCHAR(255) NOT NULL,
22+
body JSON NOT NULL,
23+
occurred_on TIMESTAMP NOT NULL,
24+
PRIMARY KEY (id)
2525
) ENGINE = InnoDB
2626
DEFAULT CHARSET = utf8mb4
2727
COLLATE = utf8mb4_unicode_ci;
2828

2929
-- Aggregates tables
3030

31-
CREATE TABLE `courses` (
32-
`id` CHAR(36) NOT NULL,
33-
`name` VARCHAR(255) NOT NULL,
34-
`duration` VARCHAR(255) NOT NULL,
35-
PRIMARY KEY (`id`)
31+
CREATE TABLE courses (
32+
id CHAR(36) NOT NULL,
33+
name VARCHAR(255) NOT NULL,
34+
duration VARCHAR(255) NOT NULL,
35+
PRIMARY KEY (id)
3636
) ENGINE = InnoDB
3737
DEFAULT CHARSET = utf8mb4
3838
COLLATE = utf8mb4_unicode_ci;
@@ -68,28 +68,62 @@ BEGIN
6868
VALUES ('courses', 'DELETE', JSON_OBJECT('id', old.id, 'name', old.name, 'duration', old.duration), NOW());
6969
END;
7070

71-
CREATE TABLE `courses_counter` (
72-
`id` CHAR(36) NOT NULL,
73-
`total` INT NOT NULL,
74-
`existing_courses` JSON NOT NULL,
75-
PRIMARY KEY (`id`)
71+
CREATE TABLE courses_counter (
72+
id CHAR(36) NOT NULL,
73+
total INT NOT NULL,
74+
existing_courses JSON NOT NULL,
75+
PRIMARY KEY (id)
7676
) ENGINE = InnoDB
7777
DEFAULT CHARSET = utf8mb4
7878
COLLATE = utf8mb4_unicode_ci;
7979

80-
INSERT INTO `courses_counter`
80+
INSERT INTO courses_counter (id, total, existing_courses)
8181
VALUES ("cdf26d7d-3deb-4e8c-9f73-4ac085a8d6f3", 0, "[]");
8282

83+
CREATE TABLE steps (
84+
id CHAR(36) NOT NULL,
85+
title VARCHAR(255) NOT NULL,
86+
duration INT NOT NULL,
87+
type VARCHAR(255) NOT NULL,
88+
PRIMARY KEY (id)
89+
) ENGINE = InnoDB
90+
DEFAULT CHARSET = utf8mb4
91+
COLLATE = utf8mb4_unicode_ci;
92+
93+
CREATE TABLE steps_video (
94+
id CHAR(36) NOT NULL,
95+
url VARCHAR(255) NOT NULL,
96+
FOREIGN KEY (id) REFERENCES steps(id) ON DELETE CASCADE
97+
) ENGINE = InnoDB
98+
DEFAULT CHARSET = utf8mb4
99+
COLLATE = utf8mb4_unicode_ci;
100+
101+
CREATE TABLE steps_exercise (
102+
id CHAR(36) NOT NULL,
103+
content VARCHAR(255) NOT NULL,
104+
FOREIGN KEY (id) REFERENCES steps(id) ON DELETE CASCADE
105+
) ENGINE = InnoDB
106+
DEFAULT CHARSET = utf8mb4
107+
COLLATE = utf8mb4_unicode_ci;
108+
109+
CREATE TABLE steps_quiz (
110+
id CHAR(36) NOT NULL,
111+
questions TEXT NOT NULL,
112+
FOREIGN KEY (id) REFERENCES steps(id) ON DELETE CASCADE
113+
) ENGINE = InnoDB
114+
DEFAULT CHARSET = utf8mb4
115+
COLLATE = utf8mb4_unicode_ci;
116+
83117

84118
/* -------------------------
85119
BACKOFFICE CONTEXT
86120
---------------------------- */
87121

88-
CREATE TABLE `backoffice_courses` (
89-
`id` CHAR(36) NOT NULL,
90-
`name` VARCHAR(255) NOT NULL,
91-
`duration` VARCHAR(255) NOT NULL,
92-
PRIMARY KEY (`id`)
122+
CREATE TABLE backoffice_courses (
123+
id CHAR(36) NOT NULL,
124+
name VARCHAR(255) NOT NULL,
125+
duration VARCHAR(255) NOT NULL,
126+
PRIMARY KEY (id)
93127
) ENGINE = InnoDB
94128
DEFAULT CHARSET = utf8mb4
95129
COLLATE = utf8mb4_unicode_ci;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Application\Create;
6+
7+
use CodelyTv\Shared\Domain\Bus\Command\CommandHandler;
8+
9+
final readonly class CreateVideoStepCommandHandler implements CommandHandler
10+
{
11+
public function __construct(private VideoStepCreator $creator) {}
12+
13+
public function __invoke(): void {}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Application\Create;
6+
7+
use CodelyTv\Mooc\Steps\Domain\StepRepository;
8+
9+
final readonly class VideoStepCreator
10+
{
11+
public function __construct(private StepRepository $repository) {}
12+
13+
public function __invoke(): void {}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain\Exercise;
6+
7+
use CodelyTv\Mooc\Steps\Domain\Step;
8+
use CodelyTv\Mooc\Steps\Domain\StepDuration;
9+
use CodelyTv\Mooc\Steps\Domain\StepId;
10+
use CodelyTv\Mooc\Steps\Domain\StepTitle;
11+
12+
final class ExerciseStep extends Step
13+
{
14+
public function __construct(
15+
StepId $id,
16+
StepTitle $title,
17+
StepDuration $duration,
18+
private readonly ExerciseStepContent $content
19+
) {
20+
parent::__construct($id, $title, $duration);
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain\Exercise;
6+
7+
use CodelyTv\Shared\Domain\ValueObject\StringValueObject;
8+
9+
final class ExerciseStepContent extends StringValueObject {}
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain\Quiz;
6+
7+
use CodelyTv\Mooc\Steps\Domain\Step;
8+
use CodelyTv\Mooc\Steps\Domain\StepDuration;
9+
use CodelyTv\Mooc\Steps\Domain\StepId;
10+
use CodelyTv\Mooc\Steps\Domain\StepTitle;
11+
12+
final class QuizStep extends Step
13+
{
14+
/** @var QuizStepQuestion[] */
15+
private array $questions;
16+
17+
public function __construct(
18+
StepId $id,
19+
StepTitle $title,
20+
StepDuration $duration,
21+
QuizStepQuestion ...$questions
22+
) {
23+
parent::__construct($id, $title, $duration);
24+
25+
$this->questions = $questions;
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain\Quiz;
6+
7+
final readonly class QuizStepQuestion
8+
{
9+
public function __construct(private string $question, private array $answers) {}
10+
11+
public static function fromString(string $value): self
12+
{
13+
[$question, $answers] = explode('----', $value);
14+
15+
return new self($question, explode('****', $answers));
16+
}
17+
18+
public function toString(): string
19+
{
20+
return $this->question . '----' . implode('****', $this->answers);
21+
}
22+
}

src/Mooc/Steps/Domain/Step.php

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain;
6+
7+
use CodelyTv\Shared\Domain\Aggregate\AggregateRoot;
8+
9+
abstract class Step extends AggregateRoot
10+
{
11+
public function __construct(
12+
public readonly StepId $id,
13+
private readonly StepTitle $title,
14+
private readonly StepDuration $duration
15+
) {}
16+
}
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain;
6+
7+
use CodelyTv\Shared\Domain\ValueObject\IntValueObject;
8+
9+
final class StepDuration extends IntValueObject {}

src/Mooc/Steps/Domain/StepId.php

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain;
6+
7+
use CodelyTv\Shared\Domain\ValueObject\Uuid;
8+
9+
final class StepId extends Uuid {}
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain;
6+
7+
interface StepRepository
8+
{
9+
public function save(Step $step): void;
10+
11+
public function search(StepId $id): ?Step;
12+
13+
public function delete(Step $step): void;
14+
}

src/Mooc/Steps/Domain/StepTitle.php

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain;
6+
7+
use CodelyTv\Shared\Domain\ValueObject\StringValueObject;
8+
9+
final class StepTitle extends StringValueObject {}
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain\Video;
6+
7+
use CodelyTv\Mooc\Steps\Domain\Step;
8+
use CodelyTv\Mooc\Steps\Domain\StepDuration;
9+
use CodelyTv\Mooc\Steps\Domain\StepId;
10+
use CodelyTv\Mooc\Steps\Domain\StepTitle;
11+
12+
final class VideoStep extends Step
13+
{
14+
public function __construct(
15+
StepId $id,
16+
StepTitle $title,
17+
StepDuration $duration,
18+
private readonly VideoStepUrl $url
19+
) {
20+
parent::__construct($id, $title, $duration);
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodelyTv\Mooc\Steps\Domain\Video;
6+
7+
use CodelyTv\Shared\Domain\ValueObject\StringValueObject;
8+
9+
final class VideoStepUrl extends StringValueObject {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<doctrine-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
4+
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
5+
https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
6+
7+
<entity name="CodelyTv\Mooc\Steps\Domain\Exercise\ExerciseStep" table="steps_exercise">
8+
<embedded name="content" class="CodelyTv\Mooc\Steps\Domain\Exercise\ExerciseStepContent" use-column-prefix="false" />
9+
</entity>
10+
</doctrine-mapping>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<doctrine-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
4+
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
5+
https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
6+
7+
<embeddable name="CodelyTv\Mooc\Steps\Domain\Exercise\ExerciseStepContent">
8+
<field name="value" type="string" column="content" />
9+
</embeddable>
10+
</doctrine-mapping>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<doctrine-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
4+
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
5+
https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
6+
7+
<entity name="CodelyTv\Mooc\Steps\Domain\Quiz\QuizStep" table="steps_quiz">
8+
<field name="questions" type="quiz_step_questions" column="questions" />
9+
</entity>
10+
</doctrine-mapping>

0 commit comments

Comments
 (0)