Implement event feedback functionality: Add EventFeedback model to Prisma schema, enabling users to submit ratings and comments for events. Update EventsPageSection and AdminPanel components to support feedback management, including UI for submitting feedback and viewing existing feedbacks. Refactor registration logic to retrieve all user registrations for improved feedback handling.
This commit is contained in:
92
app/api/admin/feedback/route.ts
Normal file
92
app/api/admin/feedback/route.ts
Normal file
@@ -0,0 +1,92 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { auth } from "@/lib/auth";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { Role } from "@/prisma/generated/prisma/client";
|
||||
|
||||
export async function GET() {
|
||||
try {
|
||||
const session = await auth();
|
||||
if (!session?.user?.id) {
|
||||
return NextResponse.json({ error: "Non authentifié" }, { status: 401 });
|
||||
}
|
||||
|
||||
if (session.user.role !== Role.ADMIN) {
|
||||
return NextResponse.json({ error: "Accès refusé" }, { status: 403 });
|
||||
}
|
||||
|
||||
// Récupérer tous les feedbacks avec les détails de l'événement et de l'utilisateur
|
||||
const feedbacks = await prisma.eventFeedback.findMany({
|
||||
include: {
|
||||
event: {
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
date: true,
|
||||
type: true,
|
||||
},
|
||||
},
|
||||
user: {
|
||||
select: {
|
||||
id: true,
|
||||
username: true,
|
||||
email: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
orderBy: {
|
||||
createdAt: "desc",
|
||||
},
|
||||
});
|
||||
|
||||
// Calculer les statistiques par événement
|
||||
const eventStats = await prisma.eventFeedback.groupBy({
|
||||
by: ["eventId"],
|
||||
_avg: {
|
||||
rating: true,
|
||||
},
|
||||
_count: {
|
||||
id: true,
|
||||
},
|
||||
});
|
||||
|
||||
// Récupérer les détails des événements pour les stats
|
||||
const eventIds = eventStats.map((stat) => stat.eventId);
|
||||
const events = await prisma.event.findMany({
|
||||
where: {
|
||||
id: {
|
||||
in: eventIds,
|
||||
},
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
date: true,
|
||||
type: true,
|
||||
},
|
||||
});
|
||||
|
||||
// Combiner les stats avec les détails des événements
|
||||
const statsWithDetails = eventStats.map((stat) => {
|
||||
const event = events.find((e) => e.id === stat.eventId);
|
||||
return {
|
||||
eventId: stat.eventId,
|
||||
eventName: event?.name || "Événement supprimé",
|
||||
eventDate: event?.date || null,
|
||||
eventType: event?.type || null,
|
||||
averageRating: stat._avg.rating || 0,
|
||||
feedbackCount: stat._count.id,
|
||||
};
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
feedbacks,
|
||||
statistics: statsWithDetails,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error fetching feedbacks:", error);
|
||||
return NextResponse.json(
|
||||
{ error: "Erreur lors de la récupération des feedbacks" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
31
app/api/events/[id]/route.ts
Normal file
31
app/api/events/[id]/route.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
export async function GET(
|
||||
request: Request,
|
||||
{ params }: { params: Promise<{ id: string }> }
|
||||
) {
|
||||
try {
|
||||
const { id } = await params;
|
||||
|
||||
const event = await prisma.event.findUnique({
|
||||
where: { id },
|
||||
});
|
||||
|
||||
if (!event) {
|
||||
return NextResponse.json(
|
||||
{ error: "Événement introuvable" },
|
||||
{ status: 404 }
|
||||
);
|
||||
}
|
||||
|
||||
return NextResponse.json(event);
|
||||
} catch (error) {
|
||||
console.error("Error fetching event:", error);
|
||||
return NextResponse.json(
|
||||
{ error: "Erreur lors de la récupération de l'événement" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
108
app/api/feedback/[eventId]/route.ts
Normal file
108
app/api/feedback/[eventId]/route.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { auth } from "@/lib/auth";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
export async function POST(
|
||||
request: Request,
|
||||
{ params }: { params: Promise<{ eventId: string }> }
|
||||
) {
|
||||
try {
|
||||
const session = await auth();
|
||||
if (!session?.user?.id) {
|
||||
return NextResponse.json({ error: "Non authentifié" }, { status: 401 });
|
||||
}
|
||||
|
||||
const { eventId } = await params;
|
||||
const body = await request.json();
|
||||
const { rating, comment } = body;
|
||||
|
||||
// Valider la note (1-5)
|
||||
if (!rating || rating < 1 || rating > 5) {
|
||||
return NextResponse.json(
|
||||
{ error: "La note doit être entre 1 et 5" },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// Vérifier que l'événement existe
|
||||
const event = await prisma.event.findUnique({
|
||||
where: { id: eventId },
|
||||
});
|
||||
|
||||
if (!event) {
|
||||
return NextResponse.json(
|
||||
{ error: "Événement introuvable" },
|
||||
{ status: 404 }
|
||||
);
|
||||
}
|
||||
|
||||
// Créer ou mettre à jour le feedback (unique par utilisateur/événement)
|
||||
const feedback = await prisma.eventFeedback.upsert({
|
||||
where: {
|
||||
userId_eventId: {
|
||||
userId: session.user.id,
|
||||
eventId,
|
||||
},
|
||||
},
|
||||
update: {
|
||||
rating,
|
||||
comment: comment || null,
|
||||
},
|
||||
create: {
|
||||
userId: session.user.id,
|
||||
eventId,
|
||||
rating,
|
||||
comment: comment || null,
|
||||
},
|
||||
});
|
||||
|
||||
return NextResponse.json({ success: true, feedback });
|
||||
} catch (error) {
|
||||
console.error("Error saving feedback:", error);
|
||||
return NextResponse.json(
|
||||
{ error: "Erreur lors de l'enregistrement du feedback" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export async function GET(
|
||||
request: Request,
|
||||
{ params }: { params: Promise<{ eventId: string }> }
|
||||
) {
|
||||
try {
|
||||
const session = await auth();
|
||||
if (!session?.user?.id) {
|
||||
return NextResponse.json({ error: "Non authentifié" }, { status: 401 });
|
||||
}
|
||||
|
||||
const { eventId } = await params;
|
||||
|
||||
// Récupérer le feedback de l'utilisateur pour cet événement
|
||||
const feedback = await prisma.eventFeedback.findUnique({
|
||||
where: {
|
||||
userId_eventId: {
|
||||
userId: session.user.id,
|
||||
eventId,
|
||||
},
|
||||
},
|
||||
include: {
|
||||
event: {
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
date: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
return NextResponse.json({ feedback });
|
||||
} catch (error) {
|
||||
console.error("Error fetching feedback:", error);
|
||||
return NextResponse.json(
|
||||
{ error: "Erreur lors de la récupération du feedback" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -27,28 +27,19 @@ export default async function EventsPage() {
|
||||
const initialRegistrations: Record<string, boolean> = {};
|
||||
|
||||
if (session?.user?.id) {
|
||||
const upcomingEvents = events.filter(
|
||||
(e) => calculateEventStatus(e.date) === "UPCOMING"
|
||||
);
|
||||
const eventIds = upcomingEvents.map((e) => e.id);
|
||||
// Récupérer toutes les inscriptions (passées et à venir) pour permettre le feedback
|
||||
const allRegistrations = await prisma.eventRegistration.findMany({
|
||||
where: {
|
||||
userId: session.user.id,
|
||||
},
|
||||
select: {
|
||||
eventId: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (eventIds.length > 0) {
|
||||
const registrations = await prisma.eventRegistration.findMany({
|
||||
where: {
|
||||
userId: session.user.id,
|
||||
eventId: {
|
||||
in: eventIds,
|
||||
},
|
||||
},
|
||||
select: {
|
||||
eventId: true,
|
||||
},
|
||||
});
|
||||
|
||||
registrations.forEach((reg) => {
|
||||
initialRegistrations[reg.eventId] = true;
|
||||
});
|
||||
}
|
||||
allRegistrations.forEach((reg) => {
|
||||
initialRegistrations[reg.eventId] = true;
|
||||
});
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
259
app/feedback/[eventId]/page.tsx
Normal file
259
app/feedback/[eventId]/page.tsx
Normal file
@@ -0,0 +1,259 @@
|
||||
"use client";
|
||||
|
||||
import { useState, useEffect, type FormEvent } from "react";
|
||||
import { useSession } from "next-auth/react";
|
||||
import { useRouter, useParams } from "next/navigation";
|
||||
import Navigation from "@/components/Navigation";
|
||||
import { useBackgroundImage } from "@/hooks/usePreferences";
|
||||
|
||||
interface Event {
|
||||
id: string;
|
||||
name: string;
|
||||
date: string;
|
||||
description: string;
|
||||
}
|
||||
|
||||
interface Feedback {
|
||||
id: string;
|
||||
rating: number;
|
||||
comment: string | null;
|
||||
}
|
||||
|
||||
export default function FeedbackPage() {
|
||||
const { status } = useSession();
|
||||
const router = useRouter();
|
||||
const params = useParams();
|
||||
const eventId = params?.eventId as string;
|
||||
const backgroundImage = useBackgroundImage("home", "/got-2.jpg");
|
||||
|
||||
const [event, setEvent] = useState<Event | null>(null);
|
||||
const [existingFeedback, setExistingFeedback] = useState<Feedback | null>(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [submitting, setSubmitting] = useState(false);
|
||||
const [error, setError] = useState("");
|
||||
const [success, setSuccess] = useState(false);
|
||||
|
||||
const [rating, setRating] = useState(0);
|
||||
const [comment, setComment] = useState("");
|
||||
|
||||
const fetchEventAndFeedback = async () => {
|
||||
try {
|
||||
// Récupérer l'événement
|
||||
const eventResponse = await fetch(`/api/events/${eventId}`);
|
||||
if (!eventResponse.ok) {
|
||||
setError("Événement introuvable");
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
const eventData = await eventResponse.json();
|
||||
setEvent(eventData);
|
||||
|
||||
// Récupérer le feedback existant si disponible
|
||||
const feedbackResponse = await fetch(`/api/feedback/${eventId}`);
|
||||
if (feedbackResponse.ok) {
|
||||
const feedbackData = await feedbackResponse.json();
|
||||
if (feedbackData.feedback) {
|
||||
setExistingFeedback(feedbackData.feedback);
|
||||
setRating(feedbackData.feedback.rating);
|
||||
setComment(feedbackData.feedback.comment || "");
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
setError("Erreur lors du chargement des données");
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (status === "unauthenticated") {
|
||||
router.push(`/login?redirect=/feedback/${eventId}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (status === "authenticated" && eventId) {
|
||||
fetchEventAndFeedback();
|
||||
}
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [status, eventId, router]);
|
||||
|
||||
const handleSubmit = async (e: FormEvent) => {
|
||||
e.preventDefault();
|
||||
setError("");
|
||||
setSuccess(false);
|
||||
|
||||
if (rating === 0) {
|
||||
setError("Veuillez sélectionner une note");
|
||||
return;
|
||||
}
|
||||
|
||||
setSubmitting(true);
|
||||
|
||||
try {
|
||||
const response = await fetch(`/api/feedback/${eventId}`, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
rating,
|
||||
comment: comment.trim() || null,
|
||||
}),
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (!response.ok) {
|
||||
setError(data.error || "Erreur lors de l'enregistrement");
|
||||
return;
|
||||
}
|
||||
|
||||
setSuccess(true);
|
||||
setExistingFeedback(data.feedback);
|
||||
|
||||
// Rediriger après 2 secondes
|
||||
setTimeout(() => {
|
||||
router.push("/events");
|
||||
}, 2000);
|
||||
} catch {
|
||||
setError("Erreur lors de l'enregistrement");
|
||||
} finally {
|
||||
setSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
if (status === "loading" || loading) {
|
||||
return (
|
||||
<main className="min-h-screen bg-black relative">
|
||||
<Navigation />
|
||||
<section className="relative w-full min-h-screen flex flex-col items-center justify-center overflow-hidden pt-24">
|
||||
<div className="text-white">Chargement...</div>
|
||||
</section>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
if (!event) {
|
||||
return (
|
||||
<main className="min-h-screen bg-black relative">
|
||||
<Navigation />
|
||||
<section className="relative w-full min-h-screen flex flex-col items-center justify-center overflow-hidden pt-24">
|
||||
<div className="text-red-400">Événement introuvable</div>
|
||||
</section>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<main className="min-h-screen bg-black relative">
|
||||
<Navigation />
|
||||
<section className="relative w-full min-h-screen flex flex-col items-center justify-center overflow-hidden pt-24">
|
||||
{/* Background Image */}
|
||||
<div
|
||||
className="absolute inset-0 bg-cover bg-center bg-no-repeat"
|
||||
style={{
|
||||
backgroundImage: `url('${backgroundImage}')`,
|
||||
}}
|
||||
>
|
||||
<div className="absolute inset-0 bg-gradient-to-b from-black/70 via-black/60 to-black/80"></div>
|
||||
</div>
|
||||
|
||||
{/* Feedback Form */}
|
||||
<div className="relative z-10 w-full max-w-2xl mx-auto px-8">
|
||||
<div className="bg-black/80 border border-pixel-gold/30 rounded-lg p-8 backdrop-blur-sm">
|
||||
<h1 className="text-4xl font-gaming font-black mb-2 text-center">
|
||||
<span className="bg-gradient-to-r from-pixel-gold via-orange-400 to-pixel-gold bg-clip-text text-transparent">
|
||||
FEEDBACK
|
||||
</span>
|
||||
</h1>
|
||||
<p className="text-gray-400 text-sm text-center mb-2">
|
||||
{existingFeedback
|
||||
? "Modifier votre feedback pour"
|
||||
: "Donnez votre avis sur"}
|
||||
</p>
|
||||
<p className="text-pixel-gold text-lg font-semibold text-center mb-8">
|
||||
{event.name}
|
||||
</p>
|
||||
|
||||
{success && (
|
||||
<div className="bg-green-900/50 border border-green-500/50 text-green-400 px-4 py-3 rounded text-sm mb-6">
|
||||
Feedback enregistré avec succès ! Redirection...
|
||||
</div>
|
||||
)}
|
||||
|
||||
{error && (
|
||||
<div className="bg-red-900/50 border border-red-500/50 text-red-400 px-4 py-3 rounded text-sm mb-6">
|
||||
{error}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<form onSubmit={handleSubmit} className="space-y-6">
|
||||
{/* Rating */}
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-300 mb-4 uppercase tracking-wider">
|
||||
Note
|
||||
</label>
|
||||
<div className="flex items-center justify-center gap-2">
|
||||
{[1, 2, 3, 4, 5].map((star) => (
|
||||
<button
|
||||
key={star}
|
||||
type="button"
|
||||
onClick={() => setRating(star)}
|
||||
className={`text-4xl transition-transform hover:scale-110 ${
|
||||
star <= rating
|
||||
? "text-pixel-gold"
|
||||
: "text-gray-600 hover:text-gray-500"
|
||||
}`}
|
||||
aria-label={`Noter ${star} étoile${star > 1 ? "s" : ""}`}
|
||||
>
|
||||
★
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-gray-500 text-xs text-center mt-2">
|
||||
{rating > 0 && `${rating}/5`}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Comment */}
|
||||
<div>
|
||||
<label
|
||||
htmlFor="comment"
|
||||
className="block text-sm font-semibold text-gray-300 mb-2 uppercase tracking-wider"
|
||||
>
|
||||
Commentaire (optionnel)
|
||||
</label>
|
||||
<textarea
|
||||
id="comment"
|
||||
value={comment}
|
||||
onChange={(e) => setComment(e.target.value)}
|
||||
rows={6}
|
||||
maxLength={1000}
|
||||
className="w-full px-4 py-3 bg-black/60 border border-pixel-gold/30 rounded text-white placeholder-gray-500 focus:outline-none focus:border-pixel-gold transition resize-none"
|
||||
placeholder="Partagez votre expérience, vos suggestions..."
|
||||
/>
|
||||
<p className="text-gray-500 text-xs mt-1 text-right">
|
||||
{comment.length}/1000 caractères
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Submit Button */}
|
||||
<button
|
||||
type="submit"
|
||||
disabled={submitting || rating === 0}
|
||||
className="w-full px-6 py-3 border border-pixel-gold/50 bg-black/60 text-white uppercase text-sm tracking-widest rounded hover:bg-pixel-gold/10 hover:border-pixel-gold transition disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{submitting
|
||||
? "Enregistrement..."
|
||||
: existingFeedback
|
||||
? "Modifier le feedback"
|
||||
: "Envoyer le feedback"}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import { useState } from "react";
|
||||
import ImageSelector from "@/components/ImageSelector";
|
||||
import UserManagement from "@/components/UserManagement";
|
||||
import EventManagement from "@/components/EventManagement";
|
||||
import FeedbackManagement from "@/components/FeedbackManagement";
|
||||
|
||||
interface SitePreferences {
|
||||
id: string;
|
||||
@@ -16,7 +17,7 @@ interface AdminPanelProps {
|
||||
initialPreferences: SitePreferences;
|
||||
}
|
||||
|
||||
type AdminSection = "preferences" | "users" | "events";
|
||||
type AdminSection = "preferences" | "users" | "events" | "feedbacks";
|
||||
|
||||
export default function AdminPanel({ initialPreferences }: AdminPanelProps) {
|
||||
const [activeSection, setActiveSection] =
|
||||
@@ -107,6 +108,16 @@ export default function AdminPanel({ initialPreferences }: AdminPanelProps) {
|
||||
>
|
||||
Événements
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveSection("feedbacks")}
|
||||
className={`px-6 py-3 border uppercase text-xs tracking-widest rounded transition ${
|
||||
activeSection === "feedbacks"
|
||||
? "border-pixel-gold bg-pixel-gold/10 text-pixel-gold"
|
||||
: "border-pixel-gold/30 bg-black/60 text-gray-400 hover:border-pixel-gold/50"
|
||||
}`}
|
||||
>
|
||||
Feedbacks
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{activeSection === "preferences" && (
|
||||
@@ -274,6 +285,15 @@ export default function AdminPanel({ initialPreferences }: AdminPanelProps) {
|
||||
<EventManagement />
|
||||
</div>
|
||||
)}
|
||||
|
||||
{activeSection === "feedbacks" && (
|
||||
<div className="bg-black/80 border border-pixel-gold/30 rounded-lg p-6 backdrop-blur-sm">
|
||||
<h2 className="text-2xl font-gaming font-bold mb-6 text-pixel-gold">
|
||||
Gestion des Feedbacks
|
||||
</h2>
|
||||
<FeedbackManagement />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
|
||||
@@ -170,17 +170,14 @@ export default function EventsPageSection({
|
||||
}
|
||||
|
||||
// Charger les inscriptions depuis l'API seulement si on n'a pas de données initiales
|
||||
// On charge pour tous les événements (passés et à venir) pour permettre le feedback
|
||||
const checkRegistrations = async () => {
|
||||
const upcomingOnlyEvents = events.filter(
|
||||
(e) => getEventStatus(e) === "UPCOMING"
|
||||
);
|
||||
const registrationChecks = upcomingOnlyEvents.map(async (event) => {
|
||||
const registrationChecks = events.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);
|
||||
} catch {
|
||||
return { eventId: event.id, registered: false };
|
||||
}
|
||||
});
|
||||
@@ -500,8 +497,14 @@ export default function EventsPageSection({
|
||||
</button>
|
||||
)}
|
||||
{getEventStatus(event) === "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
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
router.push(`/feedback/${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"
|
||||
>
|
||||
Donner un feedback
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
229
components/FeedbackManagement.tsx
Normal file
229
components/FeedbackManagement.tsx
Normal file
@@ -0,0 +1,229 @@
|
||||
"use client";
|
||||
|
||||
import { useState, useEffect } from "react";
|
||||
|
||||
interface Feedback {
|
||||
id: string;
|
||||
rating: number;
|
||||
comment: string | null;
|
||||
createdAt: string;
|
||||
event: {
|
||||
id: string;
|
||||
name: string;
|
||||
date: string;
|
||||
type: string;
|
||||
};
|
||||
user: {
|
||||
id: string;
|
||||
username: string;
|
||||
email: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface EventStatistics {
|
||||
eventId: string;
|
||||
eventName: string;
|
||||
eventDate: string | null;
|
||||
eventType: string | null;
|
||||
averageRating: number;
|
||||
feedbackCount: number;
|
||||
}
|
||||
|
||||
export default function FeedbackManagement() {
|
||||
const [feedbacks, setFeedbacks] = useState<Feedback[]>([]);
|
||||
const [statistics, setStatistics] = useState<EventStatistics[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [error, setError] = useState("");
|
||||
const [selectedEvent, setSelectedEvent] = useState<string | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
fetchFeedbacks();
|
||||
}, []);
|
||||
|
||||
const fetchFeedbacks = async () => {
|
||||
try {
|
||||
const response = await fetch("/api/admin/feedback");
|
||||
if (!response.ok) {
|
||||
setError("Erreur lors du chargement des feedbacks");
|
||||
return;
|
||||
}
|
||||
const data = await response.json();
|
||||
setFeedbacks(data.feedbacks || []);
|
||||
setStatistics(data.statistics || []);
|
||||
} catch {
|
||||
setError("Erreur lors du chargement des feedbacks");
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const getEventTypeLabel = (type: string) => {
|
||||
switch (type) {
|
||||
case "ATELIER":
|
||||
return "Atelier";
|
||||
case "KATA":
|
||||
return "Kata";
|
||||
case "PRESENTATION":
|
||||
return "Présentation";
|
||||
case "LEARNING_HOUR":
|
||||
return "Learning Hour";
|
||||
default:
|
||||
return type;
|
||||
}
|
||||
};
|
||||
|
||||
const renderStars = (rating: number) => {
|
||||
return (
|
||||
<div className="flex items-center gap-1">
|
||||
{[1, 2, 3, 4, 5].map((star) => (
|
||||
<span
|
||||
key={star}
|
||||
className={`text-lg ${
|
||||
star <= rating ? "text-pixel-gold" : "text-gray-600"
|
||||
}`}
|
||||
>
|
||||
★
|
||||
</span>
|
||||
))}
|
||||
<span className="text-gray-400 text-sm ml-2">({rating}/5)</span>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const filteredFeedbacks = selectedEvent
|
||||
? feedbacks.filter((f) => f.event.id === selectedEvent)
|
||||
: feedbacks;
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<div className="bg-black/60 border border-pixel-gold/30 rounded-lg p-8">
|
||||
<p className="text-gray-400 text-center">Chargement...</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
{/* Statistiques par événement */}
|
||||
{statistics.length > 0 && (
|
||||
<div className="bg-black/60 border border-pixel-gold/30 rounded-lg p-6">
|
||||
<h3 className="text-pixel-gold font-bold text-lg mb-4">
|
||||
Statistiques par événement
|
||||
</h3>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||
{statistics.map((stat) => (
|
||||
<div
|
||||
key={stat.eventId}
|
||||
className={`bg-black/40 border rounded p-4 cursor-pointer transition ${
|
||||
selectedEvent === stat.eventId
|
||||
? "border-pixel-gold bg-pixel-gold/10"
|
||||
: "border-pixel-gold/30 hover:border-pixel-gold/50"
|
||||
}`}
|
||||
onClick={() =>
|
||||
setSelectedEvent(
|
||||
selectedEvent === stat.eventId ? null : stat.eventId
|
||||
)
|
||||
}
|
||||
>
|
||||
<div className="flex items-start justify-between mb-2">
|
||||
<h4 className="text-white font-semibold text-sm">
|
||||
{stat.eventName}
|
||||
</h4>
|
||||
<span className="text-pixel-gold text-xs uppercase">
|
||||
{stat.eventType && getEventTypeLabel(stat.eventType)}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-2 mb-2">
|
||||
{renderStars(Math.round(stat.averageRating))}
|
||||
</div>
|
||||
<div className="text-gray-400 text-xs">
|
||||
Moyenne: {stat.averageRating.toFixed(2)}/5
|
||||
</div>
|
||||
<div className="text-gray-400 text-xs">
|
||||
{stat.feedbackCount} feedback
|
||||
{stat.feedbackCount > 1 ? "s" : ""}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
{selectedEvent && (
|
||||
<button
|
||||
onClick={() => setSelectedEvent(null)}
|
||||
className="mt-4 text-pixel-gold text-sm hover:text-orange-400 transition"
|
||||
>
|
||||
Voir tous les feedbacks
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Liste des feedbacks */}
|
||||
<div className="bg-black/60 border border-pixel-gold/30 rounded-lg p-6">
|
||||
<h3 className="text-pixel-gold font-bold text-lg mb-4">
|
||||
{selectedEvent
|
||||
? `Feedbacks pour: ${
|
||||
statistics.find((s) => s.eventId === selectedEvent)?.eventName
|
||||
}`
|
||||
: "Tous les feedbacks"}
|
||||
</h3>
|
||||
|
||||
{error && (
|
||||
<div className="bg-red-900/50 border border-red-500/50 text-red-400 px-4 py-3 rounded text-sm mb-4">
|
||||
{error}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{filteredFeedbacks.length === 0 ? (
|
||||
<p className="text-gray-400 text-center py-8">
|
||||
Aucun feedback pour le moment
|
||||
</p>
|
||||
) : (
|
||||
<div className="space-y-4">
|
||||
{filteredFeedbacks.map((feedback) => (
|
||||
<div
|
||||
key={feedback.id}
|
||||
className="bg-black/40 border border-pixel-gold/20 rounded p-4"
|
||||
>
|
||||
<div className="flex items-start justify-between mb-3">
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center gap-3 mb-2">
|
||||
<h4 className="text-white font-semibold">
|
||||
{feedback.user.username}
|
||||
</h4>
|
||||
<span className="text-gray-500 text-xs">
|
||||
{feedback.user.email}
|
||||
</span>
|
||||
</div>
|
||||
<div className="text-pixel-gold text-sm font-semibold mb-2">
|
||||
{feedback.event.name}
|
||||
</div>
|
||||
<div className="text-gray-500 text-xs mb-2">
|
||||
{new Date(feedback.createdAt).toLocaleDateString(
|
||||
"fr-FR",
|
||||
{
|
||||
day: "numeric",
|
||||
month: "long",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
}
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div>{renderStars(feedback.rating)}</div>
|
||||
</div>
|
||||
{feedback.comment && (
|
||||
<div className="mt-3 pt-3 border-t border-pixel-gold/20">
|
||||
<p className="text-gray-300 text-sm whitespace-pre-wrap">
|
||||
{feedback.comment}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -37,6 +37,11 @@ export type Event = Prisma.EventModel
|
||||
*
|
||||
*/
|
||||
export type EventRegistration = Prisma.EventRegistrationModel
|
||||
/**
|
||||
* Model EventFeedback
|
||||
*
|
||||
*/
|
||||
export type EventFeedback = Prisma.EventFeedbackModel
|
||||
/**
|
||||
* Model SitePreferences
|
||||
*
|
||||
|
||||
@@ -59,6 +59,11 @@ export type Event = Prisma.EventModel
|
||||
*
|
||||
*/
|
||||
export type EventRegistration = Prisma.EventRegistrationModel
|
||||
/**
|
||||
* Model EventFeedback
|
||||
*
|
||||
*/
|
||||
export type EventFeedback = Prisma.EventFeedbackModel
|
||||
/**
|
||||
* Model SitePreferences
|
||||
*
|
||||
|
||||
@@ -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 ATELIER\n KATA\n PRESENTATION\n LEARNING_HOUR\n}\n\nenum CharacterClass {\n WARRIOR\n MAGE\n ROGUE\n RANGER\n PALADIN\n ENGINEER\n MERCHANT\n SCHOLAR\n BERSERKER\n NECROMANCER\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 bio String?\n characterClass CharacterClass?\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 DateTime\n name String\n description String\n type EventType\n room String?\n time String?\n maxPlaces Int?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n registrations EventRegistration[]\n\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",
|
||||
"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 ATELIER\n KATA\n PRESENTATION\n LEARNING_HOUR\n}\n\nenum CharacterClass {\n WARRIOR\n MAGE\n ROGUE\n RANGER\n PALADIN\n ENGINEER\n MERCHANT\n SCHOLAR\n BERSERKER\n NECROMANCER\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 bio String?\n characterClass CharacterClass?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n preferences UserPreferences?\n eventRegistrations EventRegistration[]\n eventFeedbacks EventFeedback[]\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 DateTime\n name String\n description String\n type EventType\n room String?\n time String?\n maxPlaces Int?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n registrations EventRegistration[]\n feedbacks EventFeedback[]\n\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 EventFeedback {\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 rating Int // Note de 1 à 5\n comment String? // Commentaire optionnel\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\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\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"characterClass\",\"kind\":\"enum\",\"type\":\"CharacterClass\"},{\"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\":\"DateTime\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"room\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"time\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"maxPlaces\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"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\":{}}")
|
||||
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\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"characterClass\",\"kind\":\"enum\",\"type\":\"CharacterClass\"},{\"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\"},{\"name\":\"eventFeedbacks\",\"kind\":\"object\",\"type\":\"EventFeedback\",\"relationName\":\"EventFeedbackToUser\"}],\"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\":\"DateTime\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"room\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"time\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"maxPlaces\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"registrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventToEventRegistration\"},{\"name\":\"feedbacks\",\"kind\":\"object\",\"type\":\"EventFeedback\",\"relationName\":\"EventToEventFeedback\"}],\"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},\"EventFeedback\":{\"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\":\"EventFeedbackToUser\"},{\"name\":\"event\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToEventFeedback\"},{\"name\":\"rating\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"comment\",\"kind\":\"scalar\",\"type\":\"String\"},{\"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\":{}}")
|
||||
|
||||
async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
|
||||
const { Buffer } = await import('node:buffer')
|
||||
@@ -214,6 +214,16 @@ export interface PrismaClient<
|
||||
*/
|
||||
get eventRegistration(): Prisma.EventRegistrationDelegate<ExtArgs, { omit: OmitOpts }>;
|
||||
|
||||
/**
|
||||
* `prisma.eventFeedback`: Exposes CRUD operations for the **EventFeedback** model.
|
||||
* Example usage:
|
||||
* ```ts
|
||||
* // Fetch zero or more EventFeedbacks
|
||||
* const eventFeedbacks = await prisma.eventFeedback.findMany()
|
||||
* ```
|
||||
*/
|
||||
get eventFeedback(): Prisma.EventFeedbackDelegate<ExtArgs, { omit: OmitOpts }>;
|
||||
|
||||
/**
|
||||
* `prisma.sitePreferences`: Exposes CRUD operations for the **SitePreferences** model.
|
||||
* Example usage:
|
||||
|
||||
@@ -388,6 +388,7 @@ export const ModelName = {
|
||||
UserPreferences: 'UserPreferences',
|
||||
Event: 'Event',
|
||||
EventRegistration: 'EventRegistration',
|
||||
EventFeedback: 'EventFeedback',
|
||||
SitePreferences: 'SitePreferences'
|
||||
} as const
|
||||
|
||||
@@ -404,7 +405,7 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
|
||||
omit: GlobalOmitOptions
|
||||
}
|
||||
meta: {
|
||||
modelProps: "user" | "userPreferences" | "event" | "eventRegistration" | "sitePreferences"
|
||||
modelProps: "user" | "userPreferences" | "event" | "eventRegistration" | "eventFeedback" | "sitePreferences"
|
||||
txIsolationLevel: TransactionIsolationLevel
|
||||
}
|
||||
model: {
|
||||
@@ -704,6 +705,80 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
|
||||
}
|
||||
}
|
||||
}
|
||||
EventFeedback: {
|
||||
payload: Prisma.$EventFeedbackPayload<ExtArgs>
|
||||
fields: Prisma.EventFeedbackFieldRefs
|
||||
operations: {
|
||||
findUnique: {
|
||||
args: Prisma.EventFeedbackFindUniqueArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload> | null
|
||||
}
|
||||
findUniqueOrThrow: {
|
||||
args: Prisma.EventFeedbackFindUniqueOrThrowArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>
|
||||
}
|
||||
findFirst: {
|
||||
args: Prisma.EventFeedbackFindFirstArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload> | null
|
||||
}
|
||||
findFirstOrThrow: {
|
||||
args: Prisma.EventFeedbackFindFirstOrThrowArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>
|
||||
}
|
||||
findMany: {
|
||||
args: Prisma.EventFeedbackFindManyArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>[]
|
||||
}
|
||||
create: {
|
||||
args: Prisma.EventFeedbackCreateArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>
|
||||
}
|
||||
createMany: {
|
||||
args: Prisma.EventFeedbackCreateManyArgs<ExtArgs>
|
||||
result: BatchPayload
|
||||
}
|
||||
createManyAndReturn: {
|
||||
args: Prisma.EventFeedbackCreateManyAndReturnArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>[]
|
||||
}
|
||||
delete: {
|
||||
args: Prisma.EventFeedbackDeleteArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>
|
||||
}
|
||||
update: {
|
||||
args: Prisma.EventFeedbackUpdateArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>
|
||||
}
|
||||
deleteMany: {
|
||||
args: Prisma.EventFeedbackDeleteManyArgs<ExtArgs>
|
||||
result: BatchPayload
|
||||
}
|
||||
updateMany: {
|
||||
args: Prisma.EventFeedbackUpdateManyArgs<ExtArgs>
|
||||
result: BatchPayload
|
||||
}
|
||||
updateManyAndReturn: {
|
||||
args: Prisma.EventFeedbackUpdateManyAndReturnArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>[]
|
||||
}
|
||||
upsert: {
|
||||
args: Prisma.EventFeedbackUpsertArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.PayloadToResult<Prisma.$EventFeedbackPayload>
|
||||
}
|
||||
aggregate: {
|
||||
args: Prisma.EventFeedbackAggregateArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.Optional<Prisma.AggregateEventFeedback>
|
||||
}
|
||||
groupBy: {
|
||||
args: Prisma.EventFeedbackGroupByArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.Optional<Prisma.EventFeedbackGroupByOutputType>[]
|
||||
}
|
||||
count: {
|
||||
args: Prisma.EventFeedbackCountArgs<ExtArgs>
|
||||
result: runtime.Types.Utils.Optional<Prisma.EventFeedbackCountAggregateOutputType> | number
|
||||
}
|
||||
}
|
||||
}
|
||||
SitePreferences: {
|
||||
payload: Prisma.$SitePreferencesPayload<ExtArgs>
|
||||
fields: Prisma.SitePreferencesFieldRefs
|
||||
@@ -876,6 +951,19 @@ export const EventRegistrationScalarFieldEnum = {
|
||||
export type EventRegistrationScalarFieldEnum = (typeof EventRegistrationScalarFieldEnum)[keyof typeof EventRegistrationScalarFieldEnum]
|
||||
|
||||
|
||||
export const EventFeedbackScalarFieldEnum = {
|
||||
id: 'id',
|
||||
userId: 'userId',
|
||||
eventId: 'eventId',
|
||||
rating: 'rating',
|
||||
comment: 'comment',
|
||||
createdAt: 'createdAt',
|
||||
updatedAt: 'updatedAt'
|
||||
} as const
|
||||
|
||||
export type EventFeedbackScalarFieldEnum = (typeof EventFeedbackScalarFieldEnum)[keyof typeof EventFeedbackScalarFieldEnum]
|
||||
|
||||
|
||||
export const SitePreferencesScalarFieldEnum = {
|
||||
id: 'id',
|
||||
homeBackground: 'homeBackground',
|
||||
@@ -1057,6 +1145,7 @@ export type GlobalOmitConfig = {
|
||||
userPreferences?: Prisma.UserPreferencesOmit
|
||||
event?: Prisma.EventOmit
|
||||
eventRegistration?: Prisma.EventRegistrationOmit
|
||||
eventFeedback?: Prisma.EventFeedbackOmit
|
||||
sitePreferences?: Prisma.SitePreferencesOmit
|
||||
}
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@ export const ModelName = {
|
||||
UserPreferences: 'UserPreferences',
|
||||
Event: 'Event',
|
||||
EventRegistration: 'EventRegistration',
|
||||
EventFeedback: 'EventFeedback',
|
||||
SitePreferences: 'SitePreferences'
|
||||
} as const
|
||||
|
||||
@@ -133,6 +134,19 @@ export const EventRegistrationScalarFieldEnum = {
|
||||
export type EventRegistrationScalarFieldEnum = (typeof EventRegistrationScalarFieldEnum)[keyof typeof EventRegistrationScalarFieldEnum]
|
||||
|
||||
|
||||
export const EventFeedbackScalarFieldEnum = {
|
||||
id: 'id',
|
||||
userId: 'userId',
|
||||
eventId: 'eventId',
|
||||
rating: 'rating',
|
||||
comment: 'comment',
|
||||
createdAt: 'createdAt',
|
||||
updatedAt: 'updatedAt'
|
||||
} as const
|
||||
|
||||
export type EventFeedbackScalarFieldEnum = (typeof EventFeedbackScalarFieldEnum)[keyof typeof EventFeedbackScalarFieldEnum]
|
||||
|
||||
|
||||
export const SitePreferencesScalarFieldEnum = {
|
||||
id: 'id',
|
||||
homeBackground: 'homeBackground',
|
||||
|
||||
@@ -12,5 +12,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/EventFeedback'
|
||||
export type * from './models/SitePreferences'
|
||||
export type * from './commonInputTypes'
|
||||
@@ -257,6 +257,7 @@ export type EventWhereInput = {
|
||||
createdAt?: Prisma.DateTimeFilter<"Event"> | Date | string
|
||||
updatedAt?: Prisma.DateTimeFilter<"Event"> | Date | string
|
||||
registrations?: Prisma.EventRegistrationListRelationFilter
|
||||
feedbacks?: Prisma.EventFeedbackListRelationFilter
|
||||
}
|
||||
|
||||
export type EventOrderByWithRelationInput = {
|
||||
@@ -271,6 +272,7 @@ export type EventOrderByWithRelationInput = {
|
||||
createdAt?: Prisma.SortOrder
|
||||
updatedAt?: Prisma.SortOrder
|
||||
registrations?: Prisma.EventRegistrationOrderByRelationAggregateInput
|
||||
feedbacks?: Prisma.EventFeedbackOrderByRelationAggregateInput
|
||||
}
|
||||
|
||||
export type EventWhereUniqueInput = Prisma.AtLeast<{
|
||||
@@ -288,6 +290,7 @@ export type EventWhereUniqueInput = Prisma.AtLeast<{
|
||||
createdAt?: Prisma.DateTimeFilter<"Event"> | Date | string
|
||||
updatedAt?: Prisma.DateTimeFilter<"Event"> | Date | string
|
||||
registrations?: Prisma.EventRegistrationListRelationFilter
|
||||
feedbacks?: Prisma.EventFeedbackListRelationFilter
|
||||
}, "id">
|
||||
|
||||
export type EventOrderByWithAggregationInput = {
|
||||
@@ -336,6 +339,7 @@ export type EventCreateInput = {
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
registrations?: Prisma.EventRegistrationCreateNestedManyWithoutEventInput
|
||||
feedbacks?: Prisma.EventFeedbackCreateNestedManyWithoutEventInput
|
||||
}
|
||||
|
||||
export type EventUncheckedCreateInput = {
|
||||
@@ -350,6 +354,7 @@ export type EventUncheckedCreateInput = {
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
registrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutEventInput
|
||||
feedbacks?: Prisma.EventFeedbackUncheckedCreateNestedManyWithoutEventInput
|
||||
}
|
||||
|
||||
export type EventUpdateInput = {
|
||||
@@ -364,6 +369,7 @@ export type EventUpdateInput = {
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
registrations?: Prisma.EventRegistrationUpdateManyWithoutEventNestedInput
|
||||
feedbacks?: Prisma.EventFeedbackUpdateManyWithoutEventNestedInput
|
||||
}
|
||||
|
||||
export type EventUncheckedUpdateInput = {
|
||||
@@ -378,6 +384,7 @@ export type EventUncheckedUpdateInput = {
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
registrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutEventNestedInput
|
||||
feedbacks?: Prisma.EventFeedbackUncheckedUpdateManyWithoutEventNestedInput
|
||||
}
|
||||
|
||||
export type EventCreateManyInput = {
|
||||
@@ -497,6 +504,20 @@ export type EventUpdateOneRequiredWithoutRegistrationsNestedInput = {
|
||||
update?: Prisma.XOR<Prisma.XOR<Prisma.EventUpdateToOneWithWhereWithoutRegistrationsInput, Prisma.EventUpdateWithoutRegistrationsInput>, Prisma.EventUncheckedUpdateWithoutRegistrationsInput>
|
||||
}
|
||||
|
||||
export type EventCreateNestedOneWithoutFeedbacksInput = {
|
||||
create?: Prisma.XOR<Prisma.EventCreateWithoutFeedbacksInput, Prisma.EventUncheckedCreateWithoutFeedbacksInput>
|
||||
connectOrCreate?: Prisma.EventCreateOrConnectWithoutFeedbacksInput
|
||||
connect?: Prisma.EventWhereUniqueInput
|
||||
}
|
||||
|
||||
export type EventUpdateOneRequiredWithoutFeedbacksNestedInput = {
|
||||
create?: Prisma.XOR<Prisma.EventCreateWithoutFeedbacksInput, Prisma.EventUncheckedCreateWithoutFeedbacksInput>
|
||||
connectOrCreate?: Prisma.EventCreateOrConnectWithoutFeedbacksInput
|
||||
upsert?: Prisma.EventUpsertWithoutFeedbacksInput
|
||||
connect?: Prisma.EventWhereUniqueInput
|
||||
update?: Prisma.XOR<Prisma.XOR<Prisma.EventUpdateToOneWithWhereWithoutFeedbacksInput, Prisma.EventUpdateWithoutFeedbacksInput>, Prisma.EventUncheckedUpdateWithoutFeedbacksInput>
|
||||
}
|
||||
|
||||
export type EventCreateWithoutRegistrationsInput = {
|
||||
id?: string
|
||||
date: Date | string
|
||||
@@ -508,6 +529,7 @@ export type EventCreateWithoutRegistrationsInput = {
|
||||
maxPlaces?: number | null
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
feedbacks?: Prisma.EventFeedbackCreateNestedManyWithoutEventInput
|
||||
}
|
||||
|
||||
export type EventUncheckedCreateWithoutRegistrationsInput = {
|
||||
@@ -521,6 +543,7 @@ export type EventUncheckedCreateWithoutRegistrationsInput = {
|
||||
maxPlaces?: number | null
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
feedbacks?: Prisma.EventFeedbackUncheckedCreateNestedManyWithoutEventInput
|
||||
}
|
||||
|
||||
export type EventCreateOrConnectWithoutRegistrationsInput = {
|
||||
@@ -550,6 +573,7 @@ export type EventUpdateWithoutRegistrationsInput = {
|
||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
feedbacks?: Prisma.EventFeedbackUpdateManyWithoutEventNestedInput
|
||||
}
|
||||
|
||||
export type EventUncheckedUpdateWithoutRegistrationsInput = {
|
||||
@@ -563,6 +587,79 @@ export type EventUncheckedUpdateWithoutRegistrationsInput = {
|
||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
feedbacks?: Prisma.EventFeedbackUncheckedUpdateManyWithoutEventNestedInput
|
||||
}
|
||||
|
||||
export type EventCreateWithoutFeedbacksInput = {
|
||||
id?: string
|
||||
date: Date | string
|
||||
name: string
|
||||
description: string
|
||||
type: $Enums.EventType
|
||||
room?: string | null
|
||||
time?: string | null
|
||||
maxPlaces?: number | null
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
registrations?: Prisma.EventRegistrationCreateNestedManyWithoutEventInput
|
||||
}
|
||||
|
||||
export type EventUncheckedCreateWithoutFeedbacksInput = {
|
||||
id?: string
|
||||
date: Date | string
|
||||
name: string
|
||||
description: string
|
||||
type: $Enums.EventType
|
||||
room?: string | null
|
||||
time?: string | null
|
||||
maxPlaces?: number | null
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
registrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutEventInput
|
||||
}
|
||||
|
||||
export type EventCreateOrConnectWithoutFeedbacksInput = {
|
||||
where: Prisma.EventWhereUniqueInput
|
||||
create: Prisma.XOR<Prisma.EventCreateWithoutFeedbacksInput, Prisma.EventUncheckedCreateWithoutFeedbacksInput>
|
||||
}
|
||||
|
||||
export type EventUpsertWithoutFeedbacksInput = {
|
||||
update: Prisma.XOR<Prisma.EventUpdateWithoutFeedbacksInput, Prisma.EventUncheckedUpdateWithoutFeedbacksInput>
|
||||
create: Prisma.XOR<Prisma.EventCreateWithoutFeedbacksInput, Prisma.EventUncheckedCreateWithoutFeedbacksInput>
|
||||
where?: Prisma.EventWhereInput
|
||||
}
|
||||
|
||||
export type EventUpdateToOneWithWhereWithoutFeedbacksInput = {
|
||||
where?: Prisma.EventWhereInput
|
||||
data: Prisma.XOR<Prisma.EventUpdateWithoutFeedbacksInput, Prisma.EventUncheckedUpdateWithoutFeedbacksInput>
|
||||
}
|
||||
|
||||
export type EventUpdateWithoutFeedbacksInput = {
|
||||
id?: Prisma.StringFieldUpdateOperationsInput | string
|
||||
date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
name?: Prisma.StringFieldUpdateOperationsInput | string
|
||||
description?: Prisma.StringFieldUpdateOperationsInput | string
|
||||
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
||||
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
registrations?: Prisma.EventRegistrationUpdateManyWithoutEventNestedInput
|
||||
}
|
||||
|
||||
export type EventUncheckedUpdateWithoutFeedbacksInput = {
|
||||
id?: Prisma.StringFieldUpdateOperationsInput | string
|
||||
date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
name?: Prisma.StringFieldUpdateOperationsInput | string
|
||||
description?: Prisma.StringFieldUpdateOperationsInput | string
|
||||
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
||||
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
registrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutEventNestedInput
|
||||
}
|
||||
|
||||
|
||||
@@ -572,10 +669,12 @@ export type EventUncheckedUpdateWithoutRegistrationsInput = {
|
||||
|
||||
export type EventCountOutputType = {
|
||||
registrations: number
|
||||
feedbacks: number
|
||||
}
|
||||
|
||||
export type EventCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||
registrations?: boolean | EventCountOutputTypeCountRegistrationsArgs
|
||||
feedbacks?: boolean | EventCountOutputTypeCountFeedbacksArgs
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -595,6 +694,13 @@ export type EventCountOutputTypeCountRegistrationsArgs<ExtArgs extends runtime.T
|
||||
where?: Prisma.EventRegistrationWhereInput
|
||||
}
|
||||
|
||||
/**
|
||||
* EventCountOutputType without action
|
||||
*/
|
||||
export type EventCountOutputTypeCountFeedbacksArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||
where?: Prisma.EventFeedbackWhereInput
|
||||
}
|
||||
|
||||
|
||||
export type EventSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
|
||||
id?: boolean
|
||||
@@ -608,6 +714,7 @@ export type EventSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs =
|
||||
createdAt?: boolean
|
||||
updatedAt?: boolean
|
||||
registrations?: boolean | Prisma.Event$registrationsArgs<ExtArgs>
|
||||
feedbacks?: boolean | Prisma.Event$feedbacksArgs<ExtArgs>
|
||||
_count?: boolean | Prisma.EventCountOutputTypeDefaultArgs<ExtArgs>
|
||||
}, ExtArgs["result"]["event"]>
|
||||
|
||||
@@ -653,6 +760,7 @@ 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" | "room" | "time" | "maxPlaces" | "createdAt" | "updatedAt", ExtArgs["result"]["event"]>
|
||||
export type EventInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||
registrations?: boolean | Prisma.Event$registrationsArgs<ExtArgs>
|
||||
feedbacks?: boolean | Prisma.Event$feedbacksArgs<ExtArgs>
|
||||
_count?: boolean | Prisma.EventCountOutputTypeDefaultArgs<ExtArgs>
|
||||
}
|
||||
export type EventIncludeCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {}
|
||||
@@ -662,6 +770,7 @@ export type $EventPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs
|
||||
name: "Event"
|
||||
objects: {
|
||||
registrations: Prisma.$EventRegistrationPayload<ExtArgs>[]
|
||||
feedbacks: Prisma.$EventFeedbackPayload<ExtArgs>[]
|
||||
}
|
||||
scalars: runtime.Types.Extensions.GetPayloadResult<{
|
||||
id: string
|
||||
@@ -1069,6 +1178,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>
|
||||
feedbacks<T extends Prisma.Event$feedbacksArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.Event$feedbacksArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$EventFeedbackPayload<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.
|
||||
@@ -1517,6 +1627,30 @@ export type Event$registrationsArgs<ExtArgs extends runtime.Types.Extensions.Int
|
||||
distinct?: Prisma.EventRegistrationScalarFieldEnum | Prisma.EventRegistrationScalarFieldEnum[]
|
||||
}
|
||||
|
||||
/**
|
||||
* Event.feedbacks
|
||||
*/
|
||||
export type Event$feedbacksArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||
/**
|
||||
* Select specific fields to fetch from the EventFeedback
|
||||
*/
|
||||
select?: Prisma.EventFeedbackSelect<ExtArgs> | null
|
||||
/**
|
||||
* Omit specific fields from the EventFeedback
|
||||
*/
|
||||
omit?: Prisma.EventFeedbackOmit<ExtArgs> | null
|
||||
/**
|
||||
* Choose, which related nodes to fetch as well
|
||||
*/
|
||||
include?: Prisma.EventFeedbackInclude<ExtArgs> | null
|
||||
where?: Prisma.EventFeedbackWhereInput
|
||||
orderBy?: Prisma.EventFeedbackOrderByWithRelationInput | Prisma.EventFeedbackOrderByWithRelationInput[]
|
||||
cursor?: Prisma.EventFeedbackWhereUniqueInput
|
||||
take?: number
|
||||
skip?: number
|
||||
distinct?: Prisma.EventFeedbackScalarFieldEnum | Prisma.EventFeedbackScalarFieldEnum[]
|
||||
}
|
||||
|
||||
/**
|
||||
* Event without action
|
||||
*/
|
||||
|
||||
1588
prisma/generated/prisma/models/EventFeedback.ts
Normal file
1588
prisma/generated/prisma/models/EventFeedback.ts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -326,6 +326,7 @@ export type UserWhereInput = {
|
||||
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
||||
preferences?: Prisma.XOR<Prisma.UserPreferencesNullableScalarRelationFilter, Prisma.UserPreferencesWhereInput> | null
|
||||
eventRegistrations?: Prisma.EventRegistrationListRelationFilter
|
||||
eventFeedbacks?: Prisma.EventFeedbackListRelationFilter
|
||||
}
|
||||
|
||||
export type UserOrderByWithRelationInput = {
|
||||
@@ -347,6 +348,7 @@ export type UserOrderByWithRelationInput = {
|
||||
updatedAt?: Prisma.SortOrder
|
||||
preferences?: Prisma.UserPreferencesOrderByWithRelationInput
|
||||
eventRegistrations?: Prisma.EventRegistrationOrderByRelationAggregateInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackOrderByRelationAggregateInput
|
||||
}
|
||||
|
||||
export type UserWhereUniqueInput = Prisma.AtLeast<{
|
||||
@@ -371,6 +373,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{
|
||||
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
||||
preferences?: Prisma.XOR<Prisma.UserPreferencesNullableScalarRelationFilter, Prisma.UserPreferencesWhereInput> | null
|
||||
eventRegistrations?: Prisma.EventRegistrationListRelationFilter
|
||||
eventFeedbacks?: Prisma.EventFeedbackListRelationFilter
|
||||
}, "id" | "email" | "username">
|
||||
|
||||
export type UserOrderByWithAggregationInput = {
|
||||
@@ -438,6 +441,7 @@ export type UserCreateInput = {
|
||||
updatedAt?: Date | string
|
||||
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
|
||||
eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackCreateNestedManyWithoutUserInput
|
||||
}
|
||||
|
||||
export type UserUncheckedCreateInput = {
|
||||
@@ -459,6 +463,7 @@ export type UserUncheckedCreateInput = {
|
||||
updatedAt?: Date | string
|
||||
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
|
||||
eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUncheckedCreateNestedManyWithoutUserInput
|
||||
}
|
||||
|
||||
export type UserUpdateInput = {
|
||||
@@ -480,6 +485,7 @@ export type UserUpdateInput = {
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
|
||||
eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUpdateManyWithoutUserNestedInput
|
||||
}
|
||||
|
||||
export type UserUncheckedUpdateInput = {
|
||||
@@ -501,6 +507,7 @@ export type UserUncheckedUpdateInput = {
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
|
||||
eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUncheckedUpdateManyWithoutUserNestedInput
|
||||
}
|
||||
|
||||
export type UserCreateManyInput = {
|
||||
@@ -696,6 +703,20 @@ export type UserUpdateOneRequiredWithoutEventRegistrationsNestedInput = {
|
||||
update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutEventRegistrationsInput, Prisma.UserUpdateWithoutEventRegistrationsInput>, Prisma.UserUncheckedUpdateWithoutEventRegistrationsInput>
|
||||
}
|
||||
|
||||
export type UserCreateNestedOneWithoutEventFeedbacksInput = {
|
||||
create?: Prisma.XOR<Prisma.UserCreateWithoutEventFeedbacksInput, Prisma.UserUncheckedCreateWithoutEventFeedbacksInput>
|
||||
connectOrCreate?: Prisma.UserCreateOrConnectWithoutEventFeedbacksInput
|
||||
connect?: Prisma.UserWhereUniqueInput
|
||||
}
|
||||
|
||||
export type UserUpdateOneRequiredWithoutEventFeedbacksNestedInput = {
|
||||
create?: Prisma.XOR<Prisma.UserCreateWithoutEventFeedbacksInput, Prisma.UserUncheckedCreateWithoutEventFeedbacksInput>
|
||||
connectOrCreate?: Prisma.UserCreateOrConnectWithoutEventFeedbacksInput
|
||||
upsert?: Prisma.UserUpsertWithoutEventFeedbacksInput
|
||||
connect?: Prisma.UserWhereUniqueInput
|
||||
update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutEventFeedbacksInput, Prisma.UserUpdateWithoutEventFeedbacksInput>, Prisma.UserUncheckedUpdateWithoutEventFeedbacksInput>
|
||||
}
|
||||
|
||||
export type UserCreateWithoutPreferencesInput = {
|
||||
id?: string
|
||||
email: string
|
||||
@@ -714,6 +735,7 @@ export type UserCreateWithoutPreferencesInput = {
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackCreateNestedManyWithoutUserInput
|
||||
}
|
||||
|
||||
export type UserUncheckedCreateWithoutPreferencesInput = {
|
||||
@@ -734,6 +756,7 @@ export type UserUncheckedCreateWithoutPreferencesInput = {
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUncheckedCreateNestedManyWithoutUserInput
|
||||
}
|
||||
|
||||
export type UserCreateOrConnectWithoutPreferencesInput = {
|
||||
@@ -770,6 +793,7 @@ export type UserUpdateWithoutPreferencesInput = {
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUpdateManyWithoutUserNestedInput
|
||||
}
|
||||
|
||||
export type UserUncheckedUpdateWithoutPreferencesInput = {
|
||||
@@ -790,6 +814,7 @@ export type UserUncheckedUpdateWithoutPreferencesInput = {
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUncheckedUpdateManyWithoutUserNestedInput
|
||||
}
|
||||
|
||||
export type UserCreateWithoutEventRegistrationsInput = {
|
||||
@@ -810,6 +835,7 @@ export type UserCreateWithoutEventRegistrationsInput = {
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackCreateNestedManyWithoutUserInput
|
||||
}
|
||||
|
||||
export type UserUncheckedCreateWithoutEventRegistrationsInput = {
|
||||
@@ -830,6 +856,7 @@ export type UserUncheckedCreateWithoutEventRegistrationsInput = {
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUncheckedCreateNestedManyWithoutUserInput
|
||||
}
|
||||
|
||||
export type UserCreateOrConnectWithoutEventRegistrationsInput = {
|
||||
@@ -866,6 +893,7 @@ export type UserUpdateWithoutEventRegistrationsInput = {
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUpdateManyWithoutUserNestedInput
|
||||
}
|
||||
|
||||
export type UserUncheckedUpdateWithoutEventRegistrationsInput = {
|
||||
@@ -886,6 +914,107 @@ export type UserUncheckedUpdateWithoutEventRegistrationsInput = {
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
|
||||
eventFeedbacks?: Prisma.EventFeedbackUncheckedUpdateManyWithoutUserNestedInput
|
||||
}
|
||||
|
||||
export type UserCreateWithoutEventFeedbacksInput = {
|
||||
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
|
||||
bio?: string | null
|
||||
characterClass?: $Enums.CharacterClass | null
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
|
||||
eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput
|
||||
}
|
||||
|
||||
export type UserUncheckedCreateWithoutEventFeedbacksInput = {
|
||||
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
|
||||
bio?: string | null
|
||||
characterClass?: $Enums.CharacterClass | null
|
||||
createdAt?: Date | string
|
||||
updatedAt?: Date | string
|
||||
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
|
||||
eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput
|
||||
}
|
||||
|
||||
export type UserCreateOrConnectWithoutEventFeedbacksInput = {
|
||||
where: Prisma.UserWhereUniqueInput
|
||||
create: Prisma.XOR<Prisma.UserCreateWithoutEventFeedbacksInput, Prisma.UserUncheckedCreateWithoutEventFeedbacksInput>
|
||||
}
|
||||
|
||||
export type UserUpsertWithoutEventFeedbacksInput = {
|
||||
update: Prisma.XOR<Prisma.UserUpdateWithoutEventFeedbacksInput, Prisma.UserUncheckedUpdateWithoutEventFeedbacksInput>
|
||||
create: Prisma.XOR<Prisma.UserCreateWithoutEventFeedbacksInput, Prisma.UserUncheckedCreateWithoutEventFeedbacksInput>
|
||||
where?: Prisma.UserWhereInput
|
||||
}
|
||||
|
||||
export type UserUpdateToOneWithWhereWithoutEventFeedbacksInput = {
|
||||
where?: Prisma.UserWhereInput
|
||||
data: Prisma.XOR<Prisma.UserUpdateWithoutEventFeedbacksInput, Prisma.UserUncheckedUpdateWithoutEventFeedbacksInput>
|
||||
}
|
||||
|
||||
export type UserUpdateWithoutEventFeedbacksInput = {
|
||||
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
|
||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
|
||||
eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput
|
||||
}
|
||||
|
||||
export type UserUncheckedUpdateWithoutEventFeedbacksInput = {
|
||||
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
|
||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
|
||||
eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput
|
||||
}
|
||||
|
||||
|
||||
@@ -895,10 +1024,12 @@ export type UserUncheckedUpdateWithoutEventRegistrationsInput = {
|
||||
|
||||
export type UserCountOutputType = {
|
||||
eventRegistrations: number
|
||||
eventFeedbacks: number
|
||||
}
|
||||
|
||||
export type UserCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||
eventRegistrations?: boolean | UserCountOutputTypeCountEventRegistrationsArgs
|
||||
eventFeedbacks?: boolean | UserCountOutputTypeCountEventFeedbacksArgs
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -918,6 +1049,13 @@ export type UserCountOutputTypeCountEventRegistrationsArgs<ExtArgs extends runti
|
||||
where?: Prisma.EventRegistrationWhereInput
|
||||
}
|
||||
|
||||
/**
|
||||
* UserCountOutputType without action
|
||||
*/
|
||||
export type UserCountOutputTypeCountEventFeedbacksArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||
where?: Prisma.EventFeedbackWhereInput
|
||||
}
|
||||
|
||||
|
||||
export type UserSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
|
||||
id?: boolean
|
||||
@@ -938,6 +1076,7 @@ export type UserSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = r
|
||||
updatedAt?: boolean
|
||||
preferences?: boolean | Prisma.User$preferencesArgs<ExtArgs>
|
||||
eventRegistrations?: boolean | Prisma.User$eventRegistrationsArgs<ExtArgs>
|
||||
eventFeedbacks?: boolean | Prisma.User$eventFeedbacksArgs<ExtArgs>
|
||||
_count?: boolean | Prisma.UserCountOutputTypeDefaultArgs<ExtArgs>
|
||||
}, ExtArgs["result"]["user"]>
|
||||
|
||||
@@ -1002,6 +1141,7 @@ export type UserOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = run
|
||||
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>
|
||||
eventFeedbacks?: boolean | Prisma.User$eventFeedbacksArgs<ExtArgs>
|
||||
_count?: boolean | Prisma.UserCountOutputTypeDefaultArgs<ExtArgs>
|
||||
}
|
||||
export type UserIncludeCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {}
|
||||
@@ -1012,6 +1152,7 @@ export type $UserPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
|
||||
objects: {
|
||||
preferences: Prisma.$UserPreferencesPayload<ExtArgs> | null
|
||||
eventRegistrations: Prisma.$EventRegistrationPayload<ExtArgs>[]
|
||||
eventFeedbacks: Prisma.$EventFeedbackPayload<ExtArgs>[]
|
||||
}
|
||||
scalars: runtime.Types.Extensions.GetPayloadResult<{
|
||||
id: string
|
||||
@@ -1426,6 +1567,7 @@ export interface Prisma__UserClient<T, Null = never, ExtArgs extends runtime.Typ
|
||||
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>
|
||||
eventFeedbacks<T extends Prisma.User$eventFeedbacksArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$eventFeedbacksArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$EventFeedbackPayload<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.
|
||||
@@ -1899,6 +2041,30 @@ export type User$eventRegistrationsArgs<ExtArgs extends runtime.Types.Extensions
|
||||
distinct?: Prisma.EventRegistrationScalarFieldEnum | Prisma.EventRegistrationScalarFieldEnum[]
|
||||
}
|
||||
|
||||
/**
|
||||
* User.eventFeedbacks
|
||||
*/
|
||||
export type User$eventFeedbacksArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||
/**
|
||||
* Select specific fields to fetch from the EventFeedback
|
||||
*/
|
||||
select?: Prisma.EventFeedbackSelect<ExtArgs> | null
|
||||
/**
|
||||
* Omit specific fields from the EventFeedback
|
||||
*/
|
||||
omit?: Prisma.EventFeedbackOmit<ExtArgs> | null
|
||||
/**
|
||||
* Choose, which related nodes to fetch as well
|
||||
*/
|
||||
include?: Prisma.EventFeedbackInclude<ExtArgs> | null
|
||||
where?: Prisma.EventFeedbackWhereInput
|
||||
orderBy?: Prisma.EventFeedbackOrderByWithRelationInput | Prisma.EventFeedbackOrderByWithRelationInput[]
|
||||
cursor?: Prisma.EventFeedbackWhereUniqueInput
|
||||
take?: number
|
||||
skip?: number
|
||||
distinct?: Prisma.EventFeedbackScalarFieldEnum | Prisma.EventFeedbackScalarFieldEnum[]
|
||||
}
|
||||
|
||||
/**
|
||||
* User without action
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "EventFeedback" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"eventId" TEXT NOT NULL,
|
||||
"rating" INTEGER NOT NULL,
|
||||
"comment" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "EventFeedback_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "EventFeedback_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "EventFeedback_userId_eventId_key" ON "EventFeedback"("userId", "eventId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "EventFeedback_userId_idx" ON "EventFeedback"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "EventFeedback_eventId_idx" ON "EventFeedback"("eventId");
|
||||
|
||||
@@ -54,6 +54,7 @@ model User {
|
||||
updatedAt DateTime @updatedAt
|
||||
preferences UserPreferences?
|
||||
eventRegistrations EventRegistration[]
|
||||
eventFeedbacks EventFeedback[]
|
||||
|
||||
@@index([score])
|
||||
@@index([email])
|
||||
@@ -88,6 +89,7 @@ model Event {
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
registrations EventRegistration[]
|
||||
feedbacks EventFeedback[]
|
||||
|
||||
@@index([date])
|
||||
}
|
||||
@@ -105,6 +107,22 @@ model EventRegistration {
|
||||
@@index([eventId])
|
||||
}
|
||||
|
||||
model EventFeedback {
|
||||
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)
|
||||
rating Int // Note de 1 à 5
|
||||
comment String? // Commentaire optionnel
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@unique([userId, eventId])
|
||||
@@index([userId])
|
||||
@@index([eventId])
|
||||
}
|
||||
|
||||
model SitePreferences {
|
||||
id String @id @default("global")
|
||||
homeBackground String?
|
||||
|
||||
Reference in New Issue
Block a user