Skip to content

Commit b45dc85

Browse files
committed
feat: refactor CategoryStatus to extend CommonStatus and remove redundant code
1 parent 5f4ed75 commit b45dc85

File tree

4 files changed

+90
-95
lines changed

4 files changed

+90
-95
lines changed

contexts/CategoryManagement/Domain/Models/CategoryStatus.php

Lines changed: 2 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4,68 +4,6 @@
44

55
namespace Contexts\CategoryManagement\Domain\Models;
66

7-
use App\Exceptions\BizException;
7+
use Contexts\Shared\ValueObjects\CommonStatus;
88

9-
class CategoryStatus
10-
{
11-
public const SUBSPENDED = 'subspended';
12-
13-
public const ACTIVE = 'active';
14-
15-
public const DELETED = 'deleted';
16-
17-
public function __construct(private string $value)
18-
{
19-
if (! in_array($value, [self::SUBSPENDED, self::ACTIVE, self::DELETED])) {
20-
throw BizException::make('Invalid status: :status')
21-
->with('status', $value);
22-
}
23-
}
24-
25-
public static function subspended(): self
26-
{
27-
return new self(self::SUBSPENDED);
28-
}
29-
30-
public static function active(): self
31-
{
32-
return new self(self::ACTIVE);
33-
}
34-
35-
public static function deleted(): self
36-
{
37-
return new self(self::DELETED);
38-
}
39-
40-
public function transitionTo(CategoryStatus $target): self
41-
{
42-
$validTransitions = match ($this->value) {
43-
self::SUBSPENDED => [self::ACTIVE, self::DELETED],
44-
self::ACTIVE => [self::SUBSPENDED, self::DELETED],
45-
default => [],
46-
};
47-
48-
if (! in_array($target->value, $validTransitions)) {
49-
throw BizException::make('Cannot transition from :from to :to')
50-
->with('from', $this->value)
51-
->with('to', $target->value);
52-
}
53-
54-
return $target;
55-
}
56-
57-
public static function fromString(string $status): self
58-
{
59-
return new self($status);
60-
}
61-
62-
public function getValue(): string
63-
{
64-
return $this->value;
65-
}
66-
67-
public function equals(self $status): bool
68-
{
69-
return $this->value === $status->value;
70-
}
71-
}
9+
class CategoryStatus extends CommonStatus {}

contexts/CategoryManagement/Tests/Unit/Domain/Models/CategoryIdTest.php

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Contexts\Shared\ValueObjects;
6+
7+
use App\Exceptions\BizException;
8+
9+
abstract class CommonStatus
10+
{
11+
public const SUBSPENDED = 'subspended';
12+
13+
public const ACTIVE = 'active';
14+
15+
public const DELETED = 'deleted';
16+
17+
final public function __construct(private string $value)
18+
{
19+
if (! in_array($value, [static::SUBSPENDED, static::ACTIVE, static::DELETED])) {
20+
throw BizException::make('Invalid status: :status')
21+
->with('status', $value);
22+
}
23+
}
24+
25+
public static function subspended(): static
26+
{
27+
return new static(static::SUBSPENDED);
28+
}
29+
30+
public static function active(): static
31+
{
32+
return new static(static::ACTIVE);
33+
}
34+
35+
public static function deleted(): static
36+
{
37+
return new static(static::DELETED);
38+
}
39+
40+
public function transitionTo(CommonStatus $target): static
41+
{
42+
$validTransitions = match ($this->value) {
43+
static::SUBSPENDED => [static::ACTIVE, static::DELETED],
44+
static::ACTIVE => [static::SUBSPENDED, static::DELETED],
45+
default => [],
46+
};
47+
48+
if (! in_array($target->value, $validTransitions)) {
49+
throw BizException::make('Cannot transition from :from to :to')
50+
->with('from', $this->value)
51+
->with('to', $target->value);
52+
}
53+
54+
return new static($target->value);
55+
}
56+
57+
public static function fromString(string $status): static
58+
{
59+
return new static($status);
60+
}
61+
62+
public function getValue(): string
63+
{
64+
return $this->value;
65+
}
66+
67+
public function equals(CommonStatus $status): bool
68+
{
69+
return $this->value === $status->value;
70+
}
71+
}

