@RequestMapping(value = "/events/{eventName}/categories-containing-tickets", method = GET) public List<TicketCategoryModification> getCategoriesWithTickets( @PathVariable("eventName") String eventName, Principal principal) { Event event = loadEvent(eventName, principal); return eventStatisticsManager .loadTicketCategoriesWithStats(event) .stream() .filter(tc -> !tc.getTickets().isEmpty()) .map( tc -> TicketCategoryModification.fromTicketCategory( tc.getTicketCategory(), ticketCategoryDescriptionRepository.findByTicketCategoryId(tc.getId()), event.getZoneId())) .collect(Collectors.toList()); }
@RequestMapping("/events/{eventName}/export.csv") public void downloadAllTicketsCSV( @PathVariable("eventName") String eventName, HttpServletRequest request, HttpServletResponse response, Principal principal) throws IOException { List<String> fields = Arrays.asList( Optional.ofNullable(request.getParameterValues("fields")).orElse(new String[] {})); Event event = loadEvent(eventName, principal); Map<Integer, TicketCategory> categoriesMap = eventManager .loadTicketCategories(event) .stream() .collect(Collectors.toMap(TicketCategory::getId, Function.identity())); ZoneId eventZoneId = event.getZoneId(); Predicate<String> contains = FIXED_FIELDS::contains; response.setContentType("text/csv;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=" + eventName + "-export.csv"); try (ServletOutputStream out = response.getOutputStream(); CSVWriter writer = new CSVWriter(new OutputStreamWriter(out))) { for (int marker : BOM_MARKERS) { // UGLY-MODE_ON: specify that the file is written in UTF-8 with BOM, thanks // to alexr http://stackoverflow.com/a/4192897 out.write(marker); } writer.writeNext(fields.toArray(new String[fields.size()])); eventManager .findAllConfirmedTickets(eventName, principal.getName()) .stream() .map( t -> { List<String> line = new ArrayList<>(); if (fields.contains("ID")) { line.add(t.getUuid()); } if (fields.contains("creation")) { line.add(t.getCreation().withZoneSameInstant(eventZoneId).toString()); } if (fields.contains("category")) { line.add(categoriesMap.get(t.getCategoryId()).getName()); } if (fields.contains("event")) { line.add(eventName); } if (fields.contains("status")) { line.add(t.getStatus().toString()); } if (fields.contains("originalPrice")) { line.add(MonetaryUtil.centsToUnit(t.getSrcPriceCts()).toString()); } if (fields.contains("paidPrice")) { line.add(MonetaryUtil.centsToUnit(t.getFinalPriceCts()).toString()); } if (fields.contains("discount")) { line.add(MonetaryUtil.centsToUnit(t.getDiscountCts()).toString()); } if (fields.contains("vat")) { line.add(MonetaryUtil.centsToUnit(t.getVatCts()).toString()); } if (fields.contains("reservationID")) { line.add(t.getTicketsReservationId()); } if (fields.contains("Full Name")) { line.add(t.getFullName()); } if (fields.contains("First Name")) { line.add(t.getFirstName()); } if (fields.contains("Last Name")) { line.add(t.getLastName()); } if (fields.contains("E-Mail")) { line.add(t.getEmail()); } if (fields.contains("locked")) { line.add(String.valueOf(t.getLockedAssignment())); } if (fields.contains("Language")) { line.add(String.valueOf(t.getUserLanguage())); } // obviously not optimized Map<String, String> additionalValues = ticketFieldRepository.findAllValuesForTicketId(t.getId()); fields .stream() .filter(contains.negate()) .forEachOrdered( field -> { line.add(additionalValues.getOrDefault(field, "").replaceAll("\"", "")); }); return line.toArray(new String[line.size()]); }) .forEachOrdered(writer::writeNext); writer.flush(); out.flush(); } }