diff --git a/src/Domain/Article/ArticleCondition.php b/src/Domain/Article/ArticleCondition.php new file mode 100644 index 0000000..028d53f --- /dev/null +++ b/src/Domain/Article/ArticleCondition.php @@ -0,0 +1,13 @@ + */ + public function allowedTransitions(): array + { + return match ($this) { + self::Ingesting => [self::Draft, self::NeedsReview], + self::Draft => [self::Active, self::NeedsReview], + self::NeedsReview => [self::Draft], + self::Active => [self::Listed, self::Draft], + self::Listed => [self::Sold, self::Active], + self::Sold => [], + }; + } + + public function canTransitionTo(self $next): bool + { + return \in_array($next, $this->allowedTransitions(), strict: true); + } +} diff --git a/src/Domain/Article/AttributeType.php b/src/Domain/Article/AttributeType.php new file mode 100644 index 0000000..f812bfe --- /dev/null +++ b/src/Domain/Article/AttributeType.php @@ -0,0 +1,15 @@ +assertTrue(ArticleStatus::Ingesting->canTransitionTo(ArticleStatus::Draft)); + $this->assertTrue(ArticleStatus::Draft->canTransitionTo(ArticleStatus::Active)); + $this->assertTrue(ArticleStatus::Draft->canTransitionTo(ArticleStatus::NeedsReview)); + $this->assertTrue(ArticleStatus::NeedsReview->canTransitionTo(ArticleStatus::Draft)); + $this->assertTrue(ArticleStatus::Active->canTransitionTo(ArticleStatus::Listed)); + $this->assertTrue(ArticleStatus::Listed->canTransitionTo(ArticleStatus::Sold)); + } + + public function test_invalid_transitions(): void + { + $this->assertFalse(ArticleStatus::Sold->canTransitionTo(ArticleStatus::Draft)); + $this->assertFalse(ArticleStatus::Ingesting->canTransitionTo(ArticleStatus::Sold)); + $this->assertFalse(ArticleStatus::Listed->canTransitionTo(ArticleStatus::Ingesting)); + } +}