Implement event registration functionality: Add EventRegistration model to Prisma schema, enabling user event registrations. Enhance EventsPageSection component with registration checks, calendar view, and improved event display. Refactor event rendering logic to separate upcoming and past events, improving user experience.

This commit is contained in:
Julien Froidefond
2025-12-09 21:53:10 +01:00
parent 5ae6cde14e
commit 50a2eaf109
13 changed files with 2483 additions and 61 deletions

View File

@@ -0,0 +1,140 @@
import { NextResponse } from "next/server";
import { auth } from "@/lib/auth";
import { prisma } from "@/lib/prisma";
export async function POST(
request: Request,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const session = await auth();
if (!session?.user?.id) {
return NextResponse.json(
{ error: "Vous devez être connecté pour vous inscrire" },
{ status: 401 }
);
}
const { id: eventId } = await params;
// Vérifier si l'événement existe
const event = await prisma.event.findUnique({
where: { id: eventId },
});
if (!event) {
return NextResponse.json(
{ error: "Événement introuvable" },
{ status: 404 }
);
}
if (event.status !== "UPCOMING") {
return NextResponse.json(
{ error: "Vous ne pouvez vous inscrire qu'aux événements à venir" },
{ status: 400 }
);
}
// Vérifier si l'utilisateur est déjà inscrit
const existingRegistration = await prisma.eventRegistration.findUnique({
where: {
userId_eventId: {
userId: session.user.id,
eventId: eventId,
},
},
});
if (existingRegistration) {
return NextResponse.json(
{ error: "Vous êtes déjà inscrit à cet événement" },
{ status: 400 }
);
}
// Créer l'inscription
const registration = await prisma.eventRegistration.create({
data: {
userId: session.user.id,
eventId: eventId,
},
});
return NextResponse.json(
{ message: "Inscription réussie", registration },
{ status: 201 }
);
} catch (error) {
console.error("Registration error:", error);
return NextResponse.json(
{ error: "Une erreur est survenue lors de l'inscription" },
{ status: 500 }
);
}
}
export async function DELETE(
request: Request,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const session = await auth();
if (!session?.user?.id) {
return NextResponse.json(
{ error: "Vous devez être connecté" },
{ status: 401 }
);
}
const { id: eventId } = await params;
// Supprimer l'inscription
await prisma.eventRegistration.deleteMany({
where: {
userId: session.user.id,
eventId: eventId,
},
});
return NextResponse.json({ message: "Inscription annulée" });
} catch (error) {
console.error("Unregistration error:", error);
return NextResponse.json(
{ error: "Une erreur est survenue lors de l'annulation" },
{ status: 500 }
);
}
}
export async function GET(
request: Request,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const session = await auth();
if (!session?.user?.id) {
return NextResponse.json({ registered: false });
}
const { id: eventId } = await params;
const registration = await prisma.eventRegistration.findUnique({
where: {
userId_eventId: {
userId: session.user.id,
eventId: eventId,
},
},
});
return NextResponse.json({ registered: !!registration });
} catch (error) {
console.error("Check registration error:", error);
return NextResponse.json({ registered: false });
}
}

View File

