60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { prisma } from '@/lib/db';
|
|
import { getSessionUser } from '@/lib/auth';
|
|
|
|
export const revalidate = 0;
|
|
|
|
export async function GET() {
|
|
try {
|
|
const user = await getSessionUser();
|
|
if (!user) {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
|
|
const bookings = await prisma.booking.findMany({
|
|
where: {
|
|
userId: user.userId,
|
|
},
|
|
include: {
|
|
seats: true,
|
|
schedule: {
|
|
include: {
|
|
route: true,
|
|
},
|
|
},
|
|
},
|
|
orderBy: {
|
|
createdAt: 'desc',
|
|
},
|
|
});
|
|
|
|
const serializedBookings = bookings.map((booking) => ({
|
|
id: booking.id,
|
|
bookingCode: booking.bookingCode,
|
|
passengerName: booking.passengerName,
|
|
passengerEmail: booking.passengerEmail,
|
|
passengerPhone: booking.passengerPhone,
|
|
totalPrice: Number(booking.totalPrice),
|
|
status: booking.status,
|
|
paymentMethod: booking.paymentMethod,
|
|
paymentTime: booking.paymentTime ? booking.paymentTime.toISOString() : null,
|
|
createdAt: booking.createdAt.toISOString(),
|
|
seats: booking.seats.map((s) => s.seatNumber),
|
|
schedule: {
|
|
departureTime: booking.schedule.departureTime.toISOString(),
|
|
arrivalTime: booking.schedule.arrivalTime.toISOString(),
|
|
vehicleType: booking.schedule.vehicleType,
|
|
departureCity: booking.schedule.route.departureCity,
|
|
arrivalCity: booking.schedule.route.arrivalCity,
|
|
durationMinutes: booking.schedule.route.durationMinutes,
|
|
price: Number(booking.schedule.price),
|
|
},
|
|
}));
|
|
|
|
return NextResponse.json({ bookings: serializedBookings });
|
|
} catch (error) {
|
|
console.error('Fetch user bookings error:', error);
|
|
return NextResponse.json({ error: 'Gagal mengambil data pemesanan.' }, { status: 500 });
|
|
}
|
|
}
|