Powered by Durable Endpoints
GET /api/booking1export const GET = inngest.endpoint(async (req: NextRequest) => {2 const { bookingId, origin, destination, date } = parseRequest(req);34 // Step 1: Search across multiple airline APIs5 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 });1415 // Step 2: Reserve seat with airline's inventory system16 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 });2627 // Step 3: Process payment through gateway28 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 });3839 // Step 4: Finalize booking across systems40 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 });4647 return Response.json({ success: true, bookingId, confirmation });48});