Skip to content

Commit

Permalink
additional work for handling locales #657
Browse files Browse the repository at this point in the history
  • Loading branch information
syjer committed Jun 20, 2019
1 parent 991db73 commit 688d39c
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 59 deletions.
18 changes: 9 additions & 9 deletions src/main/java/alfio/controller/api/support/TicketHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,18 +78,18 @@ public Optional<Triple<ValidationResult, Event, Ticket>> assignTicket(String eve
String ticketIdentifier,
UpdateTicketOwnerForm updateTicketOwner,
Optional<Errors> bindingResult,
Locale locale,
Locale fallbackLocale,
Optional<UserDetails> userDetails,
boolean addPrefix) {

Optional<Triple<ValidationResult, Event, Ticket>> triple = ticketReservationManager.fetchComplete(eventName, ticketIdentifier)
.map(result -> assignTicket(updateTicketOwner, bindingResult, locale, userDetails, result, addPrefix ? "tickets["+ticketIdentifier+"]" : ""));
.map(result -> assignTicket(updateTicketOwner, bindingResult, fallbackLocale, userDetails, result, addPrefix ? "tickets["+ticketIdentifier+"]" : ""));
return triple;
}

private Triple<ValidationResult, Event, Ticket> assignTicket(UpdateTicketOwnerForm updateTicketOwner,
Optional<Errors> bindingResult,
Locale locale,
Locale fallbackLocale,
Optional<UserDetails> userDetails,
Triple<Event, TicketReservation, Ticket> result,
String formPrefix) {
Expand Down Expand Up @@ -117,7 +117,7 @@ private Triple<ValidationResult, Event, Ticket> assignTicket(UpdateTicketOwnerFo
Validator.AdvancedValidationContext context = new Validator.AdvancedValidationContext(updateTicketOwner, fieldConf, t.getCategoryId(), t.getUuid(), formPrefix);
ValidationResult validationResult = Validator.validateTicketAssignment(updateTicketOwner, ticketFieldFilterer.getFieldsForTicket(t.getUuid()), bindingResult, event, formPrefix, sameCountryValidator)
.or(Validator.performAdvancedValidation(advancedValidator, context, bindingResult.orElse(null)))
.ifSuccess(() -> updateTicketOwner(updateTicketOwner, locale, t, event, ticketReservation, userDetails));
.ifSuccess(() -> updateTicketOwner(updateTicketOwner, fallbackLocale, t, event, ticketReservation, userDetails));
return Triple.of(validationResult, event, ticketRepository.findByUUID(t.getUuid()));
}

Expand All @@ -129,12 +129,12 @@ public Optional<Triple<ValidationResult, Event, Ticket>> preAssignTicket(String
String ticketIdentifier,
UpdateTicketOwnerForm updateTicketOwner,
Optional<Errors> bindingResult,
Locale locale,
Locale fallbackLocale,
Optional<UserDetails> userDetails) {

Optional<Triple<ValidationResult, Event, Ticket>> triple = ticketReservationManager.from(eventName, reservationId, ticketIdentifier)
.filter(temp -> PENDING_RESERVATION_STATUSES.contains(temp.getMiddle().getStatus()) && temp.getRight().getStatus() == Ticket.TicketStatus.PENDING)
.map(result -> assignTicket(updateTicketOwner, bindingResult, locale, userDetails, result, "tickets["+ticketIdentifier+"]"));
.map(result -> assignTicket(updateTicketOwner, bindingResult, fallbackLocale, userDetails, result, "tickets["+ticketIdentifier+"]"));
return triple;
}

Expand Down Expand Up @@ -200,13 +200,13 @@ private static List<Pair<String, String>> mapISOCountries(Stream<String> isoCoun
.collect(Collectors.toList());
}

private void updateTicketOwner(UpdateTicketOwnerForm updateTicketOwner, Locale locale, Ticket t, Event event, TicketReservation ticketReservation, Optional<UserDetails> userDetails) {
private void updateTicketOwner(UpdateTicketOwnerForm updateTicketOwner, Locale fallBackLocale, Ticket t, Event event, TicketReservation ticketReservation, Optional<UserDetails> userDetails) {
Locale language = Optional.ofNullable(updateTicketOwner.getUserLanguage())
.filter(StringUtils::isNotBlank)
.map(LocaleUtil::forLanguageTag)
.orElse(locale);
.orElse(fallBackLocale);
TicketCategory category = ticketCategoryRepository.getById(t.getCategoryId());
var ticketLanguage = LocaleUtil.getTicketLanguage(t, locale);
var ticketLanguage = LocaleUtil.getTicketLanguage(t, fallBackLocale);
ticketReservationManager.updateTicketOwner(t, language, event, updateTicketOwner,
getConfirmationTextBuilder(ticketLanguage, event, ticketReservation, t, category),
getOwnerChangeTextBuilder(ticketLanguage, t, event),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,17 +408,28 @@ public void getCalendar(@PathVariable("eventName") String eventName,
}), () -> response.setStatus(HttpServletResponse.SC_NOT_FOUND));
}

/**
* Create a new reservation.
*
* @param eventName
* @param lang
* @param reservation
* @param bindingResult
* @param request
* @return
*/
@PostMapping(value = "event/{eventName}/reserve-tickets")
public ResponseEntity<ValidatedResponse<String>> reserveTicket(@PathVariable("eventName") String eventName,
@RequestParam(required = false, name = "lang") String lang,
@RequestBody ReservationForm reservation,
BindingResult bindingResult,
ServletWebRequest request) {
public ResponseEntity<ValidatedResponse<String>> reserveTickets(@PathVariable("eventName") String eventName,
@RequestParam("lang") String lang,
@RequestBody ReservationForm reservation,
BindingResult bindingResult,
ServletWebRequest request) {



Optional<ResponseEntity<ValidatedResponse<String>>> r = eventRepository.findOptionalByShortName(eventName).map(event -> {

Locale locale = LocaleUtil.forLanguageTag(lang, event);

Optional<ValidatedResponse<Pair<Optional<SpecialPrice>, Optional<PromoCodeDiscount>>>> codeCheck = Optional.empty();

Expand All @@ -444,7 +455,7 @@ public ResponseEntity<ValidatedResponse<String>> reserveTicket(@PathVariable("ev
selected.getLeft(), selected.getRight(), expiration,
specialPrice,
promoCodeDiscount,
LocaleUtil.forLanguageTag(lang), false);
locale, false);
return Optional.of(reservationId);
} catch (TicketReservationManager.NotEnoughTicketsException nete) {
bindingResult.reject(ErrorsCode.STEP_1_NOT_ENOUGH_TICKETS);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,8 @@ public ResponseEntity<Boolean> cancelPendingReservation(@PathVariable("eventName
}

@PostMapping("/event/{eventName}/reservation/{reservationId}/back-to-booking")
public ResponseEntity<Boolean> backToBook(@PathVariable("eventName") String eventName,
@PathVariable("reservationId") String reservationId) {
public ResponseEntity<Boolean> backToBooking(@PathVariable("eventName") String eventName,
@PathVariable("reservationId") String reservationId) {

getReservationWithPendingStatus(eventName, reservationId)
.ifPresent(er -> ticketReservationRepository.updateValidationStatus(reservationId, false));
Expand All @@ -256,19 +256,19 @@ public ResponseEntity<Boolean> backToBook(@PathVariable("eventName") String even
}

@PostMapping("/event/{eventName}/reservation/{reservationId}")
public ResponseEntity<ValidatedResponse<ReservationPaymentResult>> handleReservation(@PathVariable("eventName") String eventName,
@PathVariable("reservationId") String reservationId,
@RequestParam(required = false, name = "lang") String lang,
@RequestBody PaymentForm paymentForm,
BindingResult bindingResult,
HttpServletRequest request,
HttpSession session) {
public ResponseEntity<ValidatedResponse<ReservationPaymentResult>> confirmOverview(@PathVariable("eventName") String eventName,
@PathVariable("reservationId") String reservationId,
@RequestParam("lang") String lang,
@RequestBody PaymentForm paymentForm,
BindingResult bindingResult,
HttpServletRequest request,
HttpSession session) {

return getReservation(eventName, reservationId).map(er -> {

var event = er.getLeft();
var ticketReservation = er.getRight();
var locale = LocaleUtil.forLanguageTag(lang);
var locale = LocaleUtil.forLanguageTag(lang, event);

if (!ticketReservation.getValidity().after(new Date())) {
bindingResult.reject(ErrorsCode.STEP_2_ORDER_EXPIRED);
Expand Down Expand Up @@ -342,15 +342,15 @@ private static ResponseEntity<ValidatedResponse<ReservationPaymentResult>> build
@PostMapping("/event/{eventName}/reservation/{reservationId}/validate-to-overview")
public ResponseEntity<ValidatedResponse<Boolean>> validateToOverview(@PathVariable("eventName") String eventName,
@PathVariable("reservationId") String reservationId,
@RequestParam(required = false, name = "lang") String lang,
@RequestParam("lang") String lang,
@RequestBody ContactAndTicketsForm contactAndTicketsForm,
BindingResult bindingResult) {


return getReservationWithPendingStatus(eventName, reservationId).map(er -> {
var event = er.getLeft();
var reservation = er.getRight();
var locale = LocaleUtil.forLanguageTag(lang);
var locale = LocaleUtil.forLanguageTag(lang, event);
final TotalPrice reservationCost = ticketReservationManager.totalReservationCostWithVAT(reservation.withVatStatus(event.getVatStatus()));
boolean forceAssignment = configurationManager.getFor(event, FORCE_TICKET_OWNER_ASSIGNMENT_AT_RESERVATION).getValueAsBooleanOrDefault(false);

Expand Down Expand Up @@ -490,13 +490,13 @@ private Optional<Pair<Event, TicketReservation>> getReservationWithPendingStatus
@PostMapping("/event/{eventName}/reservation/{reservationId}/re-send-email")
public ResponseEntity<Boolean> reSendReservationConfirmationEmail(@PathVariable("eventName") String eventName,
@PathVariable("reservationId") String reservationId,
@RequestParam(required = false, name = "lang") String lang) {
@RequestParam("lang") String lang) {



var res = eventRepository.findOptionalByShortName(eventName).map(event ->
ticketReservationManager.findById(reservationId).map(ticketReservation -> {
ticketReservationManager.sendConfirmationEmail(event, ticketReservation, LocaleUtil.forLanguageTag(lang));
ticketReservationManager.sendConfirmationEmail(event, ticketReservation, LocaleUtil.forLanguageTag(lang, event));
return true;
}).orElse(false)
).orElse(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public void showQrCode(@PathVariable("eventName") String eventName,
@GetMapping("/event/{eventName}/ticket/{ticketIdentifier}/download-ticket")
public void generateTicketPdf(@PathVariable("eventName") String eventName,
@PathVariable("ticketIdentifier") String ticketIdentifier,
@RequestParam(required = false, name = "lang") String lang, HttpServletResponse response) {
HttpServletResponse response) {

ticketReservationManager.fetchCompleteAndAssigned(eventName, ticketIdentifier).ifPresentOrElse(data -> {

Expand All @@ -107,7 +107,7 @@ public void generateTicketPdf(@PathVariable("eventName") String eventName,
TicketCategory ticketCategory = ticketCategoryRepository.getByIdAndActive(ticket.getCategoryId(), event.getId());
Organization organization = organizationRepository.getById(event.getOrganizationId());
String reservationID = ticketReservationManager.getShortReservationID(event, ticketReservation);
TemplateProcessor.renderPDFTicket(LocaleUtil.getTicketLanguage(ticket, LocaleUtil.forLanguageTag(lang)), event, ticketReservation,
TemplateProcessor.renderPDFTicket(LocaleUtil.getTicketLanguage(ticket, LocaleUtil.forLanguageTag(ticketReservation.getUserLanguage(), event)), event, ticketReservation,
ticket, ticketCategory, organization,
templateManager, fileUploadManager,
reservationID, os, ticketHelper.buildRetrieveFieldValuesFunction(), extensionManager);
Expand All @@ -125,15 +125,14 @@ public void generateTicketPdf(@PathVariable("eventName") String eventName,

@PostMapping("/event/{eventName}/ticket/{ticketIdentifier}/send-ticket-by-email")
public ResponseEntity<Boolean> sendTicketByEmail(@PathVariable("eventName") String eventName,
@PathVariable("ticketIdentifier") String ticketIdentifier,
@RequestParam(required = false, name = "lang") String lang) {
@PathVariable("ticketIdentifier") String ticketIdentifier) {

return ticketReservationManager.fetchCompleteAndAssigned(eventName, ticketIdentifier).map(data -> {
Ticket ticket = data.getRight();
Event event = data.getLeft();
Locale locale = LocaleUtil.getTicketLanguage(ticket, LocaleUtil.forLanguageTag(lang));

TicketReservation reservation = data.getMiddle();
Ticket ticket = data.getRight();

Locale locale = LocaleUtil.getTicketLanguage(ticket, LocaleUtil.forLanguageTag(reservation.getUserLanguage(), event));
Organization organization = organizationRepository.getById(event.getOrganizationId());
TicketCategory category = ticketCategoryRepository.getById(ticket.getCategoryId());
notificationManager.sendTicketByEmail(ticket,
Expand Down Expand Up @@ -210,26 +209,32 @@ public ResponseEntity<TicketInfo> getTicketInfo(@PathVariable("eventName") Strin
}

@PutMapping("/event/{eventName}/ticket/{ticketIdentifier}")
public ValidatedResponse<Boolean> updateTicketInfo(@PathVariable("eventName") String eventName,
@PathVariable("ticketIdentifier") String ticketIdentifier,
@RequestBody UpdateTicketOwnerForm updateTicketOwner,
BindingResult bindingResult,
@RequestParam(required = false, name = "lang") String lang,
Authentication authentication) {
public ResponseEntity<ValidatedResponse<Boolean>> updateTicketInfo(@PathVariable("eventName") String eventName,
@PathVariable("ticketIdentifier") String ticketIdentifier,
@RequestBody UpdateTicketOwnerForm updateTicketOwner,
BindingResult bindingResult,
Authentication authentication) {

var a = ticketReservationManager.fetchCompleteAndAssigned(eventName, ticketIdentifier);
if(a.isEmpty()) {
return ResponseEntity.notFound().build();
}

Optional<UserDetails> userDetails = Optional.ofNullable(authentication)
.map(Authentication::getPrincipal)
.filter(UserDetails.class::isInstance)
.map(UserDetails.class::cast);

Locale locale = LocaleUtil.forLanguageTag(a.get().getMiddle().getUserLanguage(), a.get().getLeft());

var assignmentResult = ticketHelper.assignTicket(eventName,
ticketIdentifier,
updateTicketOwner,
Optional.of(bindingResult),
LocaleUtil.forLanguageTag(lang),
locale,
userDetails, false);

return assignmentResult.map(r -> new ValidatedResponse<>(r.getLeft(), r.getLeft().isSuccess())).orElseThrow(IllegalStateException::new);
return assignmentResult.map(r -> ResponseEntity.ok(new ValidatedResponse<>(r.getLeft(), r.getLeft().isSuccess()))).orElseThrow(IllegalStateException::new);
}

}
10 changes: 8 additions & 2 deletions src/main/java/alfio/util/LocaleUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
package alfio.util;

import alfio.model.Event;
import alfio.model.Ticket;
import org.apache.commons.lang3.StringUtils;

Expand All @@ -25,11 +26,11 @@
public final class LocaleUtil {
private LocaleUtil() {}

public static Locale getTicketLanguage(Ticket t, Locale locale) {
public static Locale getTicketLanguage(Ticket t, Locale fallbackLocale) {
return Optional.ofNullable(t.getUserLanguage())
.filter(StringUtils::isNotBlank)
.map(Locale::forLanguageTag)
.orElse(locale);
.orElse(fallbackLocale);
}

public static Locale forLanguageTag(String lang) {
Expand All @@ -39,4 +40,9 @@ public static Locale forLanguageTag(String lang) {
return Locale.forLanguageTag(lang);
}
}

public static Locale forLanguageTag(String lang, Event event) {
//FIXME check if lang is present in event
return forLanguageTag(lang);
}
}
Loading

0 comments on commit 688d39c

Please sign in to comment.