Skip to content

Commit 8315f16

Browse files
committed
fix error when ticket metadata is not defined
1 parent baa80b8 commit 8315f16

File tree

1 file changed

+56
-44
lines changed

1 file changed

+56
-44
lines changed

src/main/java/alfio/manager/ExtensionManager.java

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import alfio.model.extension.*;
3232
import alfio.model.metadata.AlfioMetadata;
3333
import alfio.model.metadata.TicketMetadata;
34+
import alfio.model.metadata.TicketMetadataContainer;
3435
import alfio.model.system.ConfigurationKeys;
3536
import alfio.model.user.Organization;
3637
import alfio.model.user.PublicUserProfile;
@@ -64,6 +65,17 @@
6465
@Log4j2
6566
public class ExtensionManager {
6667

68+
private static final String TICKET = "ticket";
69+
private static final String EVENT_METADATA = "eventMetadata";
70+
private static final String ORGANIZATION = "organization";
71+
private static final String RESERVATION = "reservation";
72+
private static final String BILLING_DETAILS = "billingDetails";
73+
private static final String ADDITIONAL_INFO = "additionalInfo";
74+
private static final String RESERVATIONS = "reservations";
75+
private static final String RESERVATION_IDS = "reservationIds";
76+
private static final String ORGANIZATION_ID = "organizationId";
77+
private static final String RESERVATION_ID = "reservationId";
78+
private static final String EVENT = "event";
6779
private final ExtensionService extensionService;
6880
private final EventRepository eventRepository;
6981
private final TicketReservationRepository ticketReservationRepository;
@@ -96,16 +108,16 @@ void handleEventStatusChange(Event event, Event.Status status) {
96108
AlfioMetadata handleMetadataUpdate(Event event, Organization organization, AlfioMetadata metadata) {
97109
Map<String, Object> payload = new HashMap<>();
98110
payload.put("metadata", metadata);
99-
payload.put("organization", organization);
111+
payload.put(ORGANIZATION, organization);
100112
payload.put("baseUrl", configurationManager.getFor(ConfigurationKeys.BASE_URL, ConfigurationLevel.organization(organization.getId())).getRequiredValue());
101113
return syncCall(ExtensionEvent.EVENT_METADATA_UPDATE, event, payload, AlfioMetadata.class);
102114
}
103115

104116
void handleReservationConfirmation(TicketReservation reservation, BillingDetails billingDetails, PurchaseContext purchaseContext) {
105117
Map<String, Object> payload = new HashMap<>();
106-
payload.put("reservation", reservation);
107-
payload.put("billingDetails", billingDetails);
108-
payload.put("additionalInfo", Map.of());
118+
payload.put(RESERVATION, reservation);
119+
payload.put(BILLING_DETAILS, billingDetails);
120+
payload.put(ADDITIONAL_INFO, Map.of());
109121
transactionRepository.loadOptionalByReservationId(reservation.getId())
110122
.ifPresent(tr -> payload.put("transaction", tr));
111123
asyncCall(ExtensionEvent.RESERVATION_CONFIRMED,
@@ -124,9 +136,9 @@ public void handleTicketAssignment(Ticket ticket,
124136
asyncCall(ExtensionEvent.TICKET_ASSIGNED,
125137
event,
126138
Map.of(
127-
"ticket", ticket,
128-
"additionalInfo", additionalInfo,
129-
"eventMetadata", eventRepository.getMetadataForEvent(event.getId()),
139+
TICKET, ticket,
140+
ADDITIONAL_INFO, additionalInfo,
141+
EVENT_METADATA, eventRepository.getMetadataForEvent(event.getId()),
130142
"onlineAccessTicket", EventUtil.isAccessOnline(category, event)
131143
));
132144
}
@@ -135,7 +147,7 @@ void handleWaitingQueueSubscription(WaitingQueueSubscription waitingQueueSubscri
135147
Event event = eventRepository.findById(waitingQueueSubscription.getEventId());
136148
asyncCall(ExtensionEvent.WAITING_QUEUE_SUBSCRIBED,
137149
event,
138-
Map.of("waitingQueueSubscription", waitingQueueSubscription, "additionalInfo", Map.of()));
150+
Map.of("waitingQueueSubscription", waitingQueueSubscription, ADDITIONAL_INFO, Map.of()));
139151
}
140152

141153
void handleReservationsExpiredForEvent(PurchaseContext purchaseContext, Collection<String> reservationIdsToRemove) {
@@ -149,25 +161,25 @@ void handleReservationsCancelledForEvent(PurchaseContext purchaseContext, Collec
149161
void handleTicketCancelledForEvent(Event event, Collection<String> ticketUUIDs) {
150162
Map<String, Object> payload = new HashMap<>();
151163
payload.put("ticketUUIDs", ticketUUIDs);
152-
payload.put("eventMetadata", eventRepository.getMetadataForEvent(event.getId()));
164+
payload.put(EVENT_METADATA, eventRepository.getMetadataForEvent(event.getId()));
153165
syncCall(ExtensionEvent.TICKET_CANCELLED, event, payload, Boolean.class);
154166
}
155167

156168
void handleOfflineReservationsWillExpire(Event event, List<TicketReservationInfo> reservations) {
157169
Map<String, Object> payload = new HashMap<>();
158-
payload.put("reservations", reservations);
170+
payload.put(RESERVATIONS, reservations);
159171
asyncCall(ExtensionEvent.OFFLINE_RESERVATIONS_WILL_EXPIRE, event, payload);
160172
}
161173

162174
void handleStuckReservations(Event event, List<String> stuckReservationsId) {
163175
Map<String, Object> payload = new HashMap<>();
164-
payload.put("reservationIds", stuckReservationsId);
176+
payload.put(RESERVATION_IDS, stuckReservationsId);
165177
asyncCall(ExtensionEvent.STUCK_RESERVATIONS, event, payload);
166178
}
167179

168180
Optional<CustomEmailText> handleReservationEmailCustomText(PurchaseContext purchaseContext, TicketReservation reservation, TicketReservationAdditionalInfo additionalInfo) {
169181
Map<String, Object> payload = Map.of(
170-
"reservation", reservation,
182+
RESERVATION, reservation,
171183
"purchaseContext", purchaseContext,
172184
"billingData", additionalInfo
173185
);
@@ -181,8 +193,8 @@ Optional<CustomEmailText> handleReservationEmailCustomText(PurchaseContext purch
181193

182194
public Optional<CustomEmailText> handleTicketEmailCustomText(Event event, TicketReservation reservation, TicketReservationAdditionalInfo additionalInfo, List<TicketFieldValue> fields) {
183195
Map<String, Object> payload = Map.of(
184-
"reservation", reservation,
185-
"event", event,
196+
RESERVATION, reservation,
197+
EVENT, event,
186198
"billingData", additionalInfo,
187199
"additionalFields", fields
188200
);
@@ -196,30 +208,30 @@ public Optional<CustomEmailText> handleTicketEmailCustomText(Event event, Ticket
196208

197209
private void handleReservationRemoval(PurchaseContext purchaseContext, Collection<String> reservationIds, ExtensionEvent extensionEvent) {
198210
Map<String, Object> payload = new HashMap<>();
199-
payload.put("reservationIds", reservationIds);
200-
payload.put("reservations", ticketReservationRepository.findByIds(reservationIds));
211+
payload.put(RESERVATION_IDS, reservationIds);
212+
payload.put(RESERVATIONS, ticketReservationRepository.findByIds(reservationIds));
201213

202214
syncCall(extensionEvent, purchaseContext, payload, Boolean.class);
203215
}
204216

205217
public void handleCreditNoteGenerated(TicketReservation reservation, PurchaseContext purchaseContext, TotalPrice cost, Long billingDocumentId, Map<String, Object> contextData) {
206218
Map<String, Object> payload = new HashMap<>(contextData);
207-
payload.put("reservationId", reservation.getId());
208-
payload.put("reservation", reservation);
209-
payload.put("billingDetails", ticketReservationRepository.getBillingDetailsForReservation(reservation.getId()));
219+
payload.put(RESERVATION_ID, reservation.getId());
220+
payload.put(RESERVATION, reservation);
221+
payload.put(BILLING_DETAILS, ticketReservationRepository.getBillingDetailsForReservation(reservation.getId()));
210222
payload.put("reservationCost", cost);
211223
payload.put("billingDocumentId", billingDocumentId);
212224
asyncCall(ExtensionEvent.CREDIT_NOTE_GENERATED, purchaseContext, payload);
213225
}
214226

215227
public Optional<InvoiceGeneration> handleInvoiceGeneration(PaymentSpecification spec, TotalPrice reservationCost, BillingDetails billingDetails, Map<String, Object> contextData) {
216228
Map<String, Object> payload = new HashMap<>(contextData);
217-
payload.put("reservationId", spec.getReservationId());
229+
payload.put(RESERVATION_ID, spec.getReservationId());
218230
payload.put("email", spec.getEmail());
219231
payload.put("customerName", spec.getCustomerName());
220232
payload.put("userLanguage", spec.getLocale().getLanguage());
221233
payload.put("billingAddress", spec.getBillingAddress());
222-
payload.put("billingDetails", billingDetails);
234+
payload.put(BILLING_DETAILS, billingDetails);
223235
payload.put("customerReference", spec.getCustomerReference());
224236
payload.put("reservationCost", reservationCost);
225237
payload.put("invoiceRequested", spec.isInvoiceRequested());
@@ -235,9 +247,9 @@ public Optional<CreditNoteGeneration> handleCreditNoteGeneration(PurchaseContext
235247
String invoiceNumber,
236248
Organization organization) {
237249
return Optional.ofNullable(syncCall(ExtensionEvent.CREDIT_NOTE_GENERATION, purchaseContext, Map.of(
238-
"reservationId", reservationId,
250+
RESERVATION_ID, reservationId,
239251
"invoiceNumber", invoiceNumber,
240-
"organization", organization
252+
ORGANIZATION, organization
241253
), CreditNoteGeneration.class));
242254
}
243255

@@ -246,12 +258,12 @@ public Optional<String> handleOnlineCheckInLink(String originalUrl,
246258
EventWithCheckInInfo event,
247259
Map<String, List<String>> additionalInfo) {
248260
Map<String, Object> payload = new HashMap<>();
249-
payload.put("event", event);
261+
payload.put(EVENT, event);
250262
payload.put("eventId", event.getId());
251-
payload.put("organizationId", event.getOrganizationId());
252-
payload.put("ticket", ticket);
263+
payload.put(ORGANIZATION_ID, event.getOrganizationId());
264+
payload.put(TICKET, ticket);
253265
payload.put("originalURL", originalUrl);
254-
payload.put("additionalInfo", Objects.requireNonNullElse(additionalInfo, Map.of()));
266+
payload.put(ADDITIONAL_INFO, Objects.requireNonNullElse(additionalInfo, Map.of()));
255267

256268
return Optional.ofNullable(extensionService.executeScriptsForEvent(ONLINE_CHECK_IN_REDIRECT.name(),
257269
toPath(event),
@@ -269,21 +281,21 @@ boolean handleTaxIdValidation(PurchaseContext purchaseContext, String taxIdNumbe
269281
void handleTicketCheckedIn(Ticket ticket) {
270282
Map<String, Object> payload = new HashMap<>();
271283
Event event = eventRepository.findById(ticket.getEventId());
272-
payload.put("ticket", ticket);
284+
payload.put(TICKET, ticket);
273285
asyncCall(ExtensionEvent.TICKET_CHECKED_IN, event, payload);
274286
}
275287

276288
void handleTicketRevertCheckedIn(Ticket ticket) {
277289
Map<String, Object> payload = new HashMap<>();
278290
Event event = eventRepository.findById(ticket.getEventId());
279-
payload.put("ticket", ticket);
291+
payload.put(TICKET, ticket);
280292
asyncCall(ExtensionEvent.TICKET_REVERT_CHECKED_IN, event, payload);
281293
}
282294

283295
public void handleReservationValidation(PurchaseContext purchaseContext, TicketReservation reservation, Object clientForm, BindingResult bindingResult) {
284296
Map<String, Object> payload = Map.of(
285-
"reservationId", reservation.getId(),
286-
"reservation", reservation,
297+
RESERVATION_ID, reservation.getId(),
298+
RESERVATION, reservation,
287299
"form", clientForm,
288300
"bindingResult", bindingResult
289301
);
@@ -302,23 +314,23 @@ public void handleUserProfileValidation(Object clientForm, BindingResult binding
302314

303315
void handleEventHeaderUpdate(Event event, Organization organization) {
304316
Map<String, Object> payload = Map.of(
305-
"eventMetadata", eventRepository.getMetadataForEvent(event.getId()),
306-
"organization", organization
317+
EVENT_METADATA, eventRepository.getMetadataForEvent(event.getId()),
318+
ORGANIZATION, organization
307319
);
308320
asyncCall(ExtensionEvent.EVENT_HEADER_UPDATED, event, payload);
309321
}
310322

311323
void handleReservationsCreditNoteIssuedForEvent(Event event, List<String> reservationIds) {
312324
Map<String, Object> payload = new HashMap<>();
313-
payload.put("reservationIds", reservationIds);
314-
payload.put("reservations", ticketReservationRepository.findByIds(reservationIds));
325+
payload.put(RESERVATION_IDS, reservationIds);
326+
payload.put(RESERVATIONS, ticketReservationRepository.findByIds(reservationIds));
315327

316328
syncCall(ExtensionEvent.RESERVATION_CREDIT_NOTE_ISSUED, event, payload, Boolean.class);
317329
}
318330

319331
void handleRefund(PurchaseContext purchaseContext, TicketReservation reservation, TransactionAndPaymentInfo info) {
320332
Map<String, Object> payload = new HashMap<>();
321-
payload.put("reservation", reservation);
333+
payload.put(RESERVATION, reservation);
322334
payload.put("transaction", info.getTransaction());
323335
payload.put("paymentInfo", info.getPaymentInformation());
324336
asyncCall(ExtensionEvent.REFUND_ISSUED, purchaseContext, payload);
@@ -330,7 +342,7 @@ void handleRefund(PurchaseContext purchaseContext, TicketReservation reservation
330342
* @param purchaseContext the current Purchase Context
331343
* @param userAdditionalData user data to filter
332344
* @param userProfile existing user profile, may be null
333-
* @return the keys to persist
345+
* @return the keys to persist, or {@code null}
334346
*/
335347
public List<AdditionalInfoItem> filterAdditionalInfoToSave(PurchaseContext purchaseContext,
336348
Map<String, List<String>> userAdditionalData,
@@ -369,7 +381,7 @@ public Optional<String> generateOAuth2StateParam(int organizationId) {
369381
try {
370382
return Optional.ofNullable(extensionService.executeScriptsForEvent(ExtensionEvent.OAUTH2_STATE_GENERATION.name(),
371383
"-" + organizationId,
372-
Map.of("baseUrl", configurationManager.getFor(ConfigurationKeys.BASE_URL, ConfigurationLevel.organization(organizationId)).getRequiredValue(), "organizationId", organizationId),
384+
Map.of("baseUrl", configurationManager.getFor(ConfigurationKeys.BASE_URL, ConfigurationLevel.organization(organizationId)).getRequiredValue(), ORGANIZATION_ID, organizationId),
373385
String.class));
374386
} catch (Exception ex) {
375387
log.error("got exception while generating OAuth2 State Param", ex);
@@ -381,7 +393,7 @@ public Optional<PromoCodeDiscount> handleDynamicDiscount(Event event, Map<Intege
381393
try {
382394
var values = new HashMap<String, Object>();
383395
values.put("quantityByCategory", quantityByCategory);
384-
values.put("reservationId", reservationId);
396+
values.put(RESERVATION_ID, reservationId);
385397
var dynamicDiscountResult = syncCall(ExtensionEvent.DYNAMIC_DISCOUNT_APPLICATION, event,
386398
values, DynamicDiscount.class);
387399
if(dynamicDiscountResult == null || dynamicDiscountResult.getDiscountType() == PromoCodeDiscount.DiscountType.NONE) {
@@ -431,11 +443,11 @@ private Map<String, Object> fillWithBasicInfo(Map<String, ?> payload, PurchaseCo
431443
if(purchaseContext != null) {
432444
//FIXME ugly
433445
purchaseContext.event().ifPresent(event -> {
434-
payloadCopy.put("event", event);
446+
payloadCopy.put(EVENT, event);
435447
payloadCopy.put("eventId", event.getId());
436448
});
437449
payloadCopy.put("purchaseContext", purchaseContext);
438-
payloadCopy.put("organizationId", purchaseContext.getOrganizationId());
450+
payloadCopy.put(ORGANIZATION_ID, purchaseContext.getOrganizationId());
439451
}
440452
return payloadCopy;
441453
}
@@ -461,11 +473,11 @@ public void handlePublicUserDelete(OpenIdAlfioAuthentication authentication, Use
461473
public Optional<TicketMetadata> handleCustomOnlineJoinUrl(Event event,
462474
Ticket ticket,
463475
Map<String, List<String>> ticketAdditionalInfo) {
464-
var ticketMetadataContainer = ticketRepository.getTicketMetadata(ticket.getId());
476+
var ticketMetadataContainer = Objects.requireNonNullElseGet(ticketRepository.getTicketMetadata(ticket.getId()), TicketMetadataContainer::empty);
465477
var context = new HashMap<String, Object>();
466478
var key = ExtensionEvent.CUSTOM_ONLINE_JOIN_URL.name();
467-
context.put("ticket", ticket);
468-
context.put("additionalInfo", ticketAdditionalInfo);
479+
context.put(TICKET, ticket);
480+
context.put(ADDITIONAL_INFO, ticketAdditionalInfo);
469481
var existingMetadata = ticketMetadataContainer.getMetadataForKey(key);
470482
existingMetadata.ifPresent(m -> context.put("ticketMetadata", m));
471483
var result = Optional.ofNullable(syncCall(ExtensionEvent.CUSTOM_ONLINE_JOIN_URL, event, context, TicketMetadata.class, false));

0 commit comments

Comments
 (0)