@@ -1,5 +1,9 @@
"use client";
import { useState, useEffect } from "react";
import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation";
interface Event {
id: string;
date: string;
@@ -71,6 +75,365 @@ export default function EventsPageSection({
events,
backgroundImage,
}: EventsPageSectionProps) {
const { data: session } = useSession();
const router = useRouter();
const [registrations, setRegistrations] = useState<Record<string, boolean>>(
{}
);
const [loading, setLoading] = useState<Record<string, boolean>>({});
const [error, setError] = useState<string>("");
const [currentMonth, setCurrentMonth] = useState(new Date());
// Séparer les événements
const upcomingEvents = events.filter(
(e) => e.status === "UPCOMING" || e.status === "LIVE"
);
const pastEvents = events.filter((e) => e.status === "PAST");
// Créer un map des événements par date pour le calendrier
const eventsByDate: Record<string, Event[]> = {};
events.forEach((event) => {
const dateKey = event.date; // YYYY-MM-DD
if (!eventsByDate[dateKey]) {
eventsByDate[dateKey] = [];
}
eventsByDate[dateKey].push(event);
});
// Vérifier les inscriptions au chargement
useEffect(() => {
if (!session?.user?.id) {
return;
}
const checkRegistrations = async () => {
const upcomingOnlyEvents = events.filter((e) => e.status === "UPCOMING");
const registrationChecks = upcomingOnlyEvents.map(async (event) => {
try {
const response = await fetch(`/api/events/${event.id}/register`);
const data = await response.json();
return { eventId: event.id, registered: data.registered || false };
} catch (err) {
console.error("Error checking registration:", err);
return { eventId: event.id, registered: false };
}
});
const results = await Promise.all(registrationChecks);
const registrationsMap: Record<string, boolean> = {};
results.forEach(({ eventId, registered }) => {
registrationsMap[eventId] = registered;
});
setRegistrations(registrationsMap);
};
checkRegistrations();
}, [session?.user?.id, events]);
// Fonctions pour le calendrier
const getDaysInMonth = (date: Date) => {
const year = date.getFullYear();
const month = date.getMonth();
return new Date(year, month + 1, 0).getDate();
};
const getFirstDayOfMonth = (date: Date) => {
const year = date.getFullYear();
const month = date.getMonth();
return new Date(year, month, 1).getDay();
};
const formatMonthYear = (date: Date) => {
return date.toLocaleDateString("fr-FR", {
month: "long",
year: "numeric",
});
};
const renderCalendar = () => {
const daysInMonth = getDaysInMonth(currentMonth);
const firstDay = getFirstDayOfMonth(currentMonth);
const days: (number | null)[] = [];
// Ajouter des jours vides pour le début du mois
for (let i = 0; i < firstDay; i++) {
days.push(null);
}
// Ajouter les jours du mois
for (let day = 1; day <= daysInMonth; day++) {
days.push(day);
}
const year = currentMonth.getFullYear();
const month = currentMonth.getMonth() + 1;
return (
<div className="bg-black/60 border border-pixel-gold/30 rounded-lg p-4 backdrop-blur-sm max-w-2xl mx-auto">
{/* Header du calendrier */}
<div className="flex items-center justify-between mb-3">
<button
onClick={() => {
setCurrentMonth(
new Date(
currentMonth.getFullYear(),
currentMonth.getMonth() - 1
)
);
}}
className="px-2 py-1 border border-pixel-gold/50 text-pixel-gold hover:bg-pixel-gold/10 rounded transition text-sm"
>
</button>
<h3 className="text-base font-bold text-white uppercase tracking-widest">
{formatMonthYear(currentMonth)}
</h3>
<button
onClick={() => {
setCurrentMonth(
new Date(
currentMonth.getFullYear(),
currentMonth.getMonth() + 1
)
);
}}
className="px-2 py-1 border border-pixel-gold/50 text-pixel-gold hover:bg-pixel-gold/10 rounded transition text-sm"
>
</button>
</div>
{/* Jours de la semaine */}
<div className="grid grid-cols-7 gap-0.5 mb-1">
{["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"].map((day) => (
<div
key={day}
className="text-center text-[10px] text-gray-400 font-semibold py-1"
>
{day}
</div>
))}
</div>
{/* Grille du calendrier */}
<div className="grid grid-cols-7 gap-0.5">
{days.map((day, index) => {
if (day === null) {
return <div key={index} className="aspect-square"></div>;
}
const dateKey = `${year}-${String(month).padStart(2, "0")}-${String(
day
).padStart(2, "0")}`;
const dayEvents = eventsByDate[dateKey] || [];
const isToday = new Date().toISOString().split("T")[0] === dateKey;
const hasEvents = dayEvents.length > 0;
// Déterminer la couleur principale selon le type d'événement
const hasUpcoming = dayEvents.some((e) => e.status === "UPCOMING");
const hasLive = dayEvents.some((e) => e.status === "LIVE");
const hasPast = dayEvents.some((e) => e.status === "PAST");
let eventBorderColor = "";
let eventBgColor = "";
if (hasLive) {
eventBorderColor = "border-red-500/80";
eventBgColor = "bg-red-500/20";
} else if (hasUpcoming) {
eventBorderColor = "border-green-500/80";
eventBgColor = "bg-green-500/20";
} else if (hasPast) {
eventBorderColor = "border-gray-500/60";
eventBgColor = "bg-gray-500/15";
}
return (
<div
key={index}
className={`aspect-square border rounded flex flex-col items-center justify-center relative ${
isToday
? "bg-pixel-gold/30 border-pixel-gold/70 border-2"
: hasEvents
? `${eventBgColor} ${eventBorderColor} border-2`
: "border-pixel-gold/10"
} ${
hasEvents ? "ring-2 ring-offset-1 ring-offset-black" : ""
} ${
hasLive
? "ring-red-500/50"
: hasUpcoming
? "ring-green-500/50"
: ""
}`}
>
<div
className={`text-[11px] font-bold ${
isToday
? "text-pixel-gold"
: hasEvents
? "text-white"
: "text-gray-400"
}`}
>
{day}
</div>
{hasEvents && (
<div className="absolute bottom-0.5 left-0 right-0 flex justify-center gap-0.5">
{dayEvents.slice(0, 3).map((event) => (
<div
key={event.id}
className={`w-1 h-1 rounded-full ${
event.status === "UPCOMING"
? "bg-green-400"
: event.status === "LIVE"
? "bg-red-400 animate-pulse"
: "bg-gray-400"
}`}
title={event.name}
/>
))}
{dayEvents.length > 3 && (
<div className="w-1 h-1 rounded-full bg-gray-400" />
)}
</div>
)}
</div>
);
})}
</div>
</div>
);
};
const renderEventCard = (event: Event) => (
<div
key={event.id}
className="bg-black/60 border border-pixel-gold/30 rounded-lg overflow-hidden backdrop-blur-sm hover:border-pixel-gold/50 transition group"
>
{/* Event Header */}
<div
className={`h-2 bg-gradient-to-r ${getEventTypeColor(event.type)}`}
></div>
{/* Event Content */}
<div className="p-6">
{/* Status Badge */}
<div className="flex justify-between items-start mb-4">
{getStatusBadge(event.status)}
<span className="text-pixel-gold text-xs uppercase tracking-widest">
{getEventTypeLabel(event.type)}
</span>
</div>
{/* Date */}
<div className="text-white text-sm font-bold uppercase tracking-widest mb-3">
{event.date}
</div>
{/* Event Name */}
<h3 className="text-xl font-bold text-white mb-3 group-hover:text-pixel-gold transition">
{event.name}
</h3>
{/* Description */}
<p className="text-gray-400 text-sm leading-relaxed mb-4">
{event.description}
</p>
{/* Action Button */}
{event.status === "UPCOMING" && (
<>
{registrations[event.id] ? (
<button
onClick={() => handleUnregister(event.id)}
disabled={loading[event.id]}
className="w-full px-4 py-2 border border-green-500/50 bg-green-900/20 text-green-400 uppercase text-xs tracking-widest rounded hover:bg-green-900/30 transition disabled:opacity-50 disabled:cursor-not-allowed"
>
{loading[event.id] ? "Annulation..." : "Inscrit ✓"}
</button>
) : (
<button
onClick={() => handleRegister(event.id)}
disabled={loading[event.id]}
className="w-full px-4 py-2 border border-pixel-gold/50 bg-black/40 text-white uppercase text-xs tracking-widest rounded hover:bg-pixel-gold/10 hover:border-pixel-gold transition disabled:opacity-50 disabled:cursor-not-allowed"
>
{loading[event.id] ? "Inscription..." : "S'inscrire maintenant"}
</button>
)}
</>
)}
{event.status === "LIVE" && (
<button className="w-full px-4 py-2 border border-red-500/50 bg-red-900/20 text-red-400 uppercase text-xs tracking-widest rounded hover:bg-red-900/30 transition animate-pulse">
Rejoindre en direct
</button>
)}
{event.status === "PAST" && (
<button className="w-full px-4 py-2 border border-gray-600/50 bg-gray-900/20 text-gray-500 uppercase text-xs tracking-widest rounded cursor-not-allowed">
Événement terminé
</button>
)}
</div>
</div>
);
const handleRegister = async (eventId: string) => {
if (!session?.user?.id) {
router.push("/login");
return;
}
setLoading((prev) => ({ ...prev, [eventId]: true }));
setError("");
try {
const response = await fetch(`/api/events/${eventId}/register`, {
method: "POST",
});
const data = await response.json();
if (!response.ok) {
setError(data.error || "Une erreur est survenue");
return;
}
setRegistrations((prev) => ({
...prev,
[eventId]: true,
}));
} catch (err) {
setError("Une erreur est survenue");
} finally {
setLoading((prev) => ({ ...prev, [eventId]: false }));
}
};
const handleUnregister = async (eventId: string) => {
setLoading((prev) => ({ ...prev, [eventId]: true }));
setError("");
try {
const response = await fetch(`/api/events/${eventId}/register`, {
method: "DELETE",
});
if (!response.ok) {
const data = await response.json();
setError(data.error || "Une erreur est survenue");
return;
}
setRegistrations((prev) => ({
...prev,
[eventId]: false,
}));
} catch (err) {
setError("Une erreur est survenue");
} finally {
setLoading((prev) => ({ ...prev, [eventId]: false }));
}
};
return (
<section className="relative w-full min-h-screen flex flex-col items-center justify-center overflow-hidden pt-24 pb-16">
{/* Background Image */}
@@ -109,66 +472,51 @@ export default function EventsPageSection({
</p>
</div>
{/* Events Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{events.map((event) => (
<div
key={event.id}
className="bg-black/60 border border-pixel-gold/30 rounded-lg overflow-hidden backdrop-blur-sm hover:border-pixel-gold/50 transition group"
>
{/* Event Header */}
<div
className={`h-2 bg-gradient-to-r ${getEventTypeColor(
event.type
)}`}
></div>
{/* Event Content */}
<div className="p-6">
{/* Status Badge */}
<div className="flex justify-between items-start mb-4">
{getStatusBadge(event.status)}
<span className="text-pixel-gold text-xs uppercase tracking-widest">
{getEventTypeLabel(event.type)}
</span>
</div>
{/* Date */}
<div className="text-white text-sm font-bold uppercase tracking-widest mb-3">
{event.date}
</div>
{/* Event Name */}
<h3 className="text-xl font-bold text-white mb-3 group-hover:text-pixel-gold transition">
{event.name}
</h3>
{/* Description */}
<p className="text-gray-400 text-sm leading-relaxed mb-4">
{event.description}
</p>
{/* Action Button */}
{event.status === "UPCOMING" && (
<button className="w-full px-4 py-2 border border-pixel-gold/50 bg-black/40 text-white uppercase text-xs tracking-widest rounded hover:bg-pixel-gold/10 hover:border-pixel-gold transition">
S'inscrire maintenant
</button>
)}
{event.status === "LIVE" && (
<button className="w-full px-4 py-2 border border-red-500/50 bg-red-900/20 text-red-400 uppercase text-xs tracking-widest rounded hover:bg-red-900/30 transition animate-pulse">
Rejoindre en direct
</button>
)}
{event.status === "PAST" && (
<button className="w-full px-4 py-2 border border-gray-600/50 bg-gray-900/20 text-gray-500 uppercase text-xs tracking-widest rounded cursor-not-allowed">
Événement terminé
</button>
)}
</div>
{/* Événements à venir */}
{upcomingEvents.length > 0 && (
<div className="mb-16">
<h2 className="text-3xl font-bold text-white mb-8 text-center uppercase tracking-widest">
<span className="bg-gradient-to-r from-green-400 to-green-600 bg-clip-text text-transparent">
Événements à venir
</span>
</h2>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{upcomingEvents.map(renderEventCard)}
</div>
))}
</div>
)}
{/* Calendrier */}
<div className="mb-16">
<h2 className="text-2xl font-bold text-white mb-6 text-center uppercase tracking-widest">
<span className="bg-gradient-to-r from-pixel-gold via-orange-400 to-pixel-gold bg-clip-text text-transparent">
Calendrier
</span>
</h2>
{renderCalendar()}
</div>
{/* Événements passés */}
{pastEvents.length > 0 && (
<div className="mb-16">
<h2 className="text-3xl font-bold text-white mb-8 text-center uppercase tracking-widest">
<span className="bg-gradient-to-r from-gray-400 to-gray-600 bg-clip-text text-transparent">
Événements passés
</span>
</h2>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{pastEvents.map(renderEventCard)}
</div>
</div>
)}
{/* Error Message */}
{error && (
<div className="mt-6 text-center">
<p className="text-red-400 text-sm">{error}</p>
</div>
)}
{/* Footer Info */}
<div className="mt-12 text-center">
<p className="text-gray-500 text-sm">

View File

@@ -32,6 +32,11 @@ export type UserPreferences = Prisma.UserPreferencesModel
*
*/
export type Event = Prisma.EventModel
/**
* Model EventRegistration
*
*/
export type EventRegistration = Prisma.EventRegistrationModel
/**
* Model SitePreferences
*

View File

@@ -54,6 +54,11 @@ export type UserPreferences = Prisma.UserPreferencesModel
*
*/
export type Event = Prisma.EventModel
/**
* Model EventRegistration
*
*/
export type EventRegistration = Prisma.EventRegistrationModel
/**
* Model SitePreferences
*

View File

@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
"clientVersion": "7.1.0",
"engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba",
"activeProvider": "sqlite",
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n SUMMIT\n LAUNCH\n FESTIVAL\n COMPETITION\n}\n\nenum EventStatus {\n UPCOMING\n LIVE\n PAST\n}\n\nmodel User {\n id String @id @default(cuid())\n email String @unique\n password String\n username String @unique\n role Role @default(USER)\n score Int @default(0)\n level Int @default(1)\n hp Int @default(1000)\n maxHp Int @default(1000)\n xp Int @default(0)\n maxXp Int @default(5000)\n avatar String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n preferences UserPreferences?\n\n @@index([score])\n @@index([email])\n}\n\nmodel UserPreferences {\n id String @id @default(cuid())\n userId String @unique\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // Background images for each page\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n\n // Other UI preferences can be added here\n theme String? @default(\"default\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Event {\n id String @id @default(cuid())\n date String\n name String\n description String\n type EventType\n status EventStatus\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([status])\n @@index([date])\n}\n\nmodel SitePreferences {\n id String @id @default(\"global\")\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n",
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n SUMMIT\n LAUNCH\n FESTIVAL\n COMPETITION\n}\n\nenum EventStatus {\n UPCOMING\n LIVE\n PAST\n}\n\nmodel User {\n id String @id @default(cuid())\n email String @unique\n password String\n username String @unique\n role Role @default(USER)\n score Int @default(0)\n level Int @default(1)\n hp Int @default(1000)\n maxHp Int @default(1000)\n xp Int @default(0)\n maxXp Int @default(5000)\n avatar String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n preferences UserPreferences?\n eventRegistrations EventRegistration[]\n\n @@index([score])\n @@index([email])\n}\n\nmodel UserPreferences {\n id String @id @default(cuid())\n userId String @unique\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // Background images for each page\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n\n // Other UI preferences can be added here\n theme String? @default(\"default\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Event {\n id String @id @default(cuid())\n date String\n name String\n description String\n type EventType\n status EventStatus\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n registrations EventRegistration[]\n\n @@index([status])\n @@index([date])\n}\n\nmodel EventRegistration {\n id String @id @default(cuid())\n userId String\n eventId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n\n @@unique([userId, eventId])\n @@index([userId])\n @@index([eventId])\n}\n\nmodel SitePreferences {\n id String @id @default(\"global\")\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n",
"runtimeDataModel": {
"models": {},
"enums": {},
@@ -28,7 +28,7 @@ const config: runtime.GetPrismaClientConfig = {
}
}
config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"username\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"score\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"level\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"hp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxHp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"xp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxXp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"avatar\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"preferences\",\"kind\":\"object\",\"type\":\"UserPreferences\",\"relationName\":\"UserToUserPreferences\"}],\"dbName\":null},\"UserPreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserPreferences\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"theme\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EventStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SitePreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"username\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"score\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"level\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"hp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxHp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"xp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxXp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"avatar\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"preferences\",\"kind\":\"object\",\"type\":\"UserPreferences\",\"relationName\":\"UserToUserPreferences\"},{\"name\":\"eventRegistrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventRegistrationToUser\"}],\"dbName\":null},\"UserPreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserPreferences\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"theme\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EventStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"registrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventToEventRegistration\"}],\"dbName\":null},\"EventRegistration\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventRegistrationToUser\"},{\"name\":\"event\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToEventRegistration\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SitePreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
const { Buffer } = await import('node:buffer')
@@ -204,6 +204,16 @@ export interface PrismaClient<
*/
get event(): Prisma.EventDelegate<ExtArgs, { omit: OmitOpts }>;
/**
* `prisma.eventRegistration`: Exposes CRUD operations for the **EventRegistration** model.
* Example usage:
* ```ts
* // Fetch zero or more EventRegistrations
* const eventRegistrations = await prisma.eventRegistration.findMany()
* ```
*/
get eventRegistration(): Prisma.EventRegistrationDelegate<ExtArgs, { omit: OmitOpts }>;
/**
* `prisma.sitePreferences`: Exposes CRUD operations for the **SitePreferences** model.
* Example usage:

View File

@@ -387,6 +387,7 @@ export const ModelName = {
User: 'User',
UserPreferences: 'UserPreferences',
Event: 'Event',
EventRegistration: 'EventRegistration',
SitePreferences: 'SitePreferences'
} as const
@@ -403,7 +404,7 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
omit: GlobalOmitOptions
}
meta: {
modelProps: "user" | "userPreferences" | "event" | "sitePreferences"
modelProps: "user" | "userPreferences" | "event" | "eventRegistration" | "sitePreferences"
txIsolationLevel: TransactionIsolationLevel
}
model: {
@@ -629,6 +630,80 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
}
}
}
EventRegistration: {
payload: Prisma.$EventRegistrationPayload<ExtArgs>
fields: Prisma.EventRegistrationFieldRefs
operations: {
findUnique: {
args: Prisma.EventRegistrationFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload> | null
}
findUniqueOrThrow: {
args: Prisma.EventRegistrationFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>
}
findFirst: {
args: Prisma.EventRegistrationFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload> | null
}
findFirstOrThrow: {
args: Prisma.EventRegistrationFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>
}
findMany: {
args: Prisma.EventRegistrationFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>[]
}
create: {
args: Prisma.EventRegistrationCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>
}
createMany: {
args: Prisma.EventRegistrationCreateManyArgs<ExtArgs>
result: BatchPayload
}
createManyAndReturn: {
args: Prisma.EventRegistrationCreateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>[]
}
delete: {
args: Prisma.EventRegistrationDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>
}
update: {
args: Prisma.EventRegistrationUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>
}
deleteMany: {
args: Prisma.EventRegistrationDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.EventRegistrationUpdateManyArgs<ExtArgs>
result: BatchPayload
}
updateManyAndReturn: {
args: Prisma.EventRegistrationUpdateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>[]
}
upsert: {
args: Prisma.EventRegistrationUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventRegistrationPayload>
}
aggregate: {
args: Prisma.EventRegistrationAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateEventRegistration>
}
groupBy: {
args: Prisma.EventRegistrationGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.EventRegistrationGroupByOutputType>[]
}
count: {
args: Prisma.EventRegistrationCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.EventRegistrationCountAggregateOutputType> | number
}
}
}
SitePreferences: {
payload: Prisma.$SitePreferencesPayload<ExtArgs>
fields: Prisma.SitePreferencesFieldRefs
@@ -787,6 +862,16 @@ export const EventScalarFieldEnum = {
export type EventScalarFieldEnum = (typeof EventScalarFieldEnum)[keyof typeof EventScalarFieldEnum]
export const EventRegistrationScalarFieldEnum = {
id: 'id',
userId: 'userId',
eventId: 'eventId',
createdAt: 'createdAt'
} as const
export type EventRegistrationScalarFieldEnum = (typeof EventRegistrationScalarFieldEnum)[keyof typeof EventRegistrationScalarFieldEnum]
export const SitePreferencesScalarFieldEnum = {
id: 'id',
homeBackground: 'homeBackground',
@@ -967,6 +1052,7 @@ export type GlobalOmitConfig = {
user?: Prisma.UserOmit
userPreferences?: Prisma.UserPreferencesOmit
event?: Prisma.EventOmit
eventRegistration?: Prisma.EventRegistrationOmit
sitePreferences?: Prisma.SitePreferencesOmit
}

View File

@@ -54,6 +54,7 @@ export const ModelName = {
User: 'User',
UserPreferences: 'UserPreferences',
Event: 'Event',
EventRegistration: 'EventRegistration',
SitePreferences: 'SitePreferences'
} as const
@@ -118,6 +119,16 @@ export const EventScalarFieldEnum = {
export type EventScalarFieldEnum = (typeof EventScalarFieldEnum)[keyof typeof EventScalarFieldEnum]
export const EventRegistrationScalarFieldEnum = {
id: 'id',
userId: 'userId',
eventId: 'eventId',
createdAt: 'createdAt'
} as const
export type EventRegistrationScalarFieldEnum = (typeof EventRegistrationScalarFieldEnum)[keyof typeof EventRegistrationScalarFieldEnum]
export const SitePreferencesScalarFieldEnum = {
id: 'id',
homeBackground: 'homeBackground',

View File

@@ -11,5 +11,6 @@
export type * from './models/User'
export type * from './models/UserPreferences'
export type * from './models/Event'
export type * from './models/EventRegistration'
export type * from './models/SitePreferences'
export type * from './commonInputTypes'

View File

@@ -206,6 +206,7 @@ export type EventWhereInput = {
status?: Prisma.EnumEventStatusFilter<"Event"> | $Enums.EventStatus
createdAt?: Prisma.DateTimeFilter<"Event"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"Event"> | Date | string
registrations?: Prisma.EventRegistrationListRelationFilter
}
export type EventOrderByWithRelationInput = {
@@ -217,6 +218,7 @@ export type EventOrderByWithRelationInput = {
status?: Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
registrations?: Prisma.EventRegistrationOrderByRelationAggregateInput
}
export type EventWhereUniqueInput = Prisma.AtLeast<{
@@ -231,6 +233,7 @@ export type EventWhereUniqueInput = Prisma.AtLeast<{
status?: Prisma.EnumEventStatusFilter<"Event"> | $Enums.EventStatus
createdAt?: Prisma.DateTimeFilter<"Event"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"Event"> | Date | string
registrations?: Prisma.EventRegistrationListRelationFilter
}, "id">
export type EventOrderByWithAggregationInput = {
@@ -270,6 +273,7 @@ export type EventCreateInput = {
status: $Enums.EventStatus
createdAt?: Date | string
updatedAt?: Date | string
registrations?: Prisma.EventRegistrationCreateNestedManyWithoutEventInput
}
export type EventUncheckedCreateInput = {
@@ -281,6 +285,7 @@ export type EventUncheckedCreateInput = {
status: $Enums.EventStatus
createdAt?: Date | string
updatedAt?: Date | string
registrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutEventInput
}
export type EventUpdateInput = {
@@ -292,6 +297,7 @@ export type EventUpdateInput = {
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
registrations?: Prisma.EventRegistrationUpdateManyWithoutEventNestedInput
}
export type EventUncheckedUpdateInput = {
@@ -303,6 +309,7 @@ export type EventUncheckedUpdateInput = {
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
registrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutEventNestedInput
}
export type EventCreateManyInput = {
@@ -371,6 +378,11 @@ export type EventMinOrderByAggregateInput = {
updatedAt?: Prisma.SortOrder
}
export type EventScalarRelationFilter = {
is?: Prisma.EventWhereInput
isNot?: Prisma.EventWhereInput
}
export type EnumEventTypeFieldUpdateOperationsInput = {
set?: $Enums.EventType
}
@@ -379,6 +391,109 @@ export type EnumEventStatusFieldUpdateOperationsInput = {
set?: $Enums.EventStatus
}
export type EventCreateNestedOneWithoutRegistrationsInput = {
create?: Prisma.XOR<Prisma.EventCreateWithoutRegistrationsInput, Prisma.EventUncheckedCreateWithoutRegistrationsInput>
connectOrCreate?: Prisma.EventCreateOrConnectWithoutRegistrationsInput
connect?: Prisma.EventWhereUniqueInput
}
export type EventUpdateOneRequiredWithoutRegistrationsNestedInput = {
create?: Prisma.XOR<Prisma.EventCreateWithoutRegistrationsInput, Prisma.EventUncheckedCreateWithoutRegistrationsInput>
connectOrCreate?: Prisma.EventCreateOrConnectWithoutRegistrationsInput
upsert?: Prisma.EventUpsertWithoutRegistrationsInput
connect?: Prisma.EventWhereUniqueInput
update?: Prisma.XOR<Prisma.XOR<Prisma.EventUpdateToOneWithWhereWithoutRegistrationsInput, Prisma.EventUpdateWithoutRegistrationsInput>, Prisma.EventUncheckedUpdateWithoutRegistrationsInput>
}
export type EventCreateWithoutRegistrationsInput = {
id?: string
date: string
name: string
description: string
type: $Enums.EventType
status: $Enums.EventStatus
createdAt?: Date | string
updatedAt?: Date | string
}
export type EventUncheckedCreateWithoutRegistrationsInput = {
id?: string
date: string
name: string
description: string
type: $Enums.EventType
status: $Enums.EventStatus
createdAt?: Date | string
updatedAt?: Date | string
}
export type EventCreateOrConnectWithoutRegistrationsInput = {
where: Prisma.EventWhereUniqueInput
create: Prisma.XOR<Prisma.EventCreateWithoutRegistrationsInput, Prisma.EventUncheckedCreateWithoutRegistrationsInput>
}
export type EventUpsertWithoutRegistrationsInput = {
update: Prisma.XOR<Prisma.EventUpdateWithoutRegistrationsInput, Prisma.EventUncheckedUpdateWithoutRegistrationsInput>
create: Prisma.XOR<Prisma.EventCreateWithoutRegistrationsInput, Prisma.EventUncheckedCreateWithoutRegistrationsInput>
where?: Prisma.EventWhereInput
}
export type EventUpdateToOneWithWhereWithoutRegistrationsInput = {
where?: Prisma.EventWhereInput
data: Prisma.XOR<Prisma.EventUpdateWithoutRegistrationsInput, Prisma.EventUncheckedUpdateWithoutRegistrationsInput>
}
export type EventUpdateWithoutRegistrationsInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
date?: Prisma.StringFieldUpdateOperationsInput | string
name?: Prisma.StringFieldUpdateOperationsInput | string
description?: Prisma.StringFieldUpdateOperationsInput | string
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
}
export type EventUncheckedUpdateWithoutRegistrationsInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
date?: Prisma.StringFieldUpdateOperationsInput | string
name?: Prisma.StringFieldUpdateOperationsInput | string
description?: Prisma.StringFieldUpdateOperationsInput | string
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
}
/**
* Count Type EventCountOutputType
*/
export type EventCountOutputType = {
registrations: number
}
export type EventCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
registrations?: boolean | EventCountOutputTypeCountRegistrationsArgs
}
/**
* EventCountOutputType without action
*/
export type EventCountOutputTypeDefaultArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/**
* Select specific fields to fetch from the EventCountOutputType
*/
select?: Prisma.EventCountOutputTypeSelect<ExtArgs> | null
}
/**
* EventCountOutputType without action
*/
export type EventCountOutputTypeCountRegistrationsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
where?: Prisma.EventRegistrationWhereInput
}
export type EventSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
@@ -390,6 +505,8 @@ export type EventSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs =
status?: boolean
createdAt?: boolean
updatedAt?: boolean
registrations?: boolean | Prisma.Event$registrationsArgs<ExtArgs>
_count?: boolean | Prisma.EventCountOutputTypeDefaultArgs<ExtArgs>
}, ExtArgs["result"]["event"]>
export type EventSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
@@ -426,10 +543,18 @@ export type EventSelectScalar = {
}
export type EventOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "date" | "name" | "description" | "type" | "status" | "createdAt" | "updatedAt", ExtArgs["result"]["event"]>
export type EventInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
registrations?: boolean | Prisma.Event$registrationsArgs<ExtArgs>
_count?: boolean | Prisma.EventCountOutputTypeDefaultArgs<ExtArgs>
}
export type EventIncludeCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {}
export type EventIncludeUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {}
export type $EventPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
name: "Event"
objects: {}
objects: {
registrations: Prisma.$EventRegistrationPayload<ExtArgs>[]
}
scalars: runtime.Types.Extensions.GetPayloadResult<{
id: string
date: string
@@ -833,6 +958,7 @@ readonly fields: EventFieldRefs;
*/
export interface Prisma__EventClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> {
readonly [Symbol.toStringTag]: "PrismaPromise"
registrations<T extends Prisma.Event$registrationsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.Event$registrationsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$EventRegistrationPayload<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.
@@ -886,6 +1012,10 @@ export type EventFindUniqueArgs<ExtArgs extends runtime.Types.Extensions.Interna
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* Filter, which Event to fetch.
*/
@@ -904,6 +1034,10 @@ export type EventFindUniqueOrThrowArgs<ExtArgs extends runtime.Types.Extensions.
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* Filter, which Event to fetch.
*/
@@ -922,6 +1056,10 @@ export type EventFindFirstArgs<ExtArgs extends runtime.Types.Extensions.Internal
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* Filter, which Event to fetch.
*/
@@ -970,6 +1108,10 @@ export type EventFindFirstOrThrowArgs<ExtArgs extends runtime.Types.Extensions.I
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* Filter, which Event to fetch.
*/
@@ -1018,6 +1160,10 @@ export type EventFindManyArgs<ExtArgs extends runtime.Types.Extensions.InternalA
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* Filter, which Events to fetch.
*/
@@ -1061,6 +1207,10 @@ export type EventCreateArgs<ExtArgs extends runtime.Types.Extensions.InternalArg
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* The data needed to create a Event.
*/
@@ -1107,6 +1257,10 @@ export type EventUpdateArgs<ExtArgs extends runtime.Types.Extensions.InternalArg
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* The data needed to update a Event.
*/
@@ -1173,6 +1327,10 @@ export type EventUpsertArgs<ExtArgs extends runtime.Types.Extensions.InternalArg
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* The filter to search for the Event to update in case it exists.
*/
@@ -1199,6 +1357,10 @@ export type EventDeleteArgs<ExtArgs extends runtime.Types.Extensions.InternalArg
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
/**
* Filter which Event to delete.
*/
@@ -1219,6 +1381,30 @@ export type EventDeleteManyArgs<ExtArgs extends runtime.Types.Extensions.Interna
limit?: number
}
/**
* Event.registrations
*/
export type Event$registrationsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/**
* Select specific fields to fetch from the EventRegistration
*/
select?: Prisma.EventRegistrationSelect<ExtArgs> | null
/**
* Omit specific fields from the EventRegistration
*/
omit?: Prisma.EventRegistrationOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventRegistrationInclude<ExtArgs> | null
where?: Prisma.EventRegistrationWhereInput
orderBy?: Prisma.EventRegistrationOrderByWithRelationInput | Prisma.EventRegistrationOrderByWithRelationInput[]
cursor?: Prisma.EventRegistrationWhereUniqueInput
take?: number
skip?: number
distinct?: Prisma.EventRegistrationScalarFieldEnum | Prisma.EventRegistrationScalarFieldEnum[]
}
/**
* Event without action
*/
@@ -1231,4 +1417,8 @@ export type EventDefaultArgs<ExtArgs extends runtime.Types.Extensions.InternalAr
* Omit specific fields from the Event
*/
omit?: Prisma.EventOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventInclude<ExtArgs> | null
}

