feat: add domain enums (ArticleStatus with transitions, ArticleCondition, AttributeType, OrderStatus, AIPipelineJob enums)
This commit is contained in:
parent
f4eb39b52a
commit
6e8a2e070f
7 changed files with 129 additions and 0 deletions
13
src/Domain/Article/ArticleCondition.php
Normal file
13
src/Domain/Article/ArticleCondition.php
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Domain\Article;
|
||||
|
||||
enum ArticleCondition: string
|
||||
{
|
||||
case New = 'new';
|
||||
case LikeNew = 'like_new';
|
||||
case Good = 'good';
|
||||
case Acceptable = 'acceptable';
|
||||
}
|
||||
33
src/Domain/Article/ArticleStatus.php
Normal file
33
src/Domain/Article/ArticleStatus.php
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Domain\Article;
|
||||
|
||||
enum ArticleStatus: string
|
||||
{
|
||||
case Ingesting = 'ingesting';
|
||||
case Draft = 'draft';
|
||||
case NeedsReview = 'needs_review';
|
||||
case Active = 'active';
|
||||
case Listed = 'listed';
|
||||
case Sold = 'sold';
|
||||
|
||||
/** @return list<self> */
|
||||
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);
|
||||
}
|
||||
}
|
||||
15
src/Domain/Article/AttributeType.php
Normal file
15
src/Domain/Article/AttributeType.php
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Domain\Article;
|
||||
|
||||
enum AttributeType: string
|
||||
{
|
||||
case String = 'string';
|
||||
case Int = 'int';
|
||||
case Float = 'float';
|
||||
case Bool = 'bool';
|
||||
case Select = 'select';
|
||||
case MultiSelect = 'multi_select';
|
||||
}
|
||||
14
src/Domain/Order/OrderStatus.php
Normal file
14
src/Domain/Order/OrderStatus.php
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Domain\Order;
|
||||
|
||||
enum OrderStatus: string
|
||||
{
|
||||
case Pending = 'pending';
|
||||
case Processing = 'processing';
|
||||
case Shipped = 'shipped';
|
||||
case Completed = 'completed';
|
||||
case Failed = 'failed';
|
||||
}
|
||||
14
src/Domain/Pipeline/AIPipelineJobStatus.php
Normal file
14
src/Domain/Pipeline/AIPipelineJobStatus.php
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Domain\Pipeline;
|
||||
|
||||
enum AIPipelineJobStatus: string
|
||||
{
|
||||
case Queued = 'queued';
|
||||
case Processing = 'processing';
|
||||
case Completed = 'completed';
|
||||
case Failed = 'failed';
|
||||
case NeedsReview = 'needs_review';
|
||||
}
|
||||
12
src/Domain/Pipeline/AIPipelineJobType.php
Normal file
12
src/Domain/Pipeline/AIPipelineJobType.php
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Domain\Pipeline;
|
||||
|
||||
enum AIPipelineJobType: string
|
||||
{
|
||||
case Photo = 'photo';
|
||||
case Pxe = 'pxe';
|
||||
case TextGeneration = 'text_gen';
|
||||
}
|
||||
28
tests/Unit/Domain/Article/ArticleStatusTest.php
Normal file
28
tests/Unit/Domain/Article/ArticleStatusTest.php
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Unit\Domain\Article;
|
||||
|
||||
use App\Domain\Article\ArticleStatus;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class ArticleStatusTest extends TestCase
|
||||
{
|
||||
public function test_valid_transitions(): void
|
||||
{
|
||||
$this->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));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue