Skip to content

Commit e11abe1

Browse files
authored
Release/2.2.0 (#7)
1 parent d6031a1 commit e11abe1

5 files changed

Lines changed: 51 additions & 1 deletion

File tree

.claude/rules/php-library-documentation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ paths:
1010

1111
1. Include an anchor-linked table of contents.
1212
2. Start with a concise one-line description of what the library does.
13-
3. Include a **badges** section (license, build status, coverage, latest version, PHP version).
13+
3. Include a **license** badge. Do not include any other badges.
1414
4. Provide an **Overview** section explaining the problem the library solves and its design philosophy.
1515
5. **Installation** section: Composer command (`composer require vendor/package`).
1616
6. **How to use** section: complete, runnable code examples covering the primary use cases. Each example

composer.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@
33
"description": "Implements tactical DDD building blocks for PHP: entities, aggregate roots, domain events, snapshots, and upcasters.",
44
"license": "MIT",
55
"type": "library",
6+
"keywords": [
7+
"ddd",
8+
"snapshot",
9+
"upcaster",
10+
"tiny-blocks",
11+
"value-object",
12+
"domain-events",
13+
"aggregate-root",
14+
"event-sourcing",
15+
"building-blocks",
16+
"domain-driven-design"
17+
],
618
"authors": [
719
{
820
"name": "Gustavo Freze de Araujo Santos",

src/Aggregate/AggregateRootBehavior.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ protected function generateSnapshotData(): SnapshotData
4848
return new SnapshotData(payload: $this->snapshotState());
4949
}
5050

51+
protected function reconstituteSequenceNumber(SequenceNumber $sequenceNumber): void
52+
{
53+
$this->sequenceNumber = $sequenceNumber;
54+
}
55+
5156
protected function snapshotState(): array
5257
{
5358
$state = get_object_vars($this);

tests/Aggregate/AggregateRootBehaviorTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Test\TinyBlocks\BuildingBlocks\Models\CartId;
1010
use Test\TinyBlocks\BuildingBlocks\Models\Order;
1111
use Test\TinyBlocks\BuildingBlocks\Models\OrderId;
12+
use TinyBlocks\BuildingBlocks\Event\SequenceNumber;
1213

1314
final class AggregateRootBehaviorTest extends TestCase
1415
{
@@ -71,4 +72,28 @@ public function testAggregateNameForOutboxAggregate(): void
7172
/** @Then it matches the short class name */
7273
self::assertSame('Order', $name);
7374
}
75+
76+
public function testReconstitutedSequenceNumberMatchesPersistedValue(): void
77+
{
78+
/** @Given an Order reconstituted with a persisted sequence number of 5 */
79+
$order = Order::reconstitute(orderId: new OrderId(value: 'ord-3'), sequenceNumber: SequenceNumber::of(value: 5));
80+
81+
/** @When retrieving the sequence number */
82+
$sequenceNumber = $order->sequenceNumber();
83+
84+
/** @Then it matches the persisted value */
85+
self::assertSame(5, $sequenceNumber->value);
86+
}
87+
88+
public function testPushAfterReconstituteAdvancesSequenceByOne(): void
89+
{
90+
/** @Given an Order reconstituted with a persisted sequence number of 5 */
91+
$order = Order::reconstitute(orderId: new OrderId(value: 'ord-4'), sequenceNumber: SequenceNumber::of(value: 5));
92+
93+
/** @When pushing a new event */
94+
$order->ship(carrier: 'FedEx');
95+
96+
/** @Then the sequence number advances by one */
97+
self::assertSame(6, $order->sequenceNumber()->value);
98+
}
7499
}

tests/Models/Order.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use TinyBlocks\BuildingBlocks\Aggregate\EventualAggregateRoot;
88
use TinyBlocks\BuildingBlocks\Aggregate\EventualAggregateRootBehavior;
9+
use TinyBlocks\BuildingBlocks\Event\SequenceNumber;
910

1011
final class Order implements EventualAggregateRoot
1112
{
@@ -17,6 +18,13 @@ private function __construct(private OrderId $id)
1718
{
1819
}
1920

21+
public static function reconstitute(OrderId $orderId, SequenceNumber $sequenceNumber): Order
22+
{
23+
$order = new Order(id: $orderId);
24+
$order->reconstituteSequenceNumber(sequenceNumber: $sequenceNumber);
25+
return $order;
26+
}
27+
2028
public static function place(OrderId $orderId, string $item): Order
2129
{
2230
$order = new Order(id: $orderId);

0 commit comments

Comments
 (0)