75 lines
1.9 KiB
TypeScript
75 lines
1.9 KiB
TypeScript
import { prisma } from "@/lib/prisma";
|
|
import { Prisma } from "@/app/generated/prisma/client";
|
|
|
|
export const bookingRepo = {
|
|
async findById(id: string) {
|
|
return prisma.booking.findUnique({ where: { id } });
|
|
},
|
|
|
|
async findByParticipantId(participantId: string) {
|
|
return prisma.booking.findUnique({
|
|
where: { participantId },
|
|
include: { payments: { orderBy: { createdAt: "desc" } } },
|
|
});
|
|
},
|
|
|
|
async findByTripAndUser(tripId: string, userId: string) {
|
|
return prisma.booking.findUnique({
|
|
where: { tripId_userId: { tripId, userId } },
|
|
include: { payments: { orderBy: { createdAt: "desc" } } },
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Daftar booking di trip ini yang masih menunggu konfirmasi pembayaran
|
|
* dari organizer (Payment MANUAL status AWAITING).
|
|
*/
|
|
async findAwaitingManualConfirmation(tripId: string) {
|
|
return prisma.booking.findMany({
|
|
where: {
|
|
tripId,
|
|
status: "AWAITING_PAY",
|
|
payments: {
|
|
some: { provider: "MANUAL", status: "AWAITING" },
|
|
},
|
|
},
|
|
include: {
|
|
participant: true,
|
|
user: { select: { id: true, name: true, image: true } },
|
|
payments: {
|
|
where: { provider: "MANUAL", status: "AWAITING" },
|
|
orderBy: { createdAt: "desc" },
|
|
take: 1,
|
|
},
|
|
},
|
|
orderBy: { updatedAt: "asc" },
|
|
});
|
|
},
|
|
|
|
async create(
|
|
data: Pick<
|
|
Prisma.BookingUncheckedCreateInput,
|
|
"tripId" | "userId" | "participantId" | "amount" | "status"
|
|
>
|
|
) {
|
|
return prisma.booking.create({ data });
|
|
},
|
|
|
|
async updateStatus(id: string, status: Prisma.BookingUpdateInput["status"]) {
|
|
return prisma.booking.update({
|
|
where: { id },
|
|
data: { status },
|
|
});
|
|
},
|
|
|
|
async updateStatusByParticipantId(
|
|
participantId: string,
|
|
status: Prisma.BookingUpdateInput["status"]
|
|
) {
|
|
return prisma.booking.updateMany({
|
|
where: { participantId },
|
|
data: { status },
|
|
});
|
|
},
|
|
};
|