|
9 | 9 | use Patchlevel\EventSourcing\Attribute\Setup; |
10 | 10 | use Patchlevel\EventSourcing\Attribute\Subscribe; |
11 | 11 | use Patchlevel\EventSourcing\Attribute\Subscriber; |
| 12 | +use Patchlevel\EventSourcing\Attribute\SubscriptionId; |
12 | 13 | use Patchlevel\EventSourcing\Attribute\Teardown; |
13 | 14 | use ReflectionAttribute; |
14 | 15 | use ReflectionClass; |
|
17 | 18 |
|
18 | 19 | use function array_key_exists; |
19 | 20 | use function count; |
| 21 | +use function is_string; |
20 | 22 |
|
21 | 23 | final class AttributeSubscriberMetadataFactory implements SubscriberMetadataFactory |
22 | 24 | { |
@@ -109,8 +111,35 @@ public function metadata(string $subscriber): SubscriberMetadata |
109 | 111 | throw DuplicateSubscribeMethod::mixedWithAll($subscriber); |
110 | 112 | } |
111 | 113 |
|
| 114 | + $subscriptionId = $subscriberInfo->id; |
| 115 | + |
| 116 | + foreach ($reflector->getReflectionConstants() as $constant) { |
| 117 | + if (!$constant->getAttributes(SubscriptionId::class)) { |
| 118 | + continue; |
| 119 | + } |
| 120 | + |
| 121 | + $subscriptionIdValue = $constant->getValue(); |
| 122 | + |
| 123 | + if (!is_string($subscriptionIdValue)) { |
| 124 | + throw new SubscriptionIdWrongType($subscriber, $subscriptionIdValue); |
| 125 | + } |
| 126 | + |
| 127 | + if ($subscriptionId !== null) { |
| 128 | + throw new SubscriberHasMultipleSubscriptionIds( |
| 129 | + $subscriber, |
| 130 | + [$subscriptionId, $subscriptionIdValue], |
| 131 | + ); |
| 132 | + } |
| 133 | + |
| 134 | + $subscriptionId = $subscriptionIdValue; |
| 135 | + } |
| 136 | + |
| 137 | + if ($subscriptionId === null) { |
| 138 | + throw new SubscriptionIdMissing($subscriber); |
| 139 | + } |
| 140 | + |
112 | 141 | $metadata = new SubscriberMetadata( |
113 | | - $subscriberInfo->id, |
| 142 | + $subscriptionId, |
114 | 143 | $subscriberInfo->group, |
115 | 144 | $subscriberInfo->runMode, |
116 | 145 | $subscribeMethods, |
|
0 commit comments