From 8729a18b43bee97fe752d2d6caa7689a1f8cc49a Mon Sep 17 00:00:00 2001 From: Lennart Heinrich Date: Mon, 17 Nov 2025 20:47:39 +0100 Subject: [PATCH] consistency check order transaction --- .../backend/endpoint/OrderTx.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/infinimotion/backend/endpoint/OrderTx.java b/src/main/java/de/infinimotion/backend/endpoint/OrderTx.java index 6a6efa2..4470427 100644 --- a/src/main/java/de/infinimotion/backend/endpoint/OrderTx.java +++ b/src/main/java/de/infinimotion/backend/endpoint/OrderTx.java @@ -6,7 +6,9 @@ import jakarta.inject.Inject; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; +import java.util.LinkedList; import java.util.List; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; @ApplicationScoped @@ -19,7 +21,20 @@ public class OrderTx { @POST @Path("/create") public OrderTransaction createOrderTransaction(OrderTransaction orderTransaction) throws Exception { - CommandWrapper orderRequest = new CommandCreateBestellung(orderTransaction.getOrder()).serialize().generateIds(); + int showId = orderTransaction.getTickets().stream().findAny().map(Eintrittskarte::getShow).map(Vorstellung::getId).orElse(-1); + if (orderTransaction.getTickets().stream().anyMatch(ticket -> ticket.getShow().getId() != showId)) { + throw new IllegalArgumentException("tickets for different show ids"); + } + + List notCancelledTicketsFilter = List.of("eq;show.id;int;" + showId, "null;order.cancelled;date;1970-01-01T00:00:00"); + CommandWrapper listTicketsRequest = new CommandListEintrittskarte(notCancelledTicketsFilter).serialize().generateIds(); + List listTickets = CommandListEintrittskarteResponse.deserialize(requester.request(listTicketsRequest)).getList(); + if (checkDuplicateTickets(listTickets, orderTransaction.getTickets())) { + requester.request(new CommandRollback().serialize().tx(listTicketsRequest)); + throw new IllegalArgumentException("duplicate: ticket for already reserved/booked seat"); + } + + CommandWrapper orderRequest = new CommandCreateBestellung(orderTransaction.getOrder()).serialize().tx(listTicketsRequest); Bestellung orderResponse = CommandCreateBestellungResponse.deserialize(requester.request(orderRequest)).getBestellung(); AtomicInteger countDown = new AtomicInteger(orderTransaction.getTickets().size()); @@ -41,4 +56,12 @@ public class OrderTx { return orderTransaction; } + private boolean checkDuplicateTickets(List tickets1, List tickets2) { + List tickets = new LinkedList<>(tickets1); + tickets.addAll(tickets2); + return tickets.stream().anyMatch(ticket -> tickets.stream() + .anyMatch(otherTicket -> + ticket != otherTicket && Objects.equals(ticket.getSeat().getId(), otherTicket.getSeat().getId()))); + } + }