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