Skip to content

Commit

Permalink
#111 add server side validations
Browse files Browse the repository at this point in the history
  • Loading branch information
syjer committed May 22, 2017
1 parent a7300ae commit ad0b167
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 15 deletions.
2 changes: 1 addition & 1 deletion src/main/java/alfio/controller/EventController.java
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ public String reserveTicket(@PathVariable("eventName") String eventName,
return redirectToEvent;
}

return reservation.validate(bindingResult, ticketReservationManager, ticketCategoryDescriptionRepository, additionalServiceRepository, eventManager, event, locale)
return reservation.validate(bindingResult, ticketReservationManager, additionalServiceRepository, eventManager, event)
.map(selected -> {

Date expiration = DateUtils.addMinutes(new Date(), ticketReservationManager.getReservationTimeout(event));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public ResponseEntity<PublicEvent> showEvent(@PathVariable("shortName") String s
@RequestMapping(value = "events/{shortName}/reserve-tickets", method = RequestMethod.POST)
public ResponseEntity<Result<String>> reserveTickets(@PathVariable("shortName") String shortName, @RequestBody ReservationForm reservation, BindingResult bindingResult, Locale locale) {
return eventRepository.findOptionalByShortName(shortName).map(event -> {
Optional<String> reservationUrl = reservation.validate(bindingResult, ticketReservationManager, ticketCategoryDescriptionRepository, additionalServiceRepository, eventManager, event, locale).flatMap(selected -> {
Optional<String> reservationUrl = reservation.validate(bindingResult, ticketReservationManager, additionalServiceRepository, eventManager, event).flatMap(selected -> {
Date expiration = DateUtils.addMinutes(new Date(), ticketReservationManager.getReservationTimeout(event));
try {
String reservationId = ticketReservationManager.createTicketReservation(event,
Expand Down
17 changes: 6 additions & 11 deletions src/main/java/alfio/controller/form/ReservationForm.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,9 @@ private int additionalServicesSelectionCount(AdditionalServiceRepository additio

public Optional<Pair<List<TicketReservationWithOptionalCodeModification>, List<ASReservationWithOptionalCodeModification>>> validate(Errors bindingResult,
TicketReservationManager tickReservationManager,
TicketCategoryDescriptionRepository ticketCategoryDescriptionRepository,
AdditionalServiceRepository additionalServiceRepository,
EventManager eventManager,
Event event,
Locale locale) {
Event event) {
int selectionCount = ticketSelectionCount();
int additionalServicesCount = additionalServicesSelectionCount(additionalServiceRepository, event.getId());

Expand Down Expand Up @@ -118,15 +116,13 @@ public Optional<Pair<List<TicketReservationWithOptionalCodeModification>, List<A
});


//FIXME add here a new error code for handling supplement policy!
//

final boolean validAdditionalServiceSelected = additionalServices.stream().allMatch(asm -> {
AdditionalService as = eventManager.getAdditionalServiceById(asm.getAdditionalServiceId(), event.getId());
ZonedDateTime now = ZonedDateTime.now(event.getZoneId());
return as.getInception(event.getZoneId()).isBefore(now) &&
as.getExpiration(event.getZoneId()).isAfter(now) &&
(as.isFixPrice() || (!as.isFixPrice() && asm.getAmount() != null && asm.getAmount().compareTo(BigDecimal.ZERO) >= 0)) &&
asm.getQuantity() >= 0 &&
((as.isFixPrice() && asm.isQuantityValid(as, selectionCount)) || (!as.isFixPrice() && asm.getAmount() != null && asm.getAmount().compareTo(BigDecimal.ZERO) >= 0)) &&
OptionalWrapper.optionally(() -> eventManager.findEventByAdditionalService(as)).isPresent();
});

Expand All @@ -141,14 +137,13 @@ public Optional<Pair<List<TicketReservationWithOptionalCodeModification>, List<A
(trimmedCode) -> OptionalWrapper.optionally(() -> tickReservationManager.getSpecialPriceByCode(trimmedCode)));
//
final ZonedDateTime now = ZonedDateTime.now(event.getZoneId());
maxTicketsByTicketReservation.forEach((pair) -> validateCategory(bindingResult, tickReservationManager, ticketCategoryDescriptionRepository, eventManager, event, pair.getRight(), res, specialCode, now, pair.getLeft(), locale));
maxTicketsByTicketReservation.forEach((pair) -> validateCategory(bindingResult, tickReservationManager, eventManager, event, pair.getRight(), res, specialCode, now, pair.getLeft()));
return bindingResult.hasErrors() ? Optional.empty() : Optional.of(Pair.of(res, additionalServices.stream().map(as -> new ASReservationWithOptionalCodeModification(as, specialCode)).collect(Collectors.toList())));
}

private static void validateCategory(Errors bindingResult, TicketReservationManager tickReservationManager, TicketCategoryDescriptionRepository ticketCategoryDescriptionRepository, EventManager eventManager,
private static void validateCategory(Errors bindingResult, TicketReservationManager tickReservationManager, EventManager eventManager,
Event event, int maxAmountOfTicket, List<TicketReservationWithOptionalCodeModification> res,
Optional<SpecialPrice> specialCode, ZonedDateTime now, TicketReservationModification r,
Locale locale) {
Optional<SpecialPrice> specialCode, ZonedDateTime now, TicketReservationModification r) {
TicketCategory tc = eventManager.getTicketCategoryById(r.getTicketCategoryId(), event.getId());
SaleableTicketCategory ticketCategory = new SaleableTicketCategory(tc, "", now, event, tickReservationManager.countAvailableTickets(event, tc), maxAmountOfTicket, null);

Expand Down
18 changes: 16 additions & 2 deletions src/main/java/alfio/model/AdditionalService.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,22 @@ public enum AdditionalServiceType {
public enum SupplementPolicy {
MANDATORY_ONE_FOR_TICKET,
OPTIONAL_UNLIMITED_AMOUNT,
OPTIONAL_MAX_AMOUNT_PER_TICKET,
OPTIONAL_MAX_AMOUNT_PER_RESERVATION
OPTIONAL_MAX_AMOUNT_PER_TICKET {
@Override
public boolean isValid(int quantity, AdditionalService as, int ticketsCount) {
return quantity <= ticketsCount*as.getMaxQtyPerOrder();
}
},
OPTIONAL_MAX_AMOUNT_PER_RESERVATION {
@Override
public boolean isValid(int quantity, AdditionalService as, int selectionCount) {
return quantity < as.getMaxQtyPerOrder();
}
};

public boolean isValid(int quantity, AdditionalService as, int selectionCount) {
return true;
}
}

private final int id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
package alfio.model.modification;

import alfio.model.AdditionalService;
import lombok.Data;

import java.math.BigDecimal;
Expand All @@ -25,4 +26,12 @@ public class AdditionalServiceReservationModification {
private Integer additionalServiceId;
private BigDecimal amount;
private Integer quantity = 1;

public boolean isQuantityValid(AdditionalService as, int selectionCount) {
if(quantity != null && as.getSupplementPolicy() != null) {
return as.getSupplementPolicy().isValid(quantity, as, selectionCount);
} else {
return true;
}
}
}

0 comments on commit ad0b167

Please sign in to comment.