contexts/CategoryManagement/Tests/Unit/Domain/Models/CategoryStatusTest.php renamed to tests/Unit/Shared/ValueObjects/CategoryStatusTest.php

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,54 +3,56 @@
33
declare(strict_types=1);
44

55
use App\Exceptions\BizException;
6-
use Contexts\CategoryManagement\Domain\Models\CategoryStatus;
6+
use Contexts\Shared\ValueObjects\CommonStatus;
7+
8+
class ConcreteStatus extends CommonStatus {}
79

810
it('can be created', function (string $validValue) {
9-
$categoryStatus = new CategoryStatus($validValue);
11+
$categoryStatus = new ConcreteStatus($validValue);
1012

1113
expect($categoryStatus->getValue())->toBe($validValue);
12-
})->with(['subspended', 'active', 'subspended', 'deleted']);
14+
})->with(['subspended', 'active', 'deleted']);
1315

1416
it('throws an exception when the status is invalid', function (string $invalidValue) {
1517
$this->expectException(BizException::class);
1618

17-
new CategoryStatus($invalidValue);
19+
new ConcreteStatus($invalidValue);
1820
})->with(['invalid', 'status']);
1921

2022
it('can be transitioned to another status', function (string $initialValue, string $targetValue) {
21-
$categoryStatus = new CategoryStatus($initialValue);
22-
$newStatus = $categoryStatus->transitionTo(CategoryStatus::{$targetValue}());
23+
$categoryStatus = new ConcreteStatus($initialValue);
24+
$newStatus = $categoryStatus->transitionTo(ConcreteStatus::{$targetValue}());
2325

2426
expect($newStatus->getValue())->toBe($targetValue);
2527
})->with([
2628
['subspended', 'active'],
2729
]);
2830

2931
it('throws an exception when transitioning to active from active', function () {
30-
$categoryStatus = new CategoryStatus('active');
32+
$categoryStatus = new ConcreteStatus('active');
3133

3234
$this->expectException(BizException::class);
3335

34-
$categoryStatus->transitionTo(CategoryStatus::active());
36+
$categoryStatus->transitionTo(ConcreteStatus::active());
3537
});
3638

3739
it('can create from string with valid status', function (string $validValue) {
38-
$categoryStatus = CategoryStatus::fromString($validValue);
40+
$categoryStatus = ConcreteStatus::fromString($validValue);
3941

4042
expect($categoryStatus->getValue())->toBe($validValue);
41-
})->with(['subspended', 'active', 'subspended', 'deleted']);
43+
})->with(['subspended', 'active', 'deleted']);
4244

4345
it('throws an exception when creating from invalid string status', function (string $invalidValue) {
4446
$this->expectException(BizException::class);
4547

46-
CategoryStatus::fromString($invalidValue);
48+
ConcreteStatus::fromString($invalidValue);
4749
})->with(['invalid', 'status']);
4850

4951
it('checks if two statuses are equal', function (string $status) {
50-
$status1 = new CategoryStatus($status);
51-
$status2 = new CategoryStatus($status);
52-
$differentStatus = $status === 'subspended' ? CategoryStatus::active() : CategoryStatus::subspended();
52+
$status1 = new ConcreteStatus($status);
53+
$status2 = new ConcreteStatus($status);
54+
$differentStatus = $status === 'subspended' ? ConcreteStatus::active() : ConcreteStatus::subspended();
5355

5456
expect($status1->equals($status2))->toBeTrue();
5557
expect($status1->equals($differentStatus))->toBeFalse();
56-
})->with(['subspended', 'active', 'subspended', 'deleted']);
58+
})->with(['subspended', 'active', 'deleted']);

0 commit comments

Comments
 (0)