File diff suppressed because it is too large Load Diff

View File

@@ -309,6 +309,7 @@ export type UserWhereInput = {
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
preferences?: Prisma.XOR<Prisma.UserPreferencesNullableScalarRelationFilter, Prisma.UserPreferencesWhereInput> | null
eventRegistrations?: Prisma.EventRegistrationListRelationFilter
}
export type UserOrderByWithRelationInput = {
@@ -327,6 +328,7 @@ export type UserOrderByWithRelationInput = {
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
preferences?: Prisma.UserPreferencesOrderByWithRelationInput
eventRegistrations?: Prisma.EventRegistrationOrderByRelationAggregateInput
}
export type UserWhereUniqueInput = Prisma.AtLeast<{
@@ -348,6 +350,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
preferences?: Prisma.XOR<Prisma.UserPreferencesNullableScalarRelationFilter, Prisma.UserPreferencesWhereInput> | null
eventRegistrations?: Prisma.EventRegistrationListRelationFilter
}, "id" | "email" | "username">
export type UserOrderByWithAggregationInput = {
@@ -408,6 +411,7 @@ export type UserCreateInput = {
createdAt?: Date | string
updatedAt?: Date | string
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput
}
export type UserUncheckedCreateInput = {
@@ -426,6 +430,7 @@ export type UserUncheckedCreateInput = {
createdAt?: Date | string
updatedAt?: Date | string
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput
}
export type UserUpdateInput = {
@@ -444,6 +449,7 @@ export type UserUpdateInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput
}
export type UserUncheckedUpdateInput = {
@@ -462,6 +468,7 @@ export type UserUncheckedUpdateInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput
}
export type UserCreateManyInput = {
@@ -627,6 +634,20 @@ export type UserUpdateOneRequiredWithoutPreferencesNestedInput = {
update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutPreferencesInput, Prisma.UserUpdateWithoutPreferencesInput>, Prisma.UserUncheckedUpdateWithoutPreferencesInput>
}
export type UserCreateNestedOneWithoutEventRegistrationsInput = {
create?: Prisma.XOR<Prisma.UserCreateWithoutEventRegistrationsInput, Prisma.UserUncheckedCreateWithoutEventRegistrationsInput>
connectOrCreate?: Prisma.UserCreateOrConnectWithoutEventRegistrationsInput
connect?: Prisma.UserWhereUniqueInput
}
export type UserUpdateOneRequiredWithoutEventRegistrationsNestedInput = {
create?: Prisma.XOR<Prisma.UserCreateWithoutEventRegistrationsInput, Prisma.UserUncheckedCreateWithoutEventRegistrationsInput>
connectOrCreate?: Prisma.UserCreateOrConnectWithoutEventRegistrationsInput
upsert?: Prisma.UserUpsertWithoutEventRegistrationsInput
connect?: Prisma.UserWhereUniqueInput
update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutEventRegistrationsInput, Prisma.UserUpdateWithoutEventRegistrationsInput>, Prisma.UserUncheckedUpdateWithoutEventRegistrationsInput>
}
export type UserCreateWithoutPreferencesInput = {
id?: string
email: string
@@ -642,6 +663,7 @@ export type UserCreateWithoutPreferencesInput = {
avatar?: string | null
createdAt?: Date | string
updatedAt?: Date | string
eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput
}
export type UserUncheckedCreateWithoutPreferencesInput = {
@@ -659,6 +681,7 @@ export type UserUncheckedCreateWithoutPreferencesInput = {
avatar?: string | null
createdAt?: Date | string
updatedAt?: Date | string
eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput
}
export type UserCreateOrConnectWithoutPreferencesInput = {
@@ -692,6 +715,7 @@ export type UserUpdateWithoutPreferencesInput = {
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput
}
export type UserUncheckedUpdateWithoutPreferencesInput = {
@@ -709,8 +733,126 @@ export type UserUncheckedUpdateWithoutPreferencesInput = {
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput
}
export type UserCreateWithoutEventRegistrationsInput = {
id?: string
email: string
password: string
username: string
role?: $Enums.Role
score?: number
level?: number
hp?: number
maxHp?: number
xp?: number
maxXp?: number
avatar?: string | null
createdAt?: Date | string
updatedAt?: Date | string
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
}
export type UserUncheckedCreateWithoutEventRegistrationsInput = {
id?: string
email: string
password: string
username: string
role?: $Enums.Role
score?: number
level?: number
hp?: number
maxHp?: number
xp?: number
maxXp?: number
avatar?: string | null
createdAt?: Date | string
updatedAt?: Date | string
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
}
export type UserCreateOrConnectWithoutEventRegistrationsInput = {
where: Prisma.UserWhereUniqueInput
create: Prisma.XOR<Prisma.UserCreateWithoutEventRegistrationsInput, Prisma.UserUncheckedCreateWithoutEventRegistrationsInput>
}
export type UserUpsertWithoutEventRegistrationsInput = {
update: Prisma.XOR<Prisma.UserUpdateWithoutEventRegistrationsInput, Prisma.UserUncheckedUpdateWithoutEventRegistrationsInput>
create: Prisma.XOR<Prisma.UserCreateWithoutEventRegistrationsInput, Prisma.UserUncheckedCreateWithoutEventRegistrationsInput>
where?: Prisma.UserWhereInput
}
export type UserUpdateToOneWithWhereWithoutEventRegistrationsInput = {
where?: Prisma.UserWhereInput
data: Prisma.XOR<Prisma.UserUpdateWithoutEventRegistrationsInput, Prisma.UserUncheckedUpdateWithoutEventRegistrationsInput>
}
export type UserUpdateWithoutEventRegistrationsInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
username?: Prisma.StringFieldUpdateOperationsInput | string
role?: Prisma.EnumRoleFieldUpdateOperationsInput | $Enums.Role
score?: Prisma.IntFieldUpdateOperationsInput | number
level?: Prisma.IntFieldUpdateOperationsInput | number
hp?: Prisma.IntFieldUpdateOperationsInput | number
maxHp?: Prisma.IntFieldUpdateOperationsInput | number
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
}
export type UserUncheckedUpdateWithoutEventRegistrationsInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
email?: Prisma.StringFieldUpdateOperationsInput | string
password?: Prisma.StringFieldUpdateOperationsInput | string
username?: Prisma.StringFieldUpdateOperationsInput | string
role?: Prisma.EnumRoleFieldUpdateOperationsInput | $Enums.Role
score?: Prisma.IntFieldUpdateOperationsInput | number
level?: Prisma.IntFieldUpdateOperationsInput | number
hp?: Prisma.IntFieldUpdateOperationsInput | number
maxHp?: Prisma.IntFieldUpdateOperationsInput | number
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
}
/**
* Count Type UserCountOutputType
*/
export type UserCountOutputType = {
eventRegistrations: number
}
export type UserCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
eventRegistrations?: boolean | UserCountOutputTypeCountEventRegistrationsArgs
}
/**
* UserCountOutputType without action
*/
export type UserCountOutputTypeDefaultArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/**
* Select specific fields to fetch from the UserCountOutputType
*/
select?: Prisma.UserCountOutputTypeSelect<ExtArgs> | null
}
/**
* UserCountOutputType without action
*/
export type UserCountOutputTypeCountEventRegistrationsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
where?: Prisma.EventRegistrationWhereInput
}
export type UserSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
@@ -729,6 +871,8 @@ export type UserSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = r
createdAt?: boolean
updatedAt?: boolean
preferences?: boolean | Prisma.User$preferencesArgs<ExtArgs>
eventRegistrations?: boolean | Prisma.User$eventRegistrationsArgs<ExtArgs>
_count?: boolean | Prisma.UserCountOutputTypeDefaultArgs<ExtArgs>
}, ExtArgs["result"]["user"]>
export type UserSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
@@ -785,6 +929,8 @@ export type UserSelectScalar = {
export type UserOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "email" | "password" | "username" | "role" | "score" | "level" | "hp" | "maxHp" | "xp" | "maxXp" | "avatar" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]>
export type UserInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
preferences?: boolean | Prisma.User$preferencesArgs<ExtArgs>
eventRegistrations?: boolean | Prisma.User$eventRegistrationsArgs<ExtArgs>
_count?: boolean | Prisma.UserCountOutputTypeDefaultArgs<ExtArgs>
}
export type UserIncludeCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {}
export type UserIncludeUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {}
@@ -793,6 +939,7 @@ export type $UserPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
name: "User"
objects: {
preferences: Prisma.$UserPreferencesPayload<ExtArgs> | null
eventRegistrations: Prisma.$EventRegistrationPayload<ExtArgs>[]
}
scalars: runtime.Types.Extensions.GetPayloadResult<{
id: string
@@ -1204,6 +1351,7 @@ readonly fields: UserFieldRefs;
export interface Prisma__UserClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> {
readonly [Symbol.toStringTag]: "PrismaPromise"
preferences<T extends Prisma.User$preferencesArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$preferencesArgs<ExtArgs>>): Prisma.Prisma__UserPreferencesClient<runtime.Types.Result.GetResult<Prisma.$UserPreferencesPayload<ExtArgs>, T, "findUniqueOrThrow", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions>
eventRegistrations<T extends Prisma.User$eventRegistrationsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$eventRegistrationsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$EventRegistrationPayload<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.
@@ -1651,6 +1799,30 @@ export type User$preferencesArgs<ExtArgs extends runtime.Types.Extensions.Intern
where?: Prisma.UserPreferencesWhereInput
}
/**
* User.eventRegistrations
*/
export type User$eventRegistrationsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/**
* Select specific fields to fetch from the EventRegistration
*/
select?: Prisma.EventRegistrationSelect<ExtArgs> | null
/**
* Omit specific fields from the EventRegistration
*/
omit?: Prisma.EventRegistrationOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.EventRegistrationInclude<ExtArgs> | null
where?: Prisma.EventRegistrationWhereInput
orderBy?: Prisma.EventRegistrationOrderByWithRelationInput | Prisma.EventRegistrationOrderByWithRelationInput[]
cursor?: Prisma.EventRegistrationWhereUniqueInput
take?: number
skip?: number
distinct?: Prisma.EventRegistrationScalarFieldEnum | Prisma.EventRegistrationScalarFieldEnum[]
}
/**
* User without action
*/

View File

@@ -0,0 +1,18 @@
-- CreateTable
CREATE TABLE "EventRegistration" (
"id" TEXT NOT NULL PRIMARY KEY,
"userId" TEXT NOT NULL,
"eventId" TEXT NOT NULL,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "EventRegistration_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT "EventRegistration_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateIndex
CREATE INDEX "EventRegistration_userId_idx" ON "EventRegistration"("userId");
-- CreateIndex
CREATE INDEX "EventRegistration_eventId_idx" ON "EventRegistration"("eventId");
-- CreateIndex
CREATE UNIQUE INDEX "EventRegistration_userId_eventId_key" ON "EventRegistration"("userId", "eventId");

View File

@@ -44,6 +44,7 @@ model User {
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
preferences UserPreferences?
eventRegistrations EventRegistration[]
@@index([score])
@@index([email])
@@ -75,11 +76,25 @@ model Event {
status EventStatus
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
registrations EventRegistration[]
@@index([status])
@@index([date])
}
model EventRegistration {
id String @id @default(cuid())
userId String
eventId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
@@unique([userId, eventId])
@@index([userId])
@@index([eventId])
}
model SitePreferences {
id String @id @default("global")
homeBackground String?