kyc user and upload partial update encrypt nik and picture

This commit is contained in:
2026-04-27 21:48:24 +07:00
parent b31fe675ae
commit a92b4a8fd9
51 changed files with 5180 additions and 452 deletions
+16
View File
@@ -0,0 +1,16 @@
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Admin · Review Verifikasi Organizer",
description: "Halaman admin untuk meninjau pengajuan verifikasi organizer.",
alternates: { canonical: "/admin/verifications" },
robots: { index: false, follow: false },
};
export default function AdminVerificationsLayout({
children,
}: {
children: React.ReactNode;
}) {
return children;
}
+79
View File
@@ -0,0 +1,79 @@
import { redirect } from "next/navigation";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import { isAdminEmail } from "@/lib/admin";
import { organizerRepo } from "@/server/repositories/organizer.repo";
import { ReviewCard } from "@/features/organizer/components/review-card";
type Tab = "PENDING" | "APPROVED" | "REJECTED";
interface PageProps {
searchParams: Promise<{ tab?: string }>;
}
export default async function AdminVerificationsPage({ searchParams }: PageProps) {
const session = await getServerSession(authOptions);
if (!session?.user) redirect("/login?callbackUrl=/admin/verifications");
if (!isAdminEmail(session.user.email)) {
return (
<div className="mx-auto max-w-2xl px-4 py-12 text-center">
<p className="text-sm text-neutral-600">
Halaman ini hanya untuk admin SeTrip.
</p>
</div>
);
}
const params = await searchParams;
const tab: Tab =
params.tab === "APPROVED" || params.tab === "REJECTED" ? params.tab : "PENDING";
const items = await organizerRepo.listByStatus(tab);
const tabs: { key: Tab; label: string }[] = [
{ key: "PENDING", label: "Pending" },
{ key: "APPROVED", label: "Disetujui" },
{ key: "REJECTED", label: "Ditolak" },
];
return (
<div className="mx-auto max-w-4xl px-4 py-8 sm:py-12">
<header className="mb-6">
<h1 className="text-2xl font-bold text-neutral-900 sm:text-3xl">
Review Verifikasi Organizer
</h1>
<p className="mt-1 text-sm text-neutral-500">
Periksa data KTP, selfie, dan rekening sebelum menyetujui.
</p>
</header>
<div className="mb-6 flex gap-2">
{tabs.map((t) => (
<a
key={t.key}
href={`/admin/verifications?tab=${t.key}`}
className={`rounded-full px-4 py-1.5 text-sm font-semibold transition-colors ${
tab === t.key
? "bg-primary-600 text-white"
: "bg-neutral-100 text-neutral-600 hover:bg-neutral-200"
}`}
>
{t.label}
</a>
))}
</div>
{items.length === 0 ? (
<div className="rounded-2xl border border-dashed border-neutral-300 bg-white p-10 text-center">
<p className="text-sm text-neutral-500">Tidak ada data.</p>
</div>
) : (
<div className="space-y-4">
{items.map((v) => (
<ReviewCard key={v.id} verification={v} />
))}
</div>
)}
</div>
);
}
+54 -337
View File
@@ -1,44 +1,11 @@
"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
import { useSession } from "next-auth/react";
import Link from "next/link";
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
import { createTripAction } from "@/features/trip/actions";
import { ImageUrlInput } from "@/features/trip/components/image-url-input";
import { formatLocalCalendarYmd } from "@/lib/trip-dates";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import { organizerService } from "@/server/services/organizer.service";
import { CreateTripForm } from "@/features/trip/components/create-trip-form";
const SAMPLE_MOUNTAINS = [
{ name: "Gunung Papandayan", location: "Garut, Jawa Barat" },
{ name: "Gunung Ciremai", location: "Kuningan, Jawa Barat" },
{ name: "Gunung Pangrango", location: "Bogor/Cianjur, Jawa Barat" },
{ name: "Gunung Gede", location: "Bogor/Cianjur, Jawa Barat" },
{ name: "Gunung Tangkuban Parahu", location: "Bandung, Jawa Barat" },
{ name: "Gunung Bukit Tunggul", location: "Bandung, Jawa Barat" },
{ name: "Gunung Malabar", location: "Bandung, Jawa Barat" },
{ name: "Gunung Guntur", location: "Garut, Jawa Barat" },
];
function formatRupiahInput(value: string): string {
const num = value.replace(/\D/g, "");
return num.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}
function parseRupiahInput(value: string): string {
return value.replace(/\./g, "");
}
export default function CreateTripPage() {
const { data: session } = useSession();
const router = useRouter();
const [error, setError] = useState("");
const [loading, setLoading] = useState(false);
const [startDate, setStartDate] = useState<Date | null>(null);
const [endDate, setEndDate] = useState<Date | null>(null);
const [priceDisplay, setPriceDisplay] = useState("");
export default async function CreateTripPage() {
const session = await getServerSession(authOptions);
if (!session?.user) {
return (
@@ -51,7 +18,7 @@ export default function CreateTripPage() {
Kamu harus login untuk membuat trip.
</p>
<Link
href="/login"
href="/login?callbackUrl=/create-trip"
className="inline-block rounded-xl bg-primary-600 px-6 py-2.5 text-sm font-semibold text-white hover:bg-primary-700"
>
Login
@@ -61,69 +28,8 @@ export default function CreateTripPage() {
);
}
async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
e.preventDefault();
setError("");
if (!startDate) {
setError("Tanggal berangkat harus diisi");
return;
}
setLoading(true);
const formData = new FormData(e.currentTarget);
// Tanggal dari picker → string tanggal untuk server action
formData.set("date", formatLocalCalendarYmd(startDate));
if (endDate) {
const startYmd = formatLocalCalendarYmd(startDate);
const endYmd = formatLocalCalendarYmd(endDate);
// Satu hari: tanggal pulang sama dengan berangkat → jangan kirim endDate (trip 1 hari)
if (endYmd !== startYmd) {
formData.set("endDate", endYmd);
}
}
// Set raw price number
formData.set("price", parseRupiahInput(priceDisplay));
const result = await createTripAction(formData);
setLoading(false);
if (result.error) {
setError(result.error);
} else if (result.tripId) {
router.push(`/trips/${result.tripId}`);
}
}
function handleMountainSelect(e: React.ChangeEvent<HTMLSelectElement>) {
const selected = SAMPLE_MOUNTAINS.find((m) => m.name === e.target.value);
if (selected) {
const form = e.target.form;
if (form) {
const mountainInput = form.elements.namedItem(
"mountain"
) as HTMLInputElement;
const locationInput = form.elements.namedItem(
"location"
) as HTMLInputElement;
mountainInput.value = selected.name;
locationInput.value = selected.location;
}
}
}
function handleDateChange(dates: [Date | null, Date | null]) {
const [start, end] = dates;
setStartDate(start);
setEndDate(end);
}
function handlePriceChange(e: React.ChangeEvent<HTMLInputElement>) {
const raw = e.target.value.replace(/\D/g, "");
setPriceDisplay(raw ? formatRupiahInput(raw) : "");
}
const verification = await organizerService.getStatusForUser(session.user.id);
const isVerifiedOrganizer = verification?.status === "APPROVED";
return (
<div className="mx-auto max-w-2xl px-4 py-6 sm:py-8">
@@ -134,243 +40,54 @@ export default function CreateTripPage() {
</p>
</div>
<div className="rounded-2xl border border-neutral-200 bg-white p-6 shadow-sm">
{error && (
<div className="mb-4 rounded-xl bg-red-50 px-4 py-3 text-sm font-medium text-red-600">
{error}
</div>
)}
{!isVerifiedOrganizer && (
<VerificationBanner status={verification?.status ?? null} />
)}
<form onSubmit={handleSubmit} className="space-y-5">
{/* Mountain Quick Picker */}
<div className="rounded-xl bg-primary-50 p-4">
<label className="mb-2 flex items-center gap-1.5 text-sm font-bold text-primary-800">
<span>🏔</span> Pilih Gunung Jawa Barat
</label>
<select
onChange={handleMountainSelect}
className="w-full rounded-lg border border-primary-200 bg-white px-4 py-2.5 text-sm text-neutral-800"
defaultValue=""
>
<option value="" disabled>
Pilih gunung...
</option>
{SAMPLE_MOUNTAINS.map((m) => (
<option key={m.name} value={m.name}>
{m.name} {m.location}
</option>
))}
</select>
</div>
<CreateTripForm isVerifiedOrganizer={isVerifiedOrganizer} />
</div>
);
}
<div>
<label htmlFor="title" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Judul Trip
</label>
<input
id="title"
name="title"
type="text"
required
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-2.5 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="contoh: Open Trip Papandayan Weekend"
/>
</div>
function VerificationBanner({
status,
}: {
status: "PENDING" | "APPROVED" | "REJECTED" | null;
}) {
if (status === "PENDING") {
return (
<div className="mb-5 rounded-2xl border border-amber-200 bg-amber-50 p-4 sm:p-5">
<p className="text-sm font-bold text-amber-800">
Verifikasi sedang diproses
</p>
<p className="mt-1 text-sm text-neutral-700">
Pengajuan verifikasi-mu masih ditinjau admin. Sementara menunggu, kamu
masih bisa membuat <strong>trip gratis</strong> (harga 0).
</p>
</div>
);
}
<div className="grid gap-4 sm:grid-cols-2">
<div>
<label htmlFor="mountain" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Nama Gunung
</label>
<input
id="mountain"
name="mountain"
type="text"
required
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-2.5 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="Gunung Papandayan"
/>
</div>
<div>
<label htmlFor="location" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Lokasi
</label>
<input
id="location"
name="location"
type="text"
required
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-2.5 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="Garut, Jawa Barat"
/>
</div>
</div>
<div>
<label htmlFor="description" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Deskripsi
</label>
<textarea
id="description"
name="description"
rows={4}
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-2.5 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="Ringkasan trip, vibe, level kesulitan..."
/>
</div>
<div>
<label htmlFor="meetingPoint" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Meeting point
</label>
<input
id="meetingPoint"
name="meetingPoint"
type="text"
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-2.5 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="contoh: Alfamart Cicaheum, 05:00 WIB"
/>
</div>
<div>
<label htmlFor="itinerary" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Itinerary
</label>
<textarea
id="itinerary"
name="itinerary"
rows={5}
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-2.5 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder={"Hari 1: …\nHari 2: …"}
/>
</div>
<div className="grid gap-4 sm:grid-cols-2">
<div>
<label htmlFor="whatsIncluded" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Termasuk
</label>
<textarea
id="whatsIncluded"
name="whatsIncluded"
rows={4}
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-2.5 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="Transport, konsumsi, tenda, …"
/>
</div>
<div>
<label htmlFor="whatsExcluded" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Tidak termasuk
</label>
<textarea
id="whatsExcluded"
name="whatsExcluded"
rows={4}
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-2.5 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="Tiket masuk TN, sleeping bag, …"
/>
</div>
</div>
<ImageUrlInput />
{/* Date Range & Participants & Price */}
<div className="grid gap-4 sm:grid-cols-2">
{/* Date Range Picker */}
<div>
<label className="mb-1.5 block text-sm font-semibold text-neutral-700">
Tanggal berangkat pulang
</label>
<div className="relative">
<span className="absolute left-3 top-1/2 z-10 -translate-y-1/2 text-neutral-400">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
className="h-4 w-4"
>
<path
fillRule="evenodd"
d="M5.75 2a.75.75 0 01.75.75V4h7V2.75a.75.75 0 011.5 0V4h.25A2.75 2.75 0 0118 6.75v8.5A2.75 2.75 0 0115.25 18H4.75A2.75 2.75 0 012 15.25v-8.5A2.75 2.75 0 014.75 4H5V2.75A.75.75 0 015.75 2zm-1 5.5c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25v-6.5c0-.69-.56-1.25-1.25-1.25H4.75z"
clipRule="evenodd"
/>
</svg>
</span>
<DatePicker
selectsRange
startDate={startDate}
endDate={endDate}
onChange={handleDateChange}
minDate={new Date()}
placeholderText="Pilih tanggal..."
dateFormat="dd MMM yyyy"
isClearable
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 py-2.5 pl-9 pr-3 text-sm text-neutral-800 placeholder:text-neutral-400 focus:border-primary-500 focus:bg-white"
/>
</div>
</div>
{/* Max Participants */}
<div>
<label htmlFor="maxParticipants" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Maks Peserta
</label>
<div className="relative">
<span className="absolute left-3 top-1/2 -translate-y-1/2 text-neutral-400">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
className="h-4 w-4"
>
<path d="M7 8a3 3 0 100-6 3 3 0 000 6zM14.5 9a2.5 2.5 0 100-5 2.5 2.5 0 000 5zM1.615 16.428a1.224 1.224 0 01-.569-1.175 6.002 6.002 0 0111.908 0c.058.467-.172.92-.57 1.174A9.953 9.953 0 017 18a9.953 9.953 0 01-5.385-1.572zM14.5 16h-.106c.07-.297.088-.611.048-.933a7.47 7.47 0 00-1.588-3.755 4.502 4.502 0 015.874 2.636.818.818 0 01-.36.98A7.465 7.465 0 0114.5 16z" />
</svg>
</span>
<input
id="maxParticipants"
name="maxParticipants"
type="number"
required
min={1}
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 py-2.5 pl-9 pr-4 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="10"
/>
</div>
</div>
</div>
{/* Price with Rp format */}
<div>
<label htmlFor="priceDisplay" className="mb-1.5 block text-sm font-semibold text-neutral-700">
Harga per Orang
</label>
<div className="relative">
<span className="absolute left-3 top-1/2 -translate-y-1/2 text-sm font-semibold text-neutral-500">
Rp
</span>
<input
id="priceDisplay"
type="text"
inputMode="numeric"
required
value={priceDisplay}
onChange={handlePriceChange}
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 py-2.5 pl-10 pr-4 text-sm text-neutral-800 placeholder:text-neutral-400 focus:bg-white"
placeholder="150.000"
/>
{/* Hidden input for form submission */}
<input type="hidden" name="price" value={parseRupiahInput(priceDisplay)} />
</div>
</div>
<button
type="submit"
disabled={loading}
className="w-full rounded-xl bg-primary-600 py-3 text-sm font-bold text-white shadow-lg shadow-primary-600/20 transition-colors hover:bg-primary-700 disabled:opacity-50"
>
{loading ? "Membuat Trip..." : "Buat Trip"}
</button>
</form>
const isRejected = status === "REJECTED";
return (
<div className="mb-5 rounded-2xl border border-amber-200 bg-amber-50 p-4 sm:p-5">
<div className="flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between">
<div className="flex-1">
<p className="text-sm font-bold text-amber-800">
{isRejected ? "Verifikasi ditolak" : "Belum terverifikasi"}
</p>
<p className="mt-1 text-sm text-neutral-700">
{isRejected
? "Pengajuan sebelumnya ditolak. Untuk membuat trip berbayar, perbaiki data dan ajukan ulang."
: "Untuk membuat trip berbayar, akun kamu perlu diverifikasi (KTP, selfie, & rekening). Trip gratis tidak butuh verifikasi."}
</p>
</div>
<Link
href="/verify"
className="inline-flex shrink-0 items-center justify-center rounded-xl bg-amber-600 px-4 py-2 text-sm font-bold text-white shadow-sm transition-colors hover:bg-amber-700 sm:px-5"
>
{isRejected ? "Ajukan Ulang" : "Verifikasi Sekarang"}
</Link>
</div>
</div>
);
+5
View File
@@ -22,6 +22,11 @@ export * from './enums';
*
*/
export type User = Prisma.UserModel
/**
* Model OrganizerVerification
*
*/
export type OrganizerVerification = Prisma.OrganizerVerificationModel
/**
* Model Trip
*
+5
View File
@@ -46,6 +46,11 @@ export { Prisma }
*
*/
export type User = Prisma.UserModel
/**
* Model OrganizerVerification
*
*/
export type OrganizerVerification = Prisma.OrganizerVerificationModel
/**
* Model Trip
*
+80 -46
View File
@@ -49,6 +49,17 @@ export type BoolFilter<$PrismaModel = never> = {
not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean
}
export type DateTimeNullableFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null
}
export type DateTimeFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
@@ -109,6 +120,20 @@ export type BoolWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedBoolFilter<$PrismaModel>
}
export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
}
export type DateTimeWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
@@ -123,15 +148,21 @@ export type DateTimeWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedDateTimeFilter<$PrismaModel>
}
export type DateTimeNullableFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null
export type EnumVerificationStatusFilter<$PrismaModel = never> = {
equals?: $Enums.VerificationStatus | Prisma.EnumVerificationStatusFieldRefInput<$PrismaModel>
in?: $Enums.VerificationStatus[] | Prisma.ListEnumVerificationStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.VerificationStatus[] | Prisma.ListEnumVerificationStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumVerificationStatusFilter<$PrismaModel> | $Enums.VerificationStatus
}
export type EnumVerificationStatusWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.VerificationStatus | Prisma.EnumVerificationStatusFieldRefInput<$PrismaModel>
in?: $Enums.VerificationStatus[] | Prisma.ListEnumVerificationStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.VerificationStatus[] | Prisma.ListEnumVerificationStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumVerificationStatusWithAggregatesFilter<$PrismaModel> | $Enums.VerificationStatus
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumVerificationStatusFilter<$PrismaModel>
_max?: Prisma.NestedEnumVerificationStatusFilter<$PrismaModel>
}
export type IntFilter<$PrismaModel = never> = {
@@ -152,20 +183,6 @@ export type EnumTripStatusFilter<$PrismaModel = never> = {
not?: Prisma.NestedEnumTripStatusFilter<$PrismaModel> | $Enums.TripStatus
}
export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
}
export type IntWithAggregatesFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
@@ -242,6 +259,17 @@ export type NestedBoolFilter<$PrismaModel = never> = {
not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean
}
export type NestedDateTimeNullableFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null
}
export type NestedDateTimeFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
@@ -317,6 +345,20 @@ export type NestedBoolWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedBoolFilter<$PrismaModel>
}
export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
}
export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
@@ -331,15 +373,21 @@ export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedDateTimeFilter<$PrismaModel>
}
export type NestedDateTimeNullableFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null
export type NestedEnumVerificationStatusFilter<$PrismaModel = never> = {
equals?: $Enums.VerificationStatus | Prisma.EnumVerificationStatusFieldRefInput<$PrismaModel>
in?: $Enums.VerificationStatus[] | Prisma.ListEnumVerificationStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.VerificationStatus[] | Prisma.ListEnumVerificationStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumVerificationStatusFilter<$PrismaModel> | $Enums.VerificationStatus
}
export type NestedEnumVerificationStatusWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.VerificationStatus | Prisma.EnumVerificationStatusFieldRefInput<$PrismaModel>
in?: $Enums.VerificationStatus[] | Prisma.ListEnumVerificationStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.VerificationStatus[] | Prisma.ListEnumVerificationStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumVerificationStatusWithAggregatesFilter<$PrismaModel> | $Enums.VerificationStatus
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumVerificationStatusFilter<$PrismaModel>
_max?: Prisma.NestedEnumVerificationStatusFilter<$PrismaModel>
}
export type NestedEnumTripStatusFilter<$PrismaModel = never> = {
@@ -349,20 +397,6 @@ export type NestedEnumTripStatusFilter<$PrismaModel = never> = {
not?: Prisma.NestedEnumTripStatusFilter<$PrismaModel> | $Enums.TripStatus
}
export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
}
export type NestedIntWithAggregatesFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
+9
View File
@@ -9,6 +9,15 @@
* 🟢 You can import this file directly.
*/
export const VerificationStatus = {
PENDING: 'PENDING',
APPROVED: 'APPROVED',
REJECTED: 'REJECTED'
} as const
export type VerificationStatus = (typeof VerificationStatus)[keyof typeof VerificationStatus]
export const TripStatus = {
OPEN: 'OPEN',
FULL: 'FULL',
File diff suppressed because one or more lines are too long
@@ -385,6 +385,7 @@ type FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRe
export const ModelName = {
User: 'User',
OrganizerVerification: 'OrganizerVerification',
Trip: 'Trip',
TripReview: 'TripReview',
TripImage: 'TripImage',
@@ -404,7 +405,7 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
omit: GlobalOmitOptions
}
meta: {
modelProps: "user" | "trip" | "tripReview" | "tripImage" | "tripParticipant"
modelProps: "user" | "organizerVerification" | "trip" | "tripReview" | "tripImage" | "tripParticipant"
txIsolationLevel: TransactionIsolationLevel
}
model: {
@@ -482,6 +483,80 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
}
}
}
OrganizerVerification: {
payload: Prisma.$OrganizerVerificationPayload<ExtArgs>
fields: Prisma.OrganizerVerificationFieldRefs
operations: {
findUnique: {
args: Prisma.OrganizerVerificationFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload> | null
}
findUniqueOrThrow: {
args: Prisma.OrganizerVerificationFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>
}
findFirst: {
args: Prisma.OrganizerVerificationFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload> | null
}
findFirstOrThrow: {
args: Prisma.OrganizerVerificationFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>
}
findMany: {
args: Prisma.OrganizerVerificationFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>[]
}
create: {
args: Prisma.OrganizerVerificationCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>
}
createMany: {
args: Prisma.OrganizerVerificationCreateManyArgs<ExtArgs>
result: BatchPayload
}
createManyAndReturn: {
args: Prisma.OrganizerVerificationCreateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>[]
}
delete: {
args: Prisma.OrganizerVerificationDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>
}
update: {
args: Prisma.OrganizerVerificationUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>
}
deleteMany: {
args: Prisma.OrganizerVerificationDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.OrganizerVerificationUpdateManyArgs<ExtArgs>
result: BatchPayload
}
updateManyAndReturn: {
args: Prisma.OrganizerVerificationUpdateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>[]
}
upsert: {
args: Prisma.OrganizerVerificationUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$OrganizerVerificationPayload>
}
aggregate: {
args: Prisma.OrganizerVerificationAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateOrganizerVerification>
}
groupBy: {
args: Prisma.OrganizerVerificationGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.OrganizerVerificationGroupByOutputType>[]
}
count: {
args: Prisma.OrganizerVerificationCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.OrganizerVerificationCountAggregateOutputType> | number
}
}
}
Trip: {
payload: Prisma.$TripPayload<ExtArgs>
fields: Prisma.TripFieldRefs
@@ -823,7 +898,8 @@ export const UserScalarFieldEnum = {
email: 'email',
password: 'password',
image: 'image',
isVerified: 'isVerified',
acceptedTermsAndPrivacy: 'acceptedTermsAndPrivacy',
acceptedAt: 'acceptedAt',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
@@ -831,6 +907,30 @@ export const UserScalarFieldEnum = {
export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum]
export const OrganizerVerificationScalarFieldEnum = {
id: 'id',
userId: 'userId',
fullName: 'fullName',
nik: 'nik',
birthDate: 'birthDate',
address: 'address',
ktpImageUrl: 'ktpImageUrl',
selfieUrl: 'selfieUrl',
bankName: 'bankName',
bankAccountNumber: 'bankAccountNumber',
bankAccountName: 'bankAccountName',
status: 'status',
rejectionReason: 'rejectionReason',
reviewedAt: 'reviewedAt',
reviewedById: 'reviewedById',
verifiedAt: 'verifiedAt',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type OrganizerVerificationScalarFieldEnum = (typeof OrganizerVerificationScalarFieldEnum)[keyof typeof OrganizerVerificationScalarFieldEnum]
export const TripScalarFieldEnum = {
id: 'id',
title: 'title',
@@ -956,6 +1056,20 @@ export type ListDateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaM
/**
* Reference to a field of type 'VerificationStatus'
*/
export type EnumVerificationStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'VerificationStatus'>
/**
* Reference to a field of type 'VerificationStatus[]'
*/
export type ListEnumVerificationStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'VerificationStatus[]'>
/**
* Reference to a field of type 'Int'
*/
@@ -1107,6 +1221,7 @@ export type PrismaClientOptions = ({
}
export type GlobalOmitConfig = {
user?: Prisma.UserOmit
organizerVerification?: Prisma.OrganizerVerificationOmit
trip?: Prisma.TripOmit
tripReview?: Prisma.TripReviewOmit
tripImage?: Prisma.TripImageOmit
@@ -52,6 +52,7 @@ export const AnyNull = runtime.AnyNull
export const ModelName = {
User: 'User',
OrganizerVerification: 'OrganizerVerification',
Trip: 'Trip',
TripReview: 'TripReview',
TripImage: 'TripImage',
@@ -80,7 +81,8 @@ export const UserScalarFieldEnum = {
email: 'email',
password: 'password',
image: 'image',
isVerified: 'isVerified',
acceptedTermsAndPrivacy: 'acceptedTermsAndPrivacy',
acceptedAt: 'acceptedAt',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
@@ -88,6 +90,30 @@ export const UserScalarFieldEnum = {
export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum]
export const OrganizerVerificationScalarFieldEnum = {
id: 'id',
userId: 'userId',
fullName: 'fullName',
nik: 'nik',
birthDate: 'birthDate',
address: 'address',
ktpImageUrl: 'ktpImageUrl',
selfieUrl: 'selfieUrl',
bankName: 'bankName',
bankAccountNumber: 'bankAccountNumber',
bankAccountName: 'bankAccountName',
status: 'status',
rejectionReason: 'rejectionReason',
reviewedAt: 'reviewedAt',
reviewedById: 'reviewedById',
verifiedAt: 'verifiedAt',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type OrganizerVerificationScalarFieldEnum = (typeof OrganizerVerificationScalarFieldEnum)[keyof typeof OrganizerVerificationScalarFieldEnum]
export const TripScalarFieldEnum = {
id: 'id',
title: 'title',
+1
View File
@@ -9,6 +9,7 @@
* 🟢 You can import this file directly.
*/
export type * from './models/User'
export type * from './models/OrganizerVerification'
export type * from './models/Trip'
export type * from './models/TripReview'
export type * from './models/TripImage'
File diff suppressed because it is too large Load Diff
-4
View File
@@ -699,10 +699,6 @@ export type TripUncheckedUpdateManyWithoutOrganizerNestedInput = {
deleteMany?: Prisma.TripScalarWhereInput | Prisma.TripScalarWhereInput[]
}
export type NullableDateTimeFieldUpdateOperationsInput = {
set?: Date | string | null
}
export type IntFieldUpdateOperationsInput = {
set?: number
increment?: number
+382 -42
View File
@@ -30,7 +30,8 @@ export type UserMinAggregateOutputType = {
email: string | null
password: string | null
image: string | null
isVerified: boolean | null
acceptedTermsAndPrivacy: boolean | null
acceptedAt: Date | null
createdAt: Date | null
updatedAt: Date | null
}
@@ -41,7 +42,8 @@ export type UserMaxAggregateOutputType = {
email: string | null
password: string | null
image: string | null
isVerified: boolean | null
acceptedTermsAndPrivacy: boolean | null
acceptedAt: Date | null
createdAt: Date | null
updatedAt: Date | null
}
@@ -52,7 +54,8 @@ export type UserCountAggregateOutputType = {
email: number
password: number
image: number
isVerified: number
acceptedTermsAndPrivacy: number
acceptedAt: number
createdAt: number
updatedAt: number
_all: number
@@ -65,7 +68,8 @@ export type UserMinAggregateInputType = {
email?: true
password?: true
image?: true
isVerified?: true
acceptedTermsAndPrivacy?: true
acceptedAt?: true
createdAt?: true
updatedAt?: true
}
@@ -76,7 +80,8 @@ export type UserMaxAggregateInputType = {
email?: true
password?: true
image?: true
isVerified?: true
acceptedTermsAndPrivacy?: true
acceptedAt?: true
createdAt?: true
updatedAt?: true
}
@@ -87,7 +92,8 @@ export type UserCountAggregateInputType = {
email?: true
password?: true
image?: true
isVerified?: true
acceptedTermsAndPrivacy?: true
acceptedAt?: true
createdAt?: true
updatedAt?: true
_all?: true
@@ -171,7 +177,8 @@ export type UserGroupByOutputType = {
email: string
password: string
image: string | null
isVerified: boolean
acceptedTermsAndPrivacy: boolean
acceptedAt: Date | null
createdAt: Date
updatedAt: Date
_count: UserCountAggregateOutputType | null
@@ -203,12 +210,15 @@ export type UserWhereInput = {
email?: Prisma.StringFilter<"User"> | string
password?: Prisma.StringFilter<"User"> | string
image?: Prisma.StringNullableFilter<"User"> | string | null
isVerified?: Prisma.BoolFilter<"User"> | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFilter<"User"> | boolean
acceptedAt?: Prisma.DateTimeNullableFilter<"User"> | Date | string | null
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
trips?: Prisma.TripListRelationFilter
participations?: Prisma.TripParticipantListRelationFilter
tripReviews?: Prisma.TripReviewListRelationFilter
organizerVerification?: Prisma.XOR<Prisma.OrganizerVerificationNullableScalarRelationFilter, Prisma.OrganizerVerificationWhereInput> | null
reviewedVerifications?: Prisma.OrganizerVerificationListRelationFilter
}
export type UserOrderByWithRelationInput = {
@@ -217,12 +227,15 @@ export type UserOrderByWithRelationInput = {
email?: Prisma.SortOrder
password?: Prisma.SortOrder
image?: Prisma.SortOrderInput | Prisma.SortOrder
isVerified?: Prisma.SortOrder
acceptedTermsAndPrivacy?: Prisma.SortOrder
acceptedAt?: Prisma.SortOrderInput | Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
trips?: Prisma.TripOrderByRelationAggregateInput
participations?: Prisma.TripParticipantOrderByRelationAggregateInput
tripReviews?: Prisma.TripReviewOrderByRelationAggregateInput
organizerVerification?: Prisma.OrganizerVerificationOrderByWithRelationInput
reviewedVerifications?: Prisma.OrganizerVerificationOrderByRelationAggregateInput
}
export type UserWhereUniqueInput = Prisma.AtLeast<{
@@ -234,12 +247,15 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{
name?: Prisma.StringFilter<"User"> | string
password?: Prisma.StringFilter<"User"> | string
image?: Prisma.StringNullableFilter<"User"> | string | null
isVerified?: Prisma.BoolFilter<"User"> | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFilter<"User"> | boolean
acceptedAt?: Prisma.DateTimeNullableFilter<"User"> | Date | string | null
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
trips?: Prisma.TripListRelationFilter
participations?: Prisma.TripParticipantListRelationFilter
tripReviews?: Prisma.TripReviewListRelationFilter
organizerVerification?: Prisma.XOR<Prisma.OrganizerVerificationNullableScalarRelationFilter, Prisma.OrganizerVerificationWhereInput> | null
reviewedVerifications?: Prisma.OrganizerVerificationListRelationFilter
}, "id" | "email">
export type UserOrderByWithAggregationInput = {
@@ -248,7 +264,8 @@ export type UserOrderByWithAggregationInput = {
email?: Prisma.SortOrder
password?: Prisma.SortOrder
image?: Prisma.SortOrderInput | Prisma.SortOrder
isVerified?: Prisma.SortOrder
acceptedTermsAndPrivacy?: Prisma.SortOrder
acceptedAt?: Prisma.SortOrderInput | Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
_count?: Prisma.UserCountOrderByAggregateInput
@@ -265,7 +282,8 @@ export type UserScalarWhereWithAggregatesInput = {
email?: Prisma.StringWithAggregatesFilter<"User"> | string
password?: Prisma.StringWithAggregatesFilter<"User"> | string
image?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null
isVerified?: Prisma.BoolWithAggregatesFilter<"User"> | boolean
acceptedTermsAndPrivacy?: Prisma.BoolWithAggregatesFilter<"User"> | boolean
acceptedAt?: Prisma.DateTimeNullableWithAggregatesFilter<"User"> | Date | string | null
createdAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string
updatedAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string
}
@@ -276,12 +294,15 @@ export type UserCreateInput = {
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripCreateNestedManyWithoutOrganizerInput
participations?: Prisma.TripParticipantCreateNestedManyWithoutUserInput
tripReviews?: Prisma.TripReviewCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationCreateNestedOneWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationCreateNestedManyWithoutReviewedByInput
}
export type UserUncheckedCreateInput = {
@@ -290,12 +311,15 @@ export type UserUncheckedCreateInput = {
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripUncheckedCreateNestedManyWithoutOrganizerInput
participations?: Prisma.TripParticipantUncheckedCreateNestedManyWithoutUserInput
tripReviews?: Prisma.TripReviewUncheckedCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedCreateNestedOneWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedCreateNestedManyWithoutReviewedByInput
}
export type UserUpdateInput = {
@@ -304,12 +328,15 @@ export type UserUpdateInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUpdateManyWithoutOrganizerNestedInput
participations?: Prisma.TripParticipantUpdateManyWithoutUserNestedInput
tripReviews?: Prisma.TripReviewUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUpdateOneWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUpdateManyWithoutReviewedByNestedInput
}
export type UserUncheckedUpdateInput = {
@@ -318,12 +345,15 @@ export type UserUncheckedUpdateInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUncheckedUpdateManyWithoutOrganizerNestedInput
participations?: Prisma.TripParticipantUncheckedUpdateManyWithoutUserNestedInput
tripReviews?: Prisma.TripReviewUncheckedUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedUpdateOneWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedUpdateManyWithoutReviewedByNestedInput
}
export type UserCreateManyInput = {
@@ -332,7 +362,8 @@ export type UserCreateManyInput = {
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
}
@@ -343,7 +374,8 @@ export type UserUpdateManyMutationInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
}
@@ -354,7 +386,8 @@ export type UserUncheckedUpdateManyInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
}
@@ -365,7 +398,8 @@ export type UserCountOrderByAggregateInput = {
email?: Prisma.SortOrder
password?: Prisma.SortOrder
image?: Prisma.SortOrder
isVerified?: Prisma.SortOrder
acceptedTermsAndPrivacy?: Prisma.SortOrder
acceptedAt?: Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
}
@@ -376,7 +410,8 @@ export type UserMaxOrderByAggregateInput = {
email?: Prisma.SortOrder
password?: Prisma.SortOrder
image?: Prisma.SortOrder
isVerified?: Prisma.SortOrder
acceptedTermsAndPrivacy?: Prisma.SortOrder
acceptedAt?: Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
}
@@ -387,7 +422,8 @@ export type UserMinOrderByAggregateInput = {
email?: Prisma.SortOrder
password?: Prisma.SortOrder
image?: Prisma.SortOrder
isVerified?: Prisma.SortOrder
acceptedTermsAndPrivacy?: Prisma.SortOrder
acceptedAt?: Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
}
@@ -397,6 +433,11 @@ export type UserScalarRelationFilter = {
isNot?: Prisma.UserWhereInput
}
export type UserNullableScalarRelationFilter = {
is?: Prisma.UserWhereInput | null
isNot?: Prisma.UserWhereInput | null
}
export type StringFieldUpdateOperationsInput = {
set?: string
}
@@ -409,10 +450,44 @@ export type BoolFieldUpdateOperationsInput = {
set?: boolean
}
export type NullableDateTimeFieldUpdateOperationsInput = {
set?: Date | string | null
}
export type DateTimeFieldUpdateOperationsInput = {
set?: Date | string
}
export type UserCreateNestedOneWithoutOrganizerVerificationInput = {
create?: Prisma.XOR<Prisma.UserCreateWithoutOrganizerVerificationInput, Prisma.UserUncheckedCreateWithoutOrganizerVerificationInput>
connectOrCreate?: Prisma.UserCreateOrConnectWithoutOrganizerVerificationInput
connect?: Prisma.UserWhereUniqueInput
}
export type UserCreateNestedOneWithoutReviewedVerificationsInput = {
create?: Prisma.XOR<Prisma.UserCreateWithoutReviewedVerificationsInput, Prisma.UserUncheckedCreateWithoutReviewedVerificationsInput>
connectOrCreate?: Prisma.UserCreateOrConnectWithoutReviewedVerificationsInput
connect?: Prisma.UserWhereUniqueInput
}
export type UserUpdateOneRequiredWithoutOrganizerVerificationNestedInput = {
create?: Prisma.XOR<Prisma.UserCreateWithoutOrganizerVerificationInput, Prisma.UserUncheckedCreateWithoutOrganizerVerificationInput>
connectOrCreate?: Prisma.UserCreateOrConnectWithoutOrganizerVerificationInput
upsert?: Prisma.UserUpsertWithoutOrganizerVerificationInput
connect?: Prisma.UserWhereUniqueInput
update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutOrganizerVerificationInput, Prisma.UserUpdateWithoutOrganizerVerificationInput>, Prisma.UserUncheckedUpdateWithoutOrganizerVerificationInput>
}
export type UserUpdateOneWithoutReviewedVerificationsNestedInput = {
create?: Prisma.XOR<Prisma.UserCreateWithoutReviewedVerificationsInput, Prisma.UserUncheckedCreateWithoutReviewedVerificationsInput>
connectOrCreate?: Prisma.UserCreateOrConnectWithoutReviewedVerificationsInput
upsert?: Prisma.UserUpsertWithoutReviewedVerificationsInput
disconnect?: Prisma.UserWhereInput | boolean
delete?: Prisma.UserWhereInput | boolean
connect?: Prisma.UserWhereUniqueInput
update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutReviewedVerificationsInput, Prisma.UserUpdateWithoutReviewedVerificationsInput>, Prisma.UserUncheckedUpdateWithoutReviewedVerificationsInput>
}
export type UserCreateNestedOneWithoutTripsInput = {
create?: Prisma.XOR<Prisma.UserCreateWithoutTripsInput, Prisma.UserUncheckedCreateWithoutTripsInput>
connectOrCreate?: Prisma.UserCreateOrConnectWithoutTripsInput
@@ -455,17 +530,180 @@ export type UserUpdateOneRequiredWithoutParticipationsNestedInput = {
update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutParticipationsInput, Prisma.UserUpdateWithoutParticipationsInput>, Prisma.UserUncheckedUpdateWithoutParticipationsInput>
}
export type UserCreateWithoutOrganizerVerificationInput = {
id?: string
name: string
email: string
password: string
image?: string | null
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripCreateNestedManyWithoutOrganizerInput
participations?: Prisma.TripParticipantCreateNestedManyWithoutUserInput
tripReviews?: Prisma.TripReviewCreateNestedManyWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationCreateNestedManyWithoutReviewedByInput
}
export type UserUncheckedCreateWithoutOrganizerVerificationInput = {
id?: string
name: string
email: string
password: string
image?: string | null
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripUncheckedCreateNestedManyWithoutOrganizerInput
participations?: Prisma.TripParticipantUncheckedCreateNestedManyWithoutUserInput
tripReviews?: Prisma.TripReviewUncheckedCreateNestedManyWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedCreateNestedManyWithoutReviewedByInput
}
export type UserCreateOrConnectWithoutOrganizerVerificationInput = {
where: Prisma.UserWhereUniqueInput
create: Prisma.XOR<Prisma.UserCreateWithoutOrganizerVerificationInput, Prisma.UserUncheckedCreateWithoutOrganizerVerificationInput>
}
export type UserCreateWithoutReviewedVerificationsInput = {
id?: string
name: string
email: string
password: string
image?: string | null
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripCreateNestedManyWithoutOrganizerInput
participations?: Prisma.TripParticipantCreateNestedManyWithoutUserInput
tripReviews?: Prisma.TripReviewCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationCreateNestedOneWithoutUserInput
}
export type UserUncheckedCreateWithoutReviewedVerificationsInput = {
id?: string
name: string
email: string
password: string
image?: string | null
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripUncheckedCreateNestedManyWithoutOrganizerInput
participations?: Prisma.TripParticipantUncheckedCreateNestedManyWithoutUserInput
tripReviews?: Prisma.TripReviewUncheckedCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedCreateNestedOneWithoutUserInput
}
export type UserCreateOrConnectWithoutReviewedVerificationsInput = {
where: Prisma.UserWhereUniqueInput
create: Prisma.XOR<Prisma.UserCreateWithoutReviewedVerificationsInput, Prisma.UserUncheckedCreateWithoutReviewedVerificationsInput>
}
export type UserUpsertWithoutOrganizerVerificationInput = {
update: Prisma.XOR<Prisma.UserUpdateWithoutOrganizerVerificationInput, Prisma.UserUncheckedUpdateWithoutOrganizerVerificationInput>
create: Prisma.XOR<Prisma.UserCreateWithoutOrganizerVerificationInput, Prisma.UserUncheckedCreateWithoutOrganizerVerificationInput>
where?: Prisma.UserWhereInput
}
export type UserUpdateToOneWithWhereWithoutOrganizerVerificationInput = {
where?: Prisma.UserWhereInput
data: Prisma.XOR<Prisma.UserUpdateWithoutOrganizerVerificationInput, Prisma.UserUncheckedUpdateWithoutOrganizerVerificationInput>
}
export type UserUpdateWithoutOrganizerVerificationInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
name?: Prisma.StringFieldUpdateOperationsInput | string
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUpdateManyWithoutOrganizerNestedInput
participations?: Prisma.TripParticipantUpdateManyWithoutUserNestedInput
tripReviews?: Prisma.TripReviewUpdateManyWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUpdateManyWithoutReviewedByNestedInput
}
export type UserUncheckedUpdateWithoutOrganizerVerificationInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
name?: Prisma.StringFieldUpdateOperationsInput | string
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUncheckedUpdateManyWithoutOrganizerNestedInput
participations?: Prisma.TripParticipantUncheckedUpdateManyWithoutUserNestedInput
tripReviews?: Prisma.TripReviewUncheckedUpdateManyWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedUpdateManyWithoutReviewedByNestedInput
}
export type UserUpsertWithoutReviewedVerificationsInput = {
update: Prisma.XOR<Prisma.UserUpdateWithoutReviewedVerificationsInput, Prisma.UserUncheckedUpdateWithoutReviewedVerificationsInput>
create: Prisma.XOR<Prisma.UserCreateWithoutReviewedVerificationsInput, Prisma.UserUncheckedCreateWithoutReviewedVerificationsInput>
where?: Prisma.UserWhereInput
}
export type UserUpdateToOneWithWhereWithoutReviewedVerificationsInput = {
where?: Prisma.UserWhereInput
data: Prisma.XOR<Prisma.UserUpdateWithoutReviewedVerificationsInput, Prisma.UserUncheckedUpdateWithoutReviewedVerificationsInput>
}
export type UserUpdateWithoutReviewedVerificationsInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
name?: Prisma.StringFieldUpdateOperationsInput | string
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUpdateManyWithoutOrganizerNestedInput
participations?: Prisma.TripParticipantUpdateManyWithoutUserNestedInput
tripReviews?: Prisma.TripReviewUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUpdateOneWithoutUserNestedInput
}
export type UserUncheckedUpdateWithoutReviewedVerificationsInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
name?: Prisma.StringFieldUpdateOperationsInput | string
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUncheckedUpdateManyWithoutOrganizerNestedInput
participations?: Prisma.TripParticipantUncheckedUpdateManyWithoutUserNestedInput
tripReviews?: Prisma.TripReviewUncheckedUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedUpdateOneWithoutUserNestedInput
}
export type UserCreateWithoutTripsInput = {
id?: string
name: string
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
participations?: Prisma.TripParticipantCreateNestedManyWithoutUserInput
tripReviews?: Prisma.TripReviewCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationCreateNestedOneWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationCreateNestedManyWithoutReviewedByInput
}
export type UserUncheckedCreateWithoutTripsInput = {
@@ -474,11 +712,14 @@ export type UserUncheckedCreateWithoutTripsInput = {
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
participations?: Prisma.TripParticipantUncheckedCreateNestedManyWithoutUserInput
tripReviews?: Prisma.TripReviewUncheckedCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedCreateNestedOneWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedCreateNestedManyWithoutReviewedByInput
}
export type UserCreateOrConnectWithoutTripsInput = {
@@ -503,11 +744,14 @@ export type UserUpdateWithoutTripsInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
participations?: Prisma.TripParticipantUpdateManyWithoutUserNestedInput
tripReviews?: Prisma.TripReviewUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUpdateOneWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUpdateManyWithoutReviewedByNestedInput
}
export type UserUncheckedUpdateWithoutTripsInput = {
@@ -516,11 +760,14 @@ export type UserUncheckedUpdateWithoutTripsInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
participations?: Prisma.TripParticipantUncheckedUpdateManyWithoutUserNestedInput
tripReviews?: Prisma.TripReviewUncheckedUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedUpdateOneWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedUpdateManyWithoutReviewedByNestedInput
}
export type UserCreateWithoutTripReviewsInput = {
@@ -529,11 +776,14 @@ export type UserCreateWithoutTripReviewsInput = {
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripCreateNestedManyWithoutOrganizerInput
participations?: Prisma.TripParticipantCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationCreateNestedOneWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationCreateNestedManyWithoutReviewedByInput
}
export type UserUncheckedCreateWithoutTripReviewsInput = {
@@ -542,11 +792,14 @@ export type UserUncheckedCreateWithoutTripReviewsInput = {
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripUncheckedCreateNestedManyWithoutOrganizerInput
participations?: Prisma.TripParticipantUncheckedCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedCreateNestedOneWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedCreateNestedManyWithoutReviewedByInput
}
export type UserCreateOrConnectWithoutTripReviewsInput = {
@@ -571,11 +824,14 @@ export type UserUpdateWithoutTripReviewsInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUpdateManyWithoutOrganizerNestedInput
participations?: Prisma.TripParticipantUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUpdateOneWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUpdateManyWithoutReviewedByNestedInput
}
export type UserUncheckedUpdateWithoutTripReviewsInput = {
@@ -584,11 +840,14 @@ export type UserUncheckedUpdateWithoutTripReviewsInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUncheckedUpdateManyWithoutOrganizerNestedInput
participations?: Prisma.TripParticipantUncheckedUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedUpdateOneWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedUpdateManyWithoutReviewedByNestedInput
}
export type UserCreateWithoutParticipationsInput = {
@@ -597,11 +856,14 @@ export type UserCreateWithoutParticipationsInput = {
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripCreateNestedManyWithoutOrganizerInput
tripReviews?: Prisma.TripReviewCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationCreateNestedOneWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationCreateNestedManyWithoutReviewedByInput
}
export type UserUncheckedCreateWithoutParticipationsInput = {
@@ -610,11 +872,14 @@ export type UserUncheckedCreateWithoutParticipationsInput = {
email: string
password: string
image?: string | null
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: Date | string | null
createdAt?: Date | string
updatedAt?: Date | string
trips?: Prisma.TripUncheckedCreateNestedManyWithoutOrganizerInput
tripReviews?: Prisma.TripReviewUncheckedCreateNestedManyWithoutUserInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedCreateNestedOneWithoutUserInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedCreateNestedManyWithoutReviewedByInput
}
export type UserCreateOrConnectWithoutParticipationsInput = {
@@ -639,11 +904,14 @@ export type UserUpdateWithoutParticipationsInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUpdateManyWithoutOrganizerNestedInput
tripReviews?: Prisma.TripReviewUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUpdateOneWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUpdateManyWithoutReviewedByNestedInput
}
export type UserUncheckedUpdateWithoutParticipationsInput = {
@@ -652,11 +920,14 @@ export type UserUncheckedUpdateWithoutParticipationsInput = {
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedTermsAndPrivacy?: Prisma.BoolFieldUpdateOperationsInput | boolean
acceptedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
trips?: Prisma.TripUncheckedUpdateManyWithoutOrganizerNestedInput
tripReviews?: Prisma.TripReviewUncheckedUpdateManyWithoutUserNestedInput
organizerVerification?: Prisma.OrganizerVerificationUncheckedUpdateOneWithoutUserNestedInput
reviewedVerifications?: Prisma.OrganizerVerificationUncheckedUpdateManyWithoutReviewedByNestedInput
}
@@ -668,12 +939,14 @@ export type UserCountOutputType = {
trips: number
participations: number
tripReviews: number
reviewedVerifications: number
}
export type UserCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
trips?: boolean | UserCountOutputTypeCountTripsArgs
participations?: boolean | UserCountOutputTypeCountParticipationsArgs
tripReviews?: boolean | UserCountOutputTypeCountTripReviewsArgs
reviewedVerifications?: boolean | UserCountOutputTypeCountReviewedVerificationsArgs
}
/**
@@ -707,6 +980,13 @@ export type UserCountOutputTypeCountTripReviewsArgs<ExtArgs extends runtime.Type
where?: Prisma.TripReviewWhereInput
}
/**
* UserCountOutputType without action
*/
export type UserCountOutputTypeCountReviewedVerificationsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
where?: Prisma.OrganizerVerificationWhereInput
}
export type UserSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
id?: boolean
@@ -714,12 +994,15 @@ export type UserSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = r
email?: boolean
password?: boolean
image?: boolean
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: boolean
createdAt?: boolean
updatedAt?: boolean
trips?: boolean | Prisma.User$tripsArgs<ExtArgs>
participations?: boolean | Prisma.User$participationsArgs<ExtArgs>
tripReviews?: boolean | Prisma.User$tripReviewsArgs<ExtArgs>
organizerVerification?: boolean | Prisma.User$organizerVerificationArgs<ExtArgs>
reviewedVerifications?: boolean | Prisma.User$reviewedVerificationsArgs<ExtArgs>
_count?: boolean | Prisma.UserCountOutputTypeDefaultArgs<ExtArgs>
}, ExtArgs["result"]["user"]>
@@ -729,7 +1012,8 @@ export type UserSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensio
email?: boolean
password?: boolean
image?: boolean
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: boolean
createdAt?: boolean
updatedAt?: boolean
}, ExtArgs["result"]["user"]>
@@ -740,7 +1024,8 @@ export type UserSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensio
email?: boolean
password?: boolean
image?: boolean
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: boolean
createdAt?: boolean
updatedAt?: boolean
}, ExtArgs["result"]["user"]>
@@ -751,16 +1036,19 @@ export type UserSelectScalar = {
email?: boolean
password?: boolean
image?: boolean
isVerified?: boolean
acceptedTermsAndPrivacy?: boolean
acceptedAt?: boolean
createdAt?: boolean
updatedAt?: boolean
}
export type UserOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "name" | "email" | "password" | "image" | "isVerified" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]>
export type UserOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "name" | "email" | "password" | "image" | "acceptedTermsAndPrivacy" | "acceptedAt" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]>
export type UserInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
trips?: boolean | Prisma.User$tripsArgs<ExtArgs>
participations?: boolean | Prisma.User$participationsArgs<ExtArgs>
tripReviews?: boolean | Prisma.User$tripReviewsArgs<ExtArgs>
organizerVerification?: boolean | Prisma.User$organizerVerificationArgs<ExtArgs>
reviewedVerifications?: boolean | Prisma.User$reviewedVerificationsArgs<ExtArgs>
_count?: boolean | Prisma.UserCountOutputTypeDefaultArgs<ExtArgs>
}
export type UserIncludeCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {}
@@ -772,6 +1060,8 @@ export type $UserPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
trips: Prisma.$TripPayload<ExtArgs>[]
participations: Prisma.$TripParticipantPayload<ExtArgs>[]
tripReviews: Prisma.$TripReviewPayload<ExtArgs>[]
organizerVerification: Prisma.$OrganizerVerificationPayload<ExtArgs> | null
reviewedVerifications: Prisma.$OrganizerVerificationPayload<ExtArgs>[]
}
scalars: runtime.Types.Extensions.GetPayloadResult<{
id: string
@@ -780,9 +1070,13 @@ export type $UserPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
password: string
image: string | null
/**
* Akun diverifikasi tim SeTrip (manual / admin) — tampil sebagai badge kepercayaan
* Apakah user telah menyetujui Syarat & Ketentuan dan Kebijakan Privasi
*/
isVerified: boolean
acceptedTermsAndPrivacy: boolean
/**
* Waktu user menyetujui Syarat & Ketentuan dan Kebijakan Privasi
*/
acceptedAt: Date | null
createdAt: Date
updatedAt: Date
}, ExtArgs["result"]["user"]>
@@ -1182,6 +1476,8 @@ export interface Prisma__UserClient<T, Null = never, ExtArgs extends runtime.Typ
trips<T extends Prisma.User$tripsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$tripsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$TripPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null>
participations<T extends Prisma.User$participationsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$participationsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$TripParticipantPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null>
tripReviews<T extends Prisma.User$tripReviewsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$tripReviewsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$TripReviewPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null>
organizerVerification<T extends Prisma.User$organizerVerificationArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$organizerVerificationArgs<ExtArgs>>): Prisma.Prisma__OrganizerVerificationClient<runtime.Types.Result.GetResult<Prisma.$OrganizerVerificationPayload<ExtArgs>, T, "findUniqueOrThrow", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions>
reviewedVerifications<T extends Prisma.User$reviewedVerificationsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$reviewedVerificationsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$OrganizerVerificationPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null>
/**
* Attaches callbacks for the resolution and/or rejection of the Promise.
* @param onfulfilled The callback to execute when the Promise is resolved.
@@ -1216,7 +1512,8 @@ export interface UserFieldRefs {
readonly email: Prisma.FieldRef<"User", 'String'>
readonly password: Prisma.FieldRef<"User", 'String'>
readonly image: Prisma.FieldRef<"User", 'String'>
readonly isVerified: Prisma.FieldRef<"User", 'Boolean'>
readonly acceptedTermsAndPrivacy: Prisma.FieldRef<"User", 'Boolean'>
readonly acceptedAt: Prisma.FieldRef<"User", 'DateTime'>
readonly createdAt: Prisma.FieldRef<"User", 'DateTime'>
readonly updatedAt: Prisma.FieldRef<"User", 'DateTime'>
}
@@ -1683,6 +1980,49 @@ export type User$tripReviewsArgs<ExtArgs extends runtime.Types.Extensions.Intern
distinct?: Prisma.TripReviewScalarFieldEnum | Prisma.TripReviewScalarFieldEnum[]
}
/**
* User.organizerVerification
*/
export type User$organizerVerificationArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/**
* Select specific fields to fetch from the OrganizerVerification
*/
select?: Prisma.OrganizerVerificationSelect<ExtArgs> | null
/**
* Omit specific fields from the OrganizerVerification
*/
omit?: Prisma.OrganizerVerificationOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.OrganizerVerificationInclude<ExtArgs> | null
where?: Prisma.OrganizerVerificationWhereInput
}
/**
* User.reviewedVerifications
*/
export type User$reviewedVerificationsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/**
* Select specific fields to fetch from the OrganizerVerification
*/
select?: Prisma.OrganizerVerificationSelect<ExtArgs> | null
/**
* Omit specific fields from the OrganizerVerification
*/
omit?: Prisma.OrganizerVerificationOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.OrganizerVerificationInclude<ExtArgs> | null
where?: Prisma.OrganizerVerificationWhereInput
orderBy?: Prisma.OrganizerVerificationOrderByWithRelationInput | Prisma.OrganizerVerificationOrderByWithRelationInput[]
cursor?: Prisma.OrganizerVerificationWhereUniqueInput
take?: number
skip?: number
distinct?: Prisma.OrganizerVerificationScalarFieldEnum | Prisma.OrganizerVerificationScalarFieldEnum[]
}
/**
* User without action
*/
+12
View File
@@ -0,0 +1,12 @@
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Kebijakan Privasi",
description:
"Kebijakan Privasi SeTrip. Pelajari bagaimana kami mengumpulkan, menggunakan, dan melindungi data Anda.",
alternates: { canonical: "/privacy" },
};
export default function PrivacyLayout({ children }: { children: React.ReactNode }) {
return children;
}
+235
View File
@@ -0,0 +1,235 @@
import Link from "next/link";
export default function PrivacyPage() {
return (
<div className="mx-auto max-w-3xl px-4 py-8 sm:py-12">
<article className="rounded-2xl border border-neutral-200 bg-white p-6 shadow-sm sm:p-10">
<header className="mb-8 border-b border-neutral-200 pb-6">
<h1 className="text-2xl font-bold text-neutral-900 sm:text-3xl">
🔒 Kebijakan Privasi SeTrip
</h1>
<p className="mt-2 text-sm text-neutral-500">
Terakhir diperbarui: 2026-04-27
</p>
<p className="mt-4 text-sm leading-relaxed text-neutral-700">
SeTrip menghargai privasi Anda. Kebijakan Privasi ini menjelaskan
bagaimana kami mengumpulkan, menggunakan, dan melindungi informasi
Anda saat menggunakan platform SeTrip. Dengan menggunakan SeTrip,
Anda menyetujui praktik yang dijelaskan dalam Kebijakan Privasi ini.
</p>
</header>
<div className="space-y-8 text-sm leading-relaxed text-neutral-700">
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
1. Informasi yang Kami Kumpulkan
</h2>
<h3 className="mb-2 mt-4 font-semibold text-neutral-800">a. Informasi Akun</h3>
<ul className="ml-5 list-disc space-y-1.5">
<li>Nama</li>
<li>Email</li>
<li>Nomor telepon</li>
<li>Password (disimpan dalam bentuk terenkripsi)</li>
</ul>
<h3 className="mb-2 mt-4 font-semibold text-neutral-800">b. Informasi Profil</h3>
<ul className="ml-5 list-disc space-y-1.5">
<li>Foto profil</li>
<li>Deskripsi diri</li>
<li>Riwayat trip</li>
</ul>
<h3 className="mb-2 mt-4 font-semibold text-neutral-800">c. Informasi Transaksi</h3>
<ul className="ml-5 list-disc space-y-1.5">
<li>Data booking trip</li>
<li>Status pembayaran</li>
<li>Riwayat aktivitas</li>
</ul>
<h3 className="mb-2 mt-4 font-semibold text-neutral-800">d. Informasi Teknis</h3>
<ul className="ml-5 list-disc space-y-1.5">
<li>Alamat IP</li>
<li>Browser</li>
<li>Perangkat yang digunakan</li>
<li>Log aktivitas</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
2. Cara Kami Menggunakan Informasi
</h2>
<p className="mb-3">Kami menggunakan informasi Anda untuk:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Membuat dan mengelola akun</li>
<li>Menghubungkan pengguna dengan organizer</li>
<li>Memproses booking dan aktivitas trip</li>
<li>Meningkatkan layanan dan pengalaman pengguna</li>
<li>Mengirim notifikasi terkait aktivitas</li>
<li>Mencegah penipuan dan penyalahgunaan</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">3. Pembagian Informasi</h2>
<p className="mb-3">
Kami tidak menjual data pribadi Anda. Namun, kami dapat membagikan
informasi dalam kondisi berikut:
</p>
<h3 className="mb-2 mt-4 font-semibold text-neutral-800">a. Dengan Organizer</h3>
<ul className="ml-5 list-disc space-y-1.5">
<li>
Informasi dasar seperti nama dan kontak dapat dibagikan kepada
organizer untuk keperluan trip
</li>
</ul>
<h3 className="mb-2 mt-4 font-semibold text-neutral-800">
b. Dengan Penyedia Layanan
</h3>
<ul className="ml-5 list-disc space-y-1.5">
<li>Untuk kebutuhan teknis (hosting, analytics, dll)</li>
</ul>
<h3 className="mb-2 mt-4 font-semibold text-neutral-800">c. Kewajiban Hukum</h3>
<ul className="ml-5 list-disc space-y-1.5">
<li>Jika diminta oleh hukum atau otoritas berwenang</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">4. Keamanan Data</h2>
<p className="mb-3">Kami berusaha melindungi data Anda dengan:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Enkripsi password</li>
<li>Pembatasan akses data</li>
<li>Sistem keamanan standar industri</li>
</ul>
<p className="mt-3">Namun, tidak ada sistem yang 100% aman.</p>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">5. Penyimpanan Data</h2>
<p className="mb-3">Kami menyimpan data Anda selama:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Akun Anda aktif</li>
<li>Dibutuhkan untuk keperluan layanan</li>
</ul>
<p className="mt-3">
Data dapat dihapus atas permintaan pengguna, kecuali diwajibkan
oleh hukum untuk disimpan.
</p>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">6. Hak Pengguna</h2>
<p className="mb-3">Anda memiliki hak untuk:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Mengakses data pribadi Anda</li>
<li>Memperbarui informasi</li>
<li>Menghapus akun</li>
<li>Menarik persetujuan</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">7. Cookie &amp; Tracking</h2>
<p className="mb-3">SeTrip dapat menggunakan:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Cookie</li>
<li>Teknologi pelacakan sederhana</li>
</ul>
<p className="mt-3 mb-2">Untuk:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Menyimpan sesi login</li>
<li>Meningkatkan pengalaman pengguna</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
8. Layanan Pihak Ketiga
</h2>
<p className="mb-3">SeTrip dapat menggunakan layanan pihak ketiga seperti:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Hosting</li>
<li>Analytics</li>
<li>Payment gateway (di masa depan)</li>
</ul>
<p className="mt-3">
Kami tidak bertanggung jawab atas kebijakan privasi pihak ketiga
tersebut.
</p>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
9. Perlindungan terhadap Penipuan
</h2>
<p className="mb-3">Kami dapat menggunakan data untuk:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Mendeteksi aktivitas mencurigakan</li>
<li>Mencegah penipuan</li>
<li>Melindungi pengguna lain</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
10. Perubahan Kebijakan Privasi
</h2>
<p className="mb-3">
SeTrip dapat memperbarui Kebijakan Privasi ini sewaktu-waktu.
Pengguna disarankan untuk:
</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Membaca secara berkala</li>
<li>Memahami perubahan yang berlaku</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">11. Kontak</h2>
<p>
Jika Anda memiliki pertanyaan mengenai Kebijakan Privasi ini,
silakan hubungi:{" "}
<a
href="mailto:support@setrip.com"
className="font-semibold text-primary-600 hover:text-primary-700"
>
support@setrip.com
</a>
</p>
</section>
<section className="rounded-xl bg-neutral-50 p-5">
<h2 className="mb-2 text-lg font-bold text-neutral-900"> Persetujuan</h2>
<p className="mb-2">
Dengan menggunakan SeTrip, Anda menyatakan bahwa:
</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Telah membaca</li>
<li>Memahami</li>
<li>Menyetujui Kebijakan Privasi ini</li>
</ul>
</section>
</div>
<footer className="mt-10 border-t border-neutral-200 pt-6 text-sm">
<p className="text-neutral-500">
Lihat juga{" "}
<Link
href="/terms"
className="font-semibold text-primary-600 hover:text-primary-700"
>
Syarat &amp; Ketentuan
</Link>
.
</p>
</footer>
</article>
</div>
);
}
+31
View File
@@ -140,6 +140,37 @@ export default function RegisterPage() {
/>
</div>
<label className="flex items-start gap-2.5 text-sm text-neutral-700">
<input
id="acceptedTermsAndPrivacy"
name="acceptedTermsAndPrivacy"
type="checkbox"
required
className="mt-0.5 h-4 w-4 shrink-0 rounded border-neutral-300 text-primary-600 focus:ring-primary-500"
/>
<span>
Saya menyetujui{" "}
<Link
href="/terms"
target="_blank"
rel="noopener noreferrer"
className="font-semibold text-primary-600 hover:text-primary-700"
>
Syarat &amp; Ketentuan
</Link>{" "}
dan{" "}
<Link
href="/privacy"
target="_blank"
rel="noopener noreferrer"
className="font-semibold text-primary-600 hover:text-primary-700"
>
Kebijakan Privasi
</Link>
.
</span>
</label>
<button
type="submit"
disabled={loading}
+12
View File
@@ -30,6 +30,18 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
changeFrequency: "yearly",
priority: 0.3,
},
{
url: absoluteUrl("/terms"),
lastModified: now,
changeFrequency: "yearly",
priority: 0.2,
},
{
url: absoluteUrl("/privacy"),
lastModified: now,
changeFrequency: "yearly",
priority: 0.2,
},
];
const tripEntries: MetadataRoute.Sitemap = trips.map((t) => ({
+12
View File
@@ -0,0 +1,12 @@
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Syarat & Ketentuan",
description:
"Syarat & Ketentuan penggunaan platform SeTrip. Baca sebelum menggunakan layanan SeTrip.",
alternates: { canonical: "/terms" },
};
export default function TermsLayout({ children }: { children: React.ReactNode }) {
return children;
}
+292
View File
@@ -0,0 +1,292 @@
import Link from "next/link";
export default function TermsPage() {
return (
<div className="mx-auto max-w-3xl px-4 py-8 sm:py-12">
<article className="rounded-2xl border border-neutral-200 bg-white p-6 shadow-sm sm:p-10">
<header className="mb-8 border-b border-neutral-200 pb-6">
<h1 className="text-2xl font-bold text-neutral-900 sm:text-3xl">
📜 Syarat &amp; Ketentuan SeTrip
</h1>
<p className="mt-2 text-sm text-neutral-500">
Terakhir diperbarui: 2026-04-27
</p>
<p className="mt-4 text-sm leading-relaxed text-neutral-700">
Selamat datang di SeTrip. Dengan mengakses atau menggunakan platform
SeTrip, Anda menyetujui untuk terikat oleh Syarat &amp; Ketentuan
berikut.
</p>
</header>
<div className="space-y-8 text-sm leading-relaxed text-neutral-700">
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">1. Definisi</h2>
<ul className="ml-5 list-disc space-y-1.5">
<li>
<strong>SeTrip</strong>: Platform yang menghubungkan pengguna
dengan penyelenggara trip.
</li>
<li>
<strong>Pengguna (User)</strong>: Individu yang menggunakan
aplikasi SeTrip.
</li>
<li>
<strong>Organizer (Penyelenggara)</strong>: Pengguna yang membuat
dan mengelola trip.
</li>
<li>
<strong>Trip</strong>: Kegiatan perjalanan yang dibuat oleh
organizer.
</li>
<li>
<strong>Platform</strong>: Website atau aplikasi SeTrip.
</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">2. Peran SeTrip</h2>
<p className="mb-3">
SeTrip bertindak sebagai <strong>platform perantara</strong> yang
menghubungkan pengguna dan organizer. SeTrip:
</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Bukan penyelenggara trip</li>
<li>Tidak terlibat langsung dalam pelaksanaan perjalanan</li>
<li>Tidak bertanggung jawab atas kegiatan selama trip berlangsung</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
3. Penggunaan Platform
</h2>
<p className="mb-3">
Dengan menggunakan SeTrip, Anda menyatakan bahwa:
</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Berusia minimal 18 tahun atau memiliki izin dari wali</li>
<li>Memberikan informasi yang benar dan akurat</li>
<li>
Tidak menggunakan platform untuk: penipuan, aktivitas ilegal,
atau penyebaran informasi palsu
</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">4. Akun Pengguna</h2>
<ul className="ml-5 list-disc space-y-1.5">
<li>Pengguna bertanggung jawab atas keamanan akun masing-masing</li>
<li>Dilarang membagikan akun kepada pihak lain</li>
<li>
SeTrip berhak menangguhkan atau menghapus akun jika terjadi
pelanggaran
</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">5. Trip &amp; Booking</h2>
<ul className="ml-5 list-disc space-y-1.5">
<li>Organizer bertanggung jawab atas seluruh informasi trip</li>
<li>Pengguna wajib membaca detail trip sebelum melakukan join</li>
<li>
Dengan melakukan join trip, pengguna menyetujui seluruh ketentuan
trip yang dibuat oleh organizer
</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">6. Pembayaran</h2>
<ul className="ml-5 list-disc space-y-1.5">
<li>Pembayaran dilakukan sesuai metode yang tersedia di platform</li>
<li>
Dalam fase awal, pembayaran dapat dilakukan langsung kepada
organizer
</li>
<li>
SeTrip tidak menjamin keamanan transaksi yang dilakukan di luar
platform
</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
7. Pembatalan &amp; Refund
</h2>
<ul className="ml-5 list-disc space-y-1.5">
<li>Kebijakan pembatalan ditentukan oleh organizer</li>
<li>
SeTrip tidak bertanggung jawab atas refund yang tidak diberikan
oleh organizer
</li>
<li>
Pengguna disarankan untuk memahami kebijakan sebelum melakukan
pembayaran
</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
8. Tanggung Jawab Organizer
</h2>
<p className="mb-3">Organizer wajib:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Memberikan informasi trip yang jelas dan akurat</li>
<li>Menjalankan trip sesuai deskripsi</li>
<li>Bertanggung jawab atas keselamatan peserta selama trip</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">9. Risiko Perjalanan</h2>
<p className="mb-3">
Pengguna memahami bahwa aktivitas perjalanan, terutama kegiatan
outdoor, memiliki risiko termasuk namun tidak terbatas pada:
</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Cedera</li>
<li>Kecelakaan</li>
<li>Cuaca ekstrem</li>
<li>Kondisi tak terduga lainnya</li>
</ul>
<blockquote className="mt-3 border-l-4 border-primary-500 bg-primary-50 px-4 py-3 italic text-neutral-700">
Mengikuti kegiatan secara sadar dan bertanggung jawab atas risiko
pribadi
</blockquote>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
10. Batasan Tanggung Jawab
</h2>
<p className="mb-3">SeTrip tidak bertanggung jawab atas:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Kerugian finansial</li>
<li>Cedera atau kecelakaan</li>
<li>Kegagalan pelaksanaan trip</li>
<li>Tindakan organizer atau pengguna lain</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
11. Larangan Transaksi di Luar Platform
</h2>
<p className="mb-3">
Pengguna disarankan untuk tidak melakukan transaksi di luar
platform. SeTrip tidak bertanggung jawab atas:
</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Penipuan</li>
<li>Kerugian</li>
<li>Masalah lain yang terjadi akibat transaksi di luar sistem SeTrip</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">12. Sistem Review</h2>
<ul className="ml-5 list-disc space-y-1.5">
<li>Pengguna dapat memberikan review setelah trip</li>
<li>Review harus jujur dan tidak mengandung unsur fitnah</li>
<li>SeTrip berhak menghapus review yang melanggar</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
13. Penangguhan &amp; Penghentian Akun
</h2>
<p className="mb-3">SeTrip berhak untuk:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Menangguhkan akun</li>
<li>Menghapus akun</li>
<li>Membatasi akses</li>
</ul>
<p className="mt-3 mb-3">Jika pengguna:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Melanggar ketentuan</li>
<li>Terindikasi melakukan penipuan</li>
<li>Menyalahgunakan platform</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">14. Perubahan Layanan</h2>
<p className="mb-3">SeTrip dapat:</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Mengubah fitur</li>
<li>Menghentikan layanan</li>
<li>Menambahkan kebijakan baru</li>
</ul>
<p className="mt-3">Tanpa pemberitahuan sebelumnya.</p>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">
15. Perubahan Syarat &amp; Ketentuan
</h2>
<p className="mb-3">
SeTrip dapat memperbarui Syarat &amp; Ketentuan ini kapan saja.
Pengguna disarankan untuk:
</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Membaca secara berkala</li>
<li>Memahami perubahan yang berlaku</li>
</ul>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">16. Hukum yang Berlaku</h2>
<p>
Syarat &amp; Ketentuan ini diatur oleh hukum yang berlaku di
Republik Indonesia.
</p>
</section>
<section>
<h2 className="mb-3 text-lg font-bold text-neutral-900">17. Kontak</h2>
<p>
Jika Anda memiliki pertanyaan, silakan hubungi:{" "}
<a
href="mailto:support@setrip.com"
className="font-semibold text-primary-600 hover:text-primary-700"
>
support@setrip.com
</a>
</p>
</section>
<section className="rounded-xl bg-neutral-50 p-5">
<h2 className="mb-2 text-lg font-bold text-neutral-900"> Persetujuan</h2>
<p className="mb-2">
Dengan menggunakan SeTrip, Anda menyatakan bahwa:
</p>
<ul className="ml-5 list-disc space-y-1.5">
<li>Telah membaca</li>
<li>Memahami</li>
<li>Menyetujui seluruh isi Syarat &amp; Ketentuan ini</li>
</ul>
</section>
</div>
<footer className="mt-10 border-t border-neutral-200 pt-6 text-sm">
<p className="text-neutral-500">
Lihat juga{" "}
<Link
href="/privacy"
className="font-semibold text-primary-600 hover:text-primary-700"
>
Kebijakan Privasi
</Link>
.
</p>
</footer>
</article>
</div>
);
}
+13
View File
@@ -0,0 +1,13 @@
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Verifikasi Organizer",
description:
"Ajukan verifikasi sebagai organizer SeTrip dengan KTP & data rekening untuk membuat trip berbayar.",
alternates: { canonical: "/verify" },
robots: { index: false, follow: false },
};
export default function VerifyLayout({ children }: { children: React.ReactNode }) {
return children;
}
+79
View File
@@ -0,0 +1,79 @@
import { redirect } from "next/navigation";
import Link from "next/link";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import { organizerService } from "@/server/services/organizer.service";
import { VerifyForm } from "@/features/organizer/components/verify-form";
import { VerifiedBadge } from "@/components/shared/verified-badge";
export default async function VerifyPage() {
const session = await getServerSession(authOptions);
if (!session?.user) {
redirect("/login?callbackUrl=/verify");
}
const verification = await organizerService.getStatusForUser(session.user.id);
return (
<div className="mx-auto max-w-2xl px-4 py-8 sm:py-12">
<div className="mb-6">
<h1 className="text-2xl font-bold text-neutral-900 sm:text-3xl">
Verifikasi Organizer
</h1>
<p className="mt-2 text-sm text-neutral-600">
Lengkapi data berikut untuk mengaktifkan kemampuan membuat trip berbayar.
</p>
</div>
{verification?.status === "APPROVED" && (
<div className="mb-6 rounded-2xl border border-primary-200 bg-primary-50 p-5">
<div className="mb-2 flex items-center gap-2">
<VerifiedBadge size="md" />
<span className="text-sm font-semibold text-primary-800">
Akun terverifikasi
</span>
</div>
<p className="text-sm text-neutral-700">
Selamat! Kamu sudah bisa membuat trip berbayar.
</p>
</div>
)}
{verification?.status === "PENDING" && (
<div className="mb-6 rounded-2xl border border-amber-200 bg-amber-50 p-5">
<p className="mb-1 text-sm font-bold text-amber-800">
Menunggu review admin
</p>
<p className="text-sm text-neutral-700">
Pengajuanmu sedang diproses. Kami akan memberitahu via email setelah selesai.
</p>
</div>
)}
{verification?.status === "REJECTED" && (
<div className="mb-6 rounded-2xl border border-red-200 bg-red-50 p-5">
<p className="mb-1 text-sm font-bold text-red-800"> Pengajuan ditolak</p>
{verification.rejectionReason && (
<p className="text-sm text-neutral-700">
<span className="font-semibold">Alasan:</span>{" "}
{verification.rejectionReason}
</p>
)}
<p className="mt-2 text-sm text-neutral-700">
Kamu bisa memperbaiki data dan mengajukan ulang di bawah.
</p>
</div>
)}
{verification?.status !== "APPROVED" && verification?.status !== "PENDING" && (
<VerifyForm initial={verification ?? null} />
)}
<p className="mt-6 text-center text-sm text-neutral-500">
<Link href="/profile" className="hover:text-primary-600">
Kembali ke profil
</Link>
</p>
</div>
);
}