feat: add domain enums (ArticleStatus with transitions, ArticleCondition, AttributeType, OrderStatus, AIPipelineJob enums)

This commit is contained in:
Simon Kuehn 2026-05-14 04:26:50 +00:00
parent f4eb39b52a
commit 6e8a2e070f
7 changed files with 129 additions and 0 deletions

View 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';
}

View 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);
}
}

View 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';
}

View 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';
}

View 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';
}

View 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';
}

View 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));
}
}