Add transactional order creation API integration
Introduces saveAddOrder method in HttpService to POST orders and tickets transactionally. Refactors OrderComponent to use the new API for submitting orders and tickets in a single transaction, improving data consistency.
This commit is contained in:
@@ -44,6 +44,12 @@ export class HttpService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* POST /api/order-transaction/create */
|
||||||
|
saveAddOrder(req: {order:Bestellung, tickets:Eintrittskarte[]}): Observable<{order:Bestellung, tickets:Eintrittskarte[]}> {
|
||||||
|
return this.http.post<{order: Bestellung, tickets: Eintrittskarte[]}>(`${this.baseUrl}order-transaction/create`, req);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Eintrittskarte APIs */
|
/* Eintrittskarte APIs */
|
||||||
|
|
||||||
/* GET /api/eintrittskarte/{id} */
|
/* GET /api/eintrittskarte/{id} */
|
||||||
|
|||||||
@@ -161,37 +161,31 @@ export class OrderComponent {
|
|||||||
|
|
||||||
|
|
||||||
submitOrder(order: Bestellung, seats: Sitzplatz[], performance: Vorstellung, mode: SubmissionMode) {
|
submitOrder(order: Bestellung, seats: Sitzplatz[], performance: Vorstellung, mode: SubmissionMode) {
|
||||||
this.httpService.addOrder(order).pipe(
|
|
||||||
// Order erstellen
|
|
||||||
switchMap(createdOrder => {
|
|
||||||
|
|
||||||
// Tickets parallel erstellen
|
// Tickets anlegen
|
||||||
const ticketObservables = seats.map(seat => {
|
const tickets = seats.map(seat => {
|
||||||
const ticket = this.generateNewTicketObject(performance, seat, createdOrder);
|
return this.generateNewTicketObject(performance, seat, order);;
|
||||||
return this.httpService.addTicket(ticket);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Warten bis alles fertig sind
|
// Transaktionssicher Sitzplatzbuchung
|
||||||
return forkJoin(ticketObservables).pipe(
|
this.httpService.saveAddOrder({order, tickets}).pipe(
|
||||||
tap(createdTickets => {
|
tap(createdOrderAndTickets => {
|
||||||
// Success Handling
|
// Success Handling
|
||||||
if (mode === 'reservation') {
|
if (mode === 'reservation') {
|
||||||
this.orderState.set({
|
this.orderState.set({
|
||||||
status: 'reservation-success',
|
status: 'reservation-success',
|
||||||
order: createdOrder
|
order: createdOrderAndTickets.order
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.orderState.set({
|
this.orderState.set({
|
||||||
status: 'purchase-success',
|
status: 'purchase-success',
|
||||||
tickets: createdTickets
|
tickets: createdOrderAndTickets.tickets
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.selectedSeatsService.commit();
|
this.selectedSeatsService.commit();
|
||||||
this.loadingService.hide();
|
this.loadingService.hide();
|
||||||
this.showConfetti();
|
this.showConfetti();
|
||||||
})
|
|
||||||
);
|
|
||||||
}),
|
}),
|
||||||
catchError(err => {
|
catchError(err => {
|
||||||
// Error handling
|
// Error handling
|
||||||
|
|||||||
Reference in New Issue
Block a user