"use server"; import { getServerSession } from "next-auth"; import { authOptions } from "@/lib/auth"; import { tripService } from "@/server/services/trip.service"; import { paymentService } from "@/server/services/payment.service"; import { bookingService } from "@/server/services/booking.service"; import { refundService } from "@/server/services/refund.service"; import { revalidatePath } from "next/cache"; export async function markParticipantPaidAction(tripId: string) { const session = await getServerSession(authOptions); if (!session?.user) { return { error: "Kamu harus login terlebih dahulu" }; } try { await tripService.markParticipantPayment(tripId, session.user.id); revalidatePath(`/trips/${tripId}`); revalidatePath("/trips"); revalidatePath("/"); revalidatePath("/profile"); return { success: true }; } catch (err) { return { error: (err as Error).message }; } } export type StartMidtransResponse = | { error: string } | { success: true; snapToken: string; snapJsUrl: string; clientKey: string; }; /** * Mulai pembayaran online via Midtrans untuk trip tertentu. Resolve booking * dari (tripId, userId) supaya client tidak perlu tahu bookingId. */ export async function startMidtransPaymentAction( tripId: string ): Promise { const session = await getServerSession(authOptions); if (!session?.user) { return { error: "Kamu harus login terlebih dahulu" }; } try { const booking = await bookingService.getByTripAndUser( tripId, session.user.id ); if (!booking || booking.status === "CANCELLED") { return { error: "Kamu tidak terdaftar di trip ini" }; } const result = await paymentService.startMidtransPayment( booking.id, session.user.id ); return { success: true, snapToken: result.snapToken, snapJsUrl: result.snapJsUrl, clientKey: result.clientKey, }; } catch (err) { return { error: (err as Error).message }; } } export async function confirmParticipantPaymentAction( tripId: string, participantId: string ) { const session = await getServerSession(authOptions); if (!session?.user) { return { error: "Kamu harus login terlebih dahulu" }; } try { await tripService.confirmParticipantPayment( tripId, participantId, session.user.id ); revalidatePath(`/trips/${tripId}`); revalidatePath("/trips"); revalidatePath("/"); revalidatePath("/profile"); return { success: true }; } catch (err) { return { error: (err as Error).message }; } } /** * Peserta cancel booking PAID dengan refund request. Server menghitung * nominal refund pakai policy default (lib/refund-policy.ts) — client * cuma kirim bookingId untuk cegah tampering. */ export async function cancelBookingWithRefundAction(tripId: string) { const session = await getServerSession(authOptions); if (!session?.user) { return { error: "Kamu harus login terlebih dahulu" }; } try { const booking = await bookingService.getByTripAndUser( tripId, session.user.id ); if (!booking) { return { error: "Kamu tidak terdaftar di trip ini" }; } const result = await refundService.requestUserCancellation({ bookingId: booking.id, userId: session.user.id, }); revalidatePath(`/trips/${tripId}`); revalidatePath("/trips"); revalidatePath("/"); revalidatePath("/profile"); revalidatePath("/admin/refunds"); return { success: true as const, kind: result.kind, refundAmount: result.refundAmount, days: result.days, }; } catch (err) { return { error: (err as Error).message }; } }