use of alfio.model.WaitingQueueSubscription in project alf.io by alfio-event.
the class WaitingQueueProcessorMultiThreadedIntegrationTest method testPreRegistration.
@Test
public void testPreRegistration() throws InterruptedException {
IntegrationTestUtil.ensureMinimalConfiguration(configurationRepository);
configurationManager.saveSystemConfiguration(ConfigurationKeys.ENABLE_PRE_REGISTRATION, "true");
configurationManager.saveSystemConfiguration(ConfigurationKeys.ENABLE_WAITING_QUEUE, "true");
initAdminUser(userRepository, authorityRepository);
Event event = null;
try {
List<TicketCategoryModification> categories = Collections.singletonList(new TicketCategoryModification(null, "default", TicketCategory.TicketAccessType.INHERIT, 10, new DateTimeModification(LocalDate.now(ClockProvider.clock()).plusDays(1), LocalTime.now(ClockProvider.clock())), new DateTimeModification(LocalDate.now(ClockProvider.clock()).plusDays(2), LocalTime.now(ClockProvider.clock())), DESCRIPTION, BigDecimal.TEN, false, "", false, null, null, null, null, null, 0, null, null, AlfioMetadata.empty()));
Pair<Event, String> pair = initEvent(categories, organizationRepository, userManager, eventManager, eventRepository);
event = pair.getKey();
waitingQueueManager.subscribe(event, new CustomerName("Giuseppe Garibaldi", "Giuseppe", "Garibaldi", event.mustUseFirstAndLastName()), "peppino@garibaldi.com", null, Locale.ENGLISH);
waitingQueueManager.subscribe(event, new CustomerName("Nino Bixio", "Nino", "Bixio", event.mustUseFirstAndLastName()), "bixio@mille.org", null, Locale.ITALIAN);
assertEquals(2, (int) waitingQueueRepository.countWaitingPeople(event.getId()));
final int parallelism = 10;
List<Callable<Void>> calls = new ArrayList<>(parallelism);
ExecutorService executor = Executors.newFixedThreadPool(parallelism);
final Event eventF = event;
for (int i = 0; i < parallelism; i++) {
calls.add(() -> {
waitingQueueSubscriptionProcessor.distributeAvailableSeats(eventF);
return null;
});
}
executor.invokeAll(calls);
executor.shutdown();
while (!executor.awaitTermination(10, TimeUnit.MILLISECONDS)) {
}
assertEquals(18, ticketRepository.findFreeByEventId(event.getId()).size());
TicketCategoryModification tcm = new TicketCategoryModification(null, "default", TicketCategory.TicketAccessType.INHERIT, 10, new DateTimeModification(LocalDate.now(ClockProvider.clock()).minusDays(1), LocalTime.now(ClockProvider.clock())), new DateTimeModification(LocalDate.now(ClockProvider.clock()).plusDays(5), LocalTime.now(ClockProvider.clock())), DESCRIPTION, BigDecimal.TEN, false, "", true, null, null, null, null, null, 0, null, null, AlfioMetadata.empty());
eventManager.insertCategory(event.getId(), tcm, pair.getValue());
// System.err.println("------------------------------------------------");
executor = Executors.newFixedThreadPool(parallelism);
calls.clear();
for (int i = 0; i < parallelism; i++) {
calls.add(() -> {
waitingQueueSubscriptionProcessor.distributeAvailableSeats(eventF);
return null;
});
}
executor.invokeAll(calls);
executor.shutdown();
while (!executor.awaitTermination(10, TimeUnit.MILLISECONDS)) {
}
List<WaitingQueueSubscription> subscriptions = waitingQueueRepository.loadAll(event.getId());
assertEquals(2, subscriptions.stream().filter(w -> StringUtils.isNotBlank(w.getReservationId())).count());
assertTrue(subscriptions.stream().allMatch(w -> w.getStatus().equals(WaitingQueueSubscription.Status.PENDING)));
assertTrue(subscriptions.stream().allMatch(w -> w.getSubscriptionType().equals(WaitingQueueSubscription.Type.PRE_SALES)));
} finally {
if (event != null) {
eventManager.deleteEvent(event.getId(), UserManager.ADMIN_USERNAME);
}
configurationManager.deleteKey(ConfigurationKeys.ENABLE_PRE_REGISTRATION.name());
configurationManager.deleteKey(ConfigurationKeys.ENABLE_WAITING_QUEUE.name());
removeAdminUser(userRepository, authorityRepository);
}
}
use of alfio.model.WaitingQueueSubscription in project alf.io by alfio-event.
the class WaitingQueueSubscriptionProcessor method distributeAvailableSeats.
public void distributeAvailableSeats(Event event) {
var messageSource = messageSourceManager.getMessageSourceFor(event);
waitingQueueManager.distributeSeats(event).forEach(triple -> {
WaitingQueueSubscription subscription = triple.getLeft();
Locale locale = subscription.getLocale();
ZonedDateTime expiration = triple.getRight();
Organization organization = eventManager.loadOrganizerUsingSystemPrincipal(event);
String reservationId = createReservation(event, triple.getMiddle(), expiration, locale);
String subject = messageSource.getMessage("email-waiting-queue-acquired.subject", new Object[] { event.getDisplayName() }, locale);
String reservationUrl = ticketReservationManager.reservationUrl(reservationId, event);
Map<String, Object> model = TemplateResource.buildModelForWaitingQueueReservationEmail(organization, event, subscription, reservationUrl, expiration);
notificationManager.sendSimpleEmail(event, reservationId, subscription.getEmailAddress(), subject, () -> templateManager.renderTemplate(event, TemplateResource.WAITING_QUEUE_RESERVATION_EMAIL, model, locale));
waitingQueueRepository.flagAsPending(reservationId, subscription.getId());
});
}
use of alfio.model.WaitingQueueSubscription in project alf.io by alfio-event.
the class WaitingQueueManagerTest method processPreReservations.
@Test
void processPreReservations() {
Ticket ticket = mock(Ticket.class);
WaitingQueueSubscription subscription = mock(WaitingQueueSubscription.class);
when(subscription.isPreSales()).thenReturn(true);
when(eventRepository.countExistingTickets(eq(eventId))).thenReturn(10);
when(event.getZoneId()).thenReturn(ZoneId.systemDefault());
when(waitingQueueRepository.countWaitingPeople(eq(eventId))).thenReturn(1);
when(ticketRepository.countWaiting(eq(eventId))).thenReturn(0);
when(configurationManager.getFor(eq(ENABLE_PRE_REGISTRATION), any())).thenReturn(new ConfigurationManager.MaybeConfiguration(ENABLE_PRE_REGISTRATION, new ConfigurationKeyValuePathLevel(null, "true", null)));
when(configurationManager.getFor(eq(WAITING_QUEUE_RESERVATION_TIMEOUT), any())).thenReturn(new ConfigurationManager.MaybeConfiguration(WAITING_QUEUE_RESERVATION_TIMEOUT));
when(ticketRepository.selectWaitingTicketsForUpdate(eventId, Ticket.TicketStatus.PRE_RESERVED.name(), 1)).thenReturn(Collections.singletonList(ticket));
when(waitingQueueRepository.loadAllWaitingForUpdate(eventId)).thenReturn(Collections.singletonList(subscription));
when(waitingQueueRepository.loadWaiting(eventId, 1)).thenReturn(Collections.singletonList(subscription));
Stream<Triple<WaitingQueueSubscription, TicketReservationWithOptionalCodeModification, ZonedDateTime>> stream = manager.distributeSeats(event);
assertEquals(1L, stream.count());
verify(waitingQueueRepository).loadAllWaitingForUpdate(eq(eventId));
verify(waitingQueueRepository).loadWaiting(eq(eventId), eq(1));
verify(ticketRepository).countWaiting(eq(eventId));
verify(ticketRepository, never()).revertToFree(eq(eventId));
verify(ticketRepository).countPreReservedTickets(eq(eventId));
verify(ticketRepository).preReserveTicket(anyList());
verify(ticketRepository).selectWaitingTicketsForUpdate(eq(eventId), anyString(), anyInt());
}
Aggregations