|
4 | 4 | import static life.qbic.logging.service.LoggerFactory.logger;
|
5 | 5 |
|
6 | 6 | import java.time.Instant;
|
| 7 | +import java.util.ArrayList; |
7 | 8 | import java.util.List;
|
8 | 9 | import java.util.Optional;
|
9 | 10 | import life.qbic.application.commons.ApplicationException;
|
| 11 | +import life.qbic.domain.concepts.DomainEvent; |
10 | 12 | import life.qbic.domain.concepts.DomainEventDispatcher;
|
| 13 | +import life.qbic.domain.concepts.DomainEventSubscriber; |
| 14 | +import life.qbic.domain.concepts.LocalDomainEventDispatcher; |
11 | 15 | import life.qbic.logging.api.Logger;
|
12 | 16 | import life.qbic.projectmanagement.application.api.ProjectPurchaseStorage;
|
13 | 17 | import life.qbic.projectmanagement.application.api.PurchaseStoreException;
|
@@ -42,14 +46,21 @@ public void addPurchases(String projectId, List<OfferDTO> offers) {
|
42 | 46 |
|
43 | 47 | var projectReference = ProjectId.parse(projectId);
|
44 | 48 | var purchaseDate = Instant.now();
|
| 49 | + |
| 50 | + List<DomainEvent> domainEventsCache = new ArrayList<>(); |
| 51 | + var localDomainEventDispatcher = LocalDomainEventDispatcher.instance(); |
| 52 | + localDomainEventDispatcher.reset(); |
| 53 | + localDomainEventDispatcher.subscribe( |
| 54 | + new PurchaseCreatedDomainEventSubscriber(domainEventsCache)); |
| 55 | + |
45 | 56 | List<ServicePurchase> servicePurchases = offers.stream()
|
46 | 57 | .map(it -> Offer.create(it.signed(), it.fileName(), it.content()))
|
47 | 58 | .map(it -> ServicePurchase.create(projectReference, purchaseDate, it))
|
48 | 59 | .toList();
|
49 | 60 | try {
|
50 |
| - Iterable<ServicePurchase> storedPurchases = storage.storePurchases(servicePurchases); |
51 |
| - for (ServicePurchase storedPurchase : storedPurchases) { |
52 |
| - DomainEventDispatcher.instance().dispatch(new PurchaseCreatedEvent(storedPurchase.getId())); |
| 61 | + Iterable<ServicePurchase> results = storage.storePurchases(servicePurchases); |
| 62 | + for(ServicePurchase servicePurchase : results) { |
| 63 | + DomainEventDispatcher.instance().dispatch(new PurchaseCreatedEvent(servicePurchase.getId())); |
53 | 64 | }
|
54 | 65 | } catch (PurchaseStoreException e) {
|
55 | 66 | throw ApplicationException.wrapping(e);
|
@@ -91,5 +102,18 @@ public Optional<Offer> getOfferWithContent(String projectId, Long offerId) {
|
91 | 102 | public Optional<ProjectId> findProjectIdOfPurchase(Long purchaseID) {
|
92 | 103 | return storage.findProjectIdOfPurchase(purchaseID);
|
93 | 104 | }
|
| 105 | + private record PurchaseCreatedDomainEventSubscriber( |
| 106 | + List<DomainEvent> domainEventsCache) implements |
| 107 | + DomainEventSubscriber<DomainEvent> { |
| 108 | + |
| 109 | + @Override |
| 110 | + public Class<? extends DomainEvent> subscribedToEventType() { |
| 111 | + return PurchaseCreatedEvent.class; |
| 112 | + } |
94 | 113 |
|
| 114 | + @Override |
| 115 | + public void handleEvent(DomainEvent event) { |
| 116 | + domainEventsCache.add(event); |
| 117 | + } |
| 118 | + } |
95 | 119 | }
|
0 commit comments