Skip to content

Commit 26f6aff

Browse files
committed
Add domain events (Preparation for integrations)
1 parent a8161ee commit 26f6aff

37 files changed

+388
-207
lines changed

backend/app/Http/Request/Webhook/UpsertWebhookRequest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace HiEvents\Http\Request\Webhook;
44

5-
use HiEvents\DomainObjects\Enums\WebhookEventType;
65
use HiEvents\DomainObjects\Status\WebhookStatus;
76
use HiEvents\Http\Request\BaseRequest;
7+
use HiEvents\Services\Infrastructure\DomainEvents\Enums\DomainEventType;
88
use Illuminate\Validation\Rule;
99

1010
class UpsertWebhookRequest extends BaseRequest
@@ -13,7 +13,7 @@ public function rules(): array
1313
{
1414
return [
1515
'url' => 'required|url',
16-
'event_types.*' => ['required', Rule::in(WebhookEventType::valuesArray())],
16+
'event_types.*' => ['required', Rule::in(DomainEventType::valuesArray())],
1717
'status' => ['nullable', Rule::in(WebhookStatus::valuesArray())],
1818
];
1919
}

backend/app/Jobs/Order/Webhook/DispatchAttendeeWebhookJob.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace HiEvents\Jobs\Order\Webhook;
44

5-
use HiEvents\DomainObjects\Enums\WebhookEventType;
5+
use HiEvents\Services\Infrastructure\DomainEvents\Enums\DomainEventType;
66
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
77
use Illuminate\Bus\Queueable;
88
use Illuminate\Foundation\Bus\Dispatchable;
@@ -14,8 +14,8 @@ class DispatchAttendeeWebhookJob
1414
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
1515

1616
public function __construct(
17-
public int $attendeeId,
18-
public WebhookEventType $eventType,
17+
public int $attendeeId,
18+
public DomainEventType $eventType,
1919
)
2020
{
2121
}

backend/app/Jobs/Order/Webhook/DispatchCheckInWebhookJob.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace HiEvents\Jobs\Order\Webhook;
44

5-
use HiEvents\DomainObjects\Enums\WebhookEventType;
5+
use HiEvents\Services\Infrastructure\DomainEvents\Enums\DomainEventType;
66
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
77
use Illuminate\Bus\Queueable;
88
use Illuminate\Foundation\Bus\Dispatchable;
@@ -14,8 +14,8 @@ class DispatchCheckInWebhookJob
1414
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
1515

1616
public function __construct(
17-
public int $attendeeCheckInId,
18-
public WebhookEventType $eventType,
17+
public int $attendeeCheckInId,
18+
public DomainEventType $eventType,
1919
)
2020
{
2121
}

backend/app/Jobs/Order/Webhook/DispatchOrderWebhookJob.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace HiEvents\Jobs\Order\Webhook;
44

5-
use HiEvents\DomainObjects\Enums\WebhookEventType;
5+
use HiEvents\Services\Infrastructure\DomainEvents\Enums\DomainEventType;
66
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
77
use Illuminate\Bus\Queueable;
88
use Illuminate\Foundation\Bus\Dispatchable;
@@ -14,8 +14,8 @@ class DispatchOrderWebhookJob
1414
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
1515

1616
public function __construct(
17-
public int $orderId,
18-
public WebhookEventType $eventType,
17+
public int $orderId,
18+
public DomainEventType $eventType,
1919
)
2020
{
2121
}

backend/app/Jobs/Order/Webhook/DispatchProductWebhookJob.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace HiEvents\Jobs\Order\Webhook;
44

5-
use HiEvents\DomainObjects\Enums\WebhookEventType;
5+
use HiEvents\Services\Infrastructure\DomainEvents\Enums\DomainEventType;
66
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
77
use Illuminate\Bus\Queueable;
88
use Illuminate\Foundation\Bus\Dispatchable;
@@ -14,8 +14,8 @@ class DispatchProductWebhookJob
1414
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
1515

