consistency check order transaction

This commit is contained in:
2025-11-17 20:47:39 +01:00
parent 8614366254
commit 8729a18b43

View File

@@ -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<String> 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<Eintrittskarte> 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<Eintrittskarte> tickets1, List<Eintrittskarte> tickets2) {
List<Eintrittskarte> 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())));
}
}