consistency check order transaction
This commit is contained in:
@@ -6,7 +6,9 @@ import jakarta.inject.Inject;
|
|||||||
import jakarta.ws.rs.POST;
|
import jakarta.ws.rs.POST;
|
||||||
import jakarta.ws.rs.Path;
|
import jakarta.ws.rs.Path;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
@ApplicationScoped
|
@ApplicationScoped
|
||||||
@@ -19,7 +21,20 @@ public class OrderTx {
|
|||||||
@POST
|
@POST
|
||||||
@Path("/create")
|
@Path("/create")
|
||||||
public OrderTransaction createOrderTransaction(OrderTransaction orderTransaction) throws Exception {
|
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();
|
Bestellung orderResponse = CommandCreateBestellungResponse.deserialize(requester.request(orderRequest)).getBestellung();
|
||||||
|
|
||||||
AtomicInteger countDown = new AtomicInteger(orderTransaction.getTickets().size());
|
AtomicInteger countDown = new AtomicInteger(orderTransaction.getTickets().size());
|
||||||
@@ -41,4 +56,12 @@ public class OrderTx {
|
|||||||
return orderTransaction;
|
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())));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user