1616
public function __construct(
17-
public int $productId,
18-
public WebhookEventType $eventType,
17+
public int $productId,
18+
public DomainEventType $eventType,
1919
)
2020
{
2121
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace HiEvents\Listeners\Webhook;
4+
5+
use HiEvents\Jobs\Order\Webhook\DispatchAttendeeWebhookJob;
6+
use HiEvents\Jobs\Order\Webhook\DispatchCheckInWebhookJob;
7+
use HiEvents\Jobs\Order\Webhook\DispatchOrderWebhookJob;
8+
use HiEvents\Jobs\Order\Webhook\DispatchProductWebhookJob;
9+
use HiEvents\Services\Infrastructure\DomainEvents\Events\AttendeeEvent;
10+
use HiEvents\Services\Infrastructure\DomainEvents\Events\BaseDomainEvent;
11+
use HiEvents\Services\Infrastructure\DomainEvents\Events\CheckinEvent;
12+
use HiEvents\Services\Infrastructure\DomainEvents\Events\OrderEvent;
13+
use HiEvents\Services\Infrastructure\DomainEvents\Events\ProductEvent;
14+
use Illuminate\Config\Repository;
15+
16+
class WebhookEventListener
17+
{
18+
public function __construct(
19+
private readonly Repository $config,
20+
)
21+
{
22+
}
23+
24+
public function handle(BaseDomainEvent $event): void
25+
{
26+
$queueName = $this->config->get('queue.webhook_queue_name');
27+
28+
switch (get_class($event)) {
29+
case AttendeeEvent::class:
30+
DispatchAttendeeWebhookJob::dispatch(
31+
attendeeId: $event->attendeeId,
32+
eventType: $event->type,
33+
)->onQueue($queueName);
34+
break;
35+
case OrderEvent::class:
36+
DispatchOrderWebhookJob::dispatch(
37+
orderId: $event->orderId,
38+
eventType: $event->type,
39+
)->onQueue($queueName);
40+
break;
41+
case ProductEvent::class:
42+
DispatchProductWebhookJob::dispatch(
43+
productId: $event->productId,
44+
eventType: $event->type,
45+
)->onQueue($queueName);
46+
break;
47+
case CheckinEvent::class:
48+
DispatchCheckInWebhookJob::dispatch(
49+
attendeeCheckInId: $event->attendeeCheckinId,
50+
eventType: $event->type,
51+
)->onQueue($queueName);
52+
break;
53+
}
54+
}
55+
}

backend/app/Providers/EventServiceProvider.php

+27-8
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,27 @@
22

33
namespace HiEvents\Providers;
44

5-
use Illuminate\Auth\Events\Registered;
6-
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
5+
use HiEvents\Listeners\Webhook\WebhookEventListener;
6+
use HiEvents\Services\Infrastructure\DomainEvents\Events\AttendeeEvent;
7+
use HiEvents\Services\Infrastructure\DomainEvents\Events\CheckinEvent;
8+
use HiEvents\Services\Infrastructure\DomainEvents\Events\OrderEvent;
9+
use HiEvents\Services\Infrastructure\DomainEvents\Events\ProductEvent;
710
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
11+
use Illuminate\Support\Facades\Event;
812

913
class EventServiceProvider extends ServiceProvider
1014
{
1115
/**
12-
* The event to listener mappings for the application.
16+
* Map of listeners to the events they should handle.
1317
*
14-
* @var array<class-string, array<int, class-string>>
18+
* @var array<class-string, array<class-string>>
1519
*/
16-
protected $listen = [
17-
Registered::class => [
18-
SendEmailVerificationNotification::class,
20+
private static array $domainEventMap = [
21+
WebhookEventListener::class => [
22+
ProductEvent::class,
23+
OrderEvent::class,
24+
AttendeeEvent::class,
25+
CheckinEvent::class,
1926
],
2027
];
2128

@@ -24,7 +31,19 @@ class EventServiceProvider extends ServiceProvider
2431
*/
2532
public function boot(): void
2633
{
27-
//
34+
$this->registerDomainEventListeners();
35+
}
36+
37+
/**
38+
* Dynamically register all domain event listeners.
39+
*/
40+
private function registerDomainEventListeners(): void
41+
{
42+
foreach (self::$domainEventMap as $listener => $events) {
43+
foreach ($events as $event) {
44+
Event::listen($event, [$listener, 'handle']);
45+
}
46+
}
2847
}
2948

3049
/**

backend/app/Repository/Eloquent/BaseRepository.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public function paginateWhere(
9696

9797
public function simplePaginateWhere(
9898
array $where,
99-
int $limit = null,
99+
?int $limit = null,
100100
array $columns = self::DEFAULT_COLUMNS,
101101
): Paginator
102102
{
@@ -126,7 +126,7 @@ public function findById(int $id, array $columns = self::DEFAULT_COLUMNS): Domai
126126

127127
public function findFirstByField(
128128
string $field,
129-
string $value = null,
129+
?string $value = null,
130130
array $columns = ['*']
131131
): ?DomainObjectInterface
132132
{

backend/app/Repository/Interfaces/RepositoryInterface.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public function paginateWhere(
7171
*/
7272
public function simplePaginateWhere(
7373
array $where,
74-
int $limit = null,
74+
?int $limit = null,
7575
array $columns = self::DEFAULT_COLUMNS,
7676
): Paginator;
7777

@@ -129,7 +129,7 @@ public function findFirstWhere(array $where, array $columns = self::DEFAULT_COLU
129129
*/
130130
public function findFirstByField(
131131
string $field,
132-
string $value = null,
132+
?string $value = null,
133133
array $columns = ['*']
134134
): ?DomainObjectInterface;
135135

backend/app/Services/Application/Handlers/Attendee/CreateAttendeeHandler.php

+8-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use Brick\Money\Money;
66
use HiEvents\DomainObjects\AttendeeDomainObject;
77
use HiEvents\DomainObjects\Enums\ProductType;
8-
use HiEvents\DomainObjects\Enums\WebhookEventType;
98
use HiEvents\DomainObjects\Generated\AttendeeDomainObjectAbstract;
109
use HiEvents\DomainObjects\Generated\OrderDomainObjectAbstract;
1110
use HiEvents\DomainObjects\Generated\OrderItemDomainObjectAbstract;
@@ -31,7 +30,9 @@
3130
use HiEvents\Services\Domain\Order\OrderManagementService;
3231
use HiEvents\Services\Domain\Product\ProductQuantityUpdateService;
3332
use HiEvents\Services\Domain\Tax\TaxAndFeeRollupService;
34-
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
33+
use HiEvents\Services\Infrastructure\DomainEvents\DomainEventDispatcherService;
34+
use HiEvents\Services\Infrastructure\DomainEvents\Enums\DomainEventType;
35+
use HiEvents\Services\Infrastructure\DomainEvents\Events\OrderEvent;
3536
use Illuminate\Database\DatabaseManager;
3637
use Illuminate\Support\Collection;
3738
use RuntimeException;
@@ -49,7 +50,7 @@ public function __construct(
4950
private readonly TaxAndFeeRepositoryInterface $taxAndFeeRepository,
5051
private readonly TaxAndFeeRollupService $taxAndFeeRollupService,
5152
private readonly OrderManagementService $orderManagementService,
52-
private readonly WebhookDispatchService $webhookDispatchService,
53+
private readonly DomainEventDispatcherService $domainEventDispatcherService,
5354
)
5455
{
5556
}
@@ -103,7 +104,7 @@ public function handle(CreateAttendeeDTO $attendeeDTO): AttendeeDomainObject
103104

104105
$this->fireEventsAndUpdateQuantities($attendeeDTO, $order);
105106

106-
$this->queueWebhooks($attendee, $order);
107+
$this->queueWebhooks($order);
107108

108109
return $attendee;
109110
});
@@ -247,11 +248,10 @@ private function fireEventsAndUpdateQuantities(CreateAttendeeDTO $attendeeDTO, O
247248
));
248249
}
249250

250-
private function queueWebhooks(AttendeeDomainObject $attendee, OrderDomainObject $order): void
251+
private function queueWebhooks(OrderDomainObject $order): void
251252
{
252-
$this->webhookDispatchService->queueOrderWebhook(
253-
eventType: WebhookEventType::ORDER_CREATED,
254-
orderId: $order->getId(),
253+
$this->domainEventDispatcherService->dispatch(
254+
new OrderEvent(DomainEventType::ATTENDEE_CREATED, $order->getId())
255255
);
256256
}
257257
}

backend/app/Services/Application/Handlers/Attendee/EditAttendeeHandler.php

+9-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use HiEvents\DomainObjects\AttendeeDomainObject;
66
use HiEvents\DomainObjects\Enums\ProductPriceType;
7-
use HiEvents\DomainObjects\Enums\WebhookEventType;
87
use HiEvents\DomainObjects\Generated\AttendeeDomainObjectAbstract;
98
use HiEvents\DomainObjects\Generated\ProductDomainObjectAbstract;
109
use HiEvents\DomainObjects\ProductDomainObject;
@@ -14,7 +13,9 @@
1413
use HiEvents\Repository\Interfaces\ProductRepositoryInterface;
1514
use HiEvents\Services\Application\Handlers\Attendee\DTO\EditAttendeeDTO;
1615
use HiEvents\Services\Domain\Product\ProductQuantityUpdateService;
17-
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
16+
use HiEvents\Services\Infrastructure\DomainEvents\DomainEventDispatcherService;
17+
use HiEvents\Services\Infrastructure\DomainEvents\Enums\DomainEventType;
18+
use HiEvents\Services\Infrastructure\DomainEvents\Events\AttendeeEvent;
1819
use Illuminate\Database\DatabaseManager;
1920
use Illuminate\Validation\ValidationException;
2021
use Throwable;
@@ -26,7 +27,7 @@ public function __construct(
2627
private readonly ProductRepositoryInterface $productRepository,
2728
private readonly ProductQuantityUpdateService $productQuantityService,
2829
private readonly DatabaseManager $databaseManager,
29-
private readonly WebhookDispatchService $webhookDispatchService,
30+
private readonly DomainEventDispatcherService $domainEventDispatcherService,
3031
)
3132
{
3233
}
@@ -46,9 +47,11 @@ public function handle(EditAttendeeDTO $editAttendeeDTO): AttendeeDomainObject
4647

4748
$updatedAttendee = $this->updateAttendee($editAttendeeDTO);
4849

49-
$this->webhookDispatchService->queueAttendeeWebhook(
50-
eventType: WebhookEventType::ATTENDEE_UPDATED,
51-
attendeeId: $updatedAttendee->getId(),
50+
$this->domainEventDispatcherService->dispatch(
51+
new AttendeeEvent(
52+
type: DomainEventType::ATTENDEE_UPDATED,
53+
attendeeId: $updatedAttendee->getId(),
54+
)
5255
);
5356

5457
return $updatedAttendee;

backend/app/Services/Application/Handlers/Attendee/PartialEditAttendeeHandler.php

+9-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
namespace HiEvents\Services\Application\Handlers\Attendee;
44

55
use HiEvents\DomainObjects\AttendeeDomainObject;
6-
use HiEvents\DomainObjects\Enums\WebhookEventType;
76
use HiEvents\DomainObjects\Status\AttendeeStatus;
87
use HiEvents\Repository\Interfaces\AttendeeRepositoryInterface;
98
use HiEvents\Services\Application\Handlers\Attendee\DTO\PartialEditAttendeeDTO;
109
use HiEvents\Services\Domain\Product\ProductQuantityUpdateService;
11-
use HiEvents\Services\Infrastructure\Webhook\WebhookDispatchService;
10+
use HiEvents\Services\Infrastructure\DomainEvents\DomainEventDispatcherService;
11+
use HiEvents\Services\Infrastructure\DomainEvents\Enums\DomainEventType;
12+
use HiEvents\Services\Infrastructure\DomainEvents\Events\AttendeeEvent;
1213
use Illuminate\Database\DatabaseManager;
1314
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
1415
use Throwable;
@@ -19,7 +20,7 @@ public function __construct(
1920
private readonly AttendeeRepositoryInterface $attendeeRepository,
2021
private readonly ProductQuantityUpdateService $productQuantityService,
2122
private readonly DatabaseManager $databaseManager,
22-
private readonly WebhookDispatchService $webhookDispatchService,
23+
private readonly DomainEventDispatcherService $domainEventDispatcherService,
2324
)
2425
{
2526
}
@@ -52,9 +53,11 @@ private function updateAttendee(PartialEditAttendeeDTO $data): AttendeeDomainObj
5253
}
5354

5455
if ($statusIsUpdated && $data->status === AttendeeStatus::CANCELLED->name) {
55-
$this->webhookDispatchService->queueAttendeeWebhook(
56-
eventType: WebhookEventType::ATTENDEE_CANCELLED,
57-
attendeeId: $attendee->getId(),
56+
$this->domainEventDispatcherService->dispatch(
57+
new AttendeeEvent(
58+
type: DomainEventType::ATTENDEE_CANCELLED,
59+
attendeeId: $attendee->getId(),
60+
)
5861
);
5962
}
6063

0 commit comments

Comments
 (0)