✈️

SkyBook

Powered by Durable Endpoints

🔍 Search Flights

📋 Booking Progress

✈️Search Flights
🎫Reserve Flight
💳Process Payment
Confirm Booking
GET /api/booking
Durable Endpoint
1export const GET = inngest.endpoint(async (req: NextRequest) => {
2 const { bookingId, origin, destination, date } = parseRequest(req);
3
4 // Step 1: Search across multiple airline APIs
5 const flights = await step.run("search-availability", async () => {
6 const [united, delta, american] = await Promise.all([
7 unitedAPI.searchFlights(origin, destination, date),
8 deltaAPI.searchFlights(origin, destination, date),
9 americanAPI.searchFlights(origin, destination, date),
10 ]);
11 const allFlights = [...united, ...delta, ...american];
12 return allFlights.filter((f) => f.available).sort((a, b) => a.price - b.price);
13 });
14
15 // Step 2: Reserve seat with airline's inventory system
16 const reservation = await step.run("reserve-flight", async () => {
17 const best = flights[0];
18 const hold = await best.airline.createHold({
19 flightId: best.id,
20 seatClass: "economy",
21 expiresIn: "15m",
22 });
23 const seat = await best.airline.assignSeat(hold.id, { preference: "window" });
24 return { ...hold, seat: seat.number, airline: best.airline.name };
25 });
26
27 // Step 3: Process payment through gateway
28 const payment = await step.run("process-payment", async () => {
29 const fraud = await fraudService.checkTransaction(bookingId, reservation.price);
30 if (fraud.score > 0.8) throw new Error("Transaction flagged");
31 const charge = await stripe.charges.create({
32 amount: reservation.price * 100,
33 currency: "usd",
34 source: bookingId,
35 });
36 return { transactionId: charge.id, amount: reservation.price };
37 });
38
39 // Step 4: Finalize booking across systems
40 const confirmation = await step.run("confirm-booking", async () => {
41 const ticket = await reservation.airline.issueTicket(reservation.holdId);
42 await loyaltyService.creditMiles(bookingId, reservation.distance);
43 await emailService.send({ to: bookingId, template: "confirmation", data: ticket });
44 return { pnr: ticket.pnr, eTicket: ticket.number };
45 });
46
47 return Response.json({ success: true, bookingId, confirmation });
48});
Execution Log
Waiting for booking request...