Refactor event status handling: Remove EventStatus enum from the Prisma schema and update related API routes and UI components to calculate event status dynamically based on event date. This change simplifies event management and enhances data integrity by ensuring status is always derived from the date.
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { auth } from "@/lib/auth";
|
import { auth } from "@/lib/auth";
|
||||||
import { prisma } from "@/lib/prisma";
|
import { prisma } from "@/lib/prisma";
|
||||||
import { Role, EventType, EventStatus } from "@/prisma/generated/prisma/client";
|
import { Role, EventType } from "@/prisma/generated/prisma/client";
|
||||||
|
|
||||||
export async function PUT(
|
export async function PUT(
|
||||||
request: Request,
|
request: Request,
|
||||||
@@ -16,7 +16,8 @@ export async function PUT(
|
|||||||
|
|
||||||
const { id } = await params;
|
const { id } = await params;
|
||||||
const body = await request.json();
|
const body = await request.json();
|
||||||
const { date, name, description, type, status, room, time, maxPlaces } = body;
|
const { date, name, description, type, room, time, maxPlaces } = body;
|
||||||
|
// Le statut est ignoré s'il est fourni, il sera calculé automatiquement
|
||||||
|
|
||||||
// Vérifier que l'événement existe
|
// Vérifier que l'événement existe
|
||||||
const existingEvent = await prisma.event.findUnique({
|
const existingEvent = await prisma.event.findUnique({
|
||||||
@@ -35,7 +36,6 @@ export async function PUT(
|
|||||||
name?: string;
|
name?: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
type?: EventType;
|
type?: EventType;
|
||||||
status?: EventStatus;
|
|
||||||
room?: string | null;
|
room?: string | null;
|
||||||
time?: string | null;
|
time?: string | null;
|
||||||
maxPlaces?: number | null;
|
maxPlaces?: number | null;
|
||||||
@@ -62,18 +62,11 @@ export async function PUT(
|
|||||||
}
|
}
|
||||||
updateData.type = type as EventType;
|
updateData.type = type as EventType;
|
||||||
}
|
}
|
||||||
if (status !== undefined) {
|
// Le statut est toujours calculé automatiquement, on ignore s'il est fourni
|
||||||
if (!Object.values(EventStatus).includes(status)) {
|
|
||||||
return NextResponse.json(
|
|
||||||
{ error: "Statut d'événement invalide" },
|
|
||||||
{ status: 400 }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
updateData.status = status as EventStatus;
|
|
||||||
}
|
|
||||||
if (room !== undefined) updateData.room = room || null;
|
if (room !== undefined) updateData.room = room || null;
|
||||||
if (time !== undefined) updateData.time = time || null;
|
if (time !== undefined) updateData.time = time || null;
|
||||||
if (maxPlaces !== undefined) updateData.maxPlaces = maxPlaces ? parseInt(maxPlaces) : null;
|
if (maxPlaces !== undefined)
|
||||||
|
updateData.maxPlaces = maxPlaces ? parseInt(maxPlaces) : null;
|
||||||
|
|
||||||
const event = await prisma.event.update({
|
const event = await prisma.event.update({
|
||||||
where: { id },
|
where: { id },
|
||||||
@@ -128,4 +121,3 @@ export async function DELETE(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { auth } from "@/lib/auth";
|
import { auth } from "@/lib/auth";
|
||||||
import { prisma } from "@/lib/prisma";
|
import { prisma } from "@/lib/prisma";
|
||||||
import { Role, EventType, EventStatus } from "@/prisma/generated/prisma/client";
|
import { Role, EventType } from "@/prisma/generated/prisma/client";
|
||||||
|
import { calculateEventStatus } from "@/lib/eventStatus";
|
||||||
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
try {
|
try {
|
||||||
@@ -15,18 +16,7 @@ export async function GET() {
|
|||||||
orderBy: {
|
orderBy: {
|
||||||
date: "desc",
|
date: "desc",
|
||||||
},
|
},
|
||||||
select: {
|
include: {
|
||||||
id: true,
|
|
||||||
date: true,
|
|
||||||
name: true,
|
|
||||||
description: true,
|
|
||||||
type: true,
|
|
||||||
status: true,
|
|
||||||
room: true,
|
|
||||||
time: true,
|
|
||||||
maxPlaces: true,
|
|
||||||
createdAt: true,
|
|
||||||
updatedAt: true,
|
|
||||||
_count: {
|
_count: {
|
||||||
select: {
|
select: {
|
||||||
registrations: true,
|
registrations: true,
|
||||||
@@ -36,13 +26,14 @@ export async function GET() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Transformer les données pour inclure le nombre d'inscriptions
|
// Transformer les données pour inclure le nombre d'inscriptions
|
||||||
|
// Le statut est calculé automatiquement en fonction de la date
|
||||||
const eventsWithCount = events.map((event) => ({
|
const eventsWithCount = events.map((event) => ({
|
||||||
id: event.id,
|
id: event.id,
|
||||||
date: event.date.toISOString(),
|
date: event.date.toISOString(),
|
||||||
name: event.name,
|
name: event.name,
|
||||||
description: event.description,
|
description: event.description,
|
||||||
type: event.type,
|
type: event.type,
|
||||||
status: event.status,
|
status: calculateEventStatus(event.date),
|
||||||
room: event.room,
|
room: event.room,
|
||||||
time: event.time,
|
time: event.time,
|
||||||
maxPlaces: event.maxPlaces,
|
maxPlaces: event.maxPlaces,
|
||||||
@@ -70,15 +61,24 @@ export async function POST(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const body = await request.json();
|
const body = await request.json();
|
||||||
const { date, name, description, type, status, room, time, maxPlaces } = body;
|
const { date, name, description, type, room, time, maxPlaces } = body;
|
||||||
|
|
||||||
if (!date || !name || !description || !type || !status) {
|
if (!date || !name || !description || !type) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ error: "Tous les champs sont requis" },
|
{ error: "Tous les champs sont requis" },
|
||||||
{ status: 400 }
|
{ status: 400 }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convertir la date string en Date object
|
||||||
|
const eventDate = new Date(date);
|
||||||
|
if (isNaN(eventDate.getTime())) {
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: "Format de date invalide" },
|
||||||
|
{ status: 400 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Valider les enums
|
// Valider les enums
|
||||||
if (!Object.values(EventType).includes(type)) {
|
if (!Object.values(EventType).includes(type)) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
@@ -87,20 +87,12 @@ export async function POST(request: Request) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Object.values(EventStatus).includes(status)) {
|
|
||||||
return NextResponse.json(
|
|
||||||
{ error: "Statut d'événement invalide" },
|
|
||||||
{ status: 400 }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const event = await prisma.event.create({
|
const event = await prisma.event.create({
|
||||||
data: {
|
data: {
|
||||||
date: eventDate,
|
date: eventDate,
|
||||||
name,
|
name,
|
||||||
description,
|
description,
|
||||||
type: type as EventType,
|
type: type as EventType,
|
||||||
status: status as EventStatus,
|
|
||||||
room: room || null,
|
room: room || null,
|
||||||
time: time || null,
|
time: time || null,
|
||||||
maxPlaces: maxPlaces ? parseInt(maxPlaces) : null,
|
maxPlaces: maxPlaces ? parseInt(maxPlaces) : null,
|
||||||
@@ -116,4 +108,3 @@ export async function POST(request: Request) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import EventsPageSection from "@/components/EventsPageSection";
|
|||||||
import { prisma } from "@/lib/prisma";
|
import { prisma } from "@/lib/prisma";
|
||||||
import { getBackgroundImage } from "@/lib/preferences";
|
import { getBackgroundImage } from "@/lib/preferences";
|
||||||
import { auth } from "@/lib/auth";
|
import { auth } from "@/lib/auth";
|
||||||
|
import { calculateEventStatus } from "@/lib/eventStatus";
|
||||||
|
|
||||||
export default async function EventsPage() {
|
export default async function EventsPage() {
|
||||||
const events = await prisma.event.findMany({
|
const events = await prisma.event.findMany({
|
||||||
@@ -26,7 +27,9 @@ export default async function EventsPage() {
|
|||||||
const initialRegistrations: Record<string, boolean> = {};
|
const initialRegistrations: Record<string, boolean> = {};
|
||||||
|
|
||||||
if (session?.user?.id) {
|
if (session?.user?.id) {
|
||||||
const upcomingEvents = events.filter((e) => e.status === "UPCOMING");
|
const upcomingEvents = events.filter(
|
||||||
|
(e) => calculateEventStatus(e.date) === "UPCOMING"
|
||||||
|
);
|
||||||
const eventIds = upcomingEvents.map((e) => e.id);
|
const eventIds = upcomingEvents.map((e) => e.id);
|
||||||
|
|
||||||
if (eventIds.length > 0) {
|
if (eventIds.length > 0) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect } from "react";
|
||||||
|
import { calculateEventStatus } from "@/lib/eventStatus";
|
||||||
|
|
||||||
interface Event {
|
interface Event {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -22,7 +23,6 @@ interface EventFormData {
|
|||||||
name: string;
|
name: string;
|
||||||
description: string;
|
description: string;
|
||||||
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
|
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
|
||||||
status: "UPCOMING" | "LIVE" | "PAST";
|
|
||||||
room?: string;
|
room?: string;
|
||||||
time?: string;
|
time?: string;
|
||||||
maxPlaces?: number;
|
maxPlaces?: number;
|
||||||
@@ -35,8 +35,6 @@ const eventTypes: Event["type"][] = [
|
|||||||
"COMPETITION",
|
"COMPETITION",
|
||||||
"CODE_KATA",
|
"CODE_KATA",
|
||||||
];
|
];
|
||||||
const eventStatuses: Event["status"][] = ["UPCOMING", "LIVE", "PAST"];
|
|
||||||
|
|
||||||
const getEventTypeLabel = (type: Event["type"]) => {
|
const getEventTypeLabel = (type: Event["type"]) => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "SUMMIT":
|
case "SUMMIT":
|
||||||
@@ -78,7 +76,6 @@ export default function EventManagement() {
|
|||||||
name: "",
|
name: "",
|
||||||
description: "",
|
description: "",
|
||||||
type: "SUMMIT",
|
type: "SUMMIT",
|
||||||
status: "UPCOMING",
|
|
||||||
room: "",
|
room: "",
|
||||||
time: "",
|
time: "",
|
||||||
maxPlaces: undefined,
|
maxPlaces: undefined,
|
||||||
@@ -110,7 +107,6 @@ export default function EventManagement() {
|
|||||||
name: "",
|
name: "",
|
||||||
description: "",
|
description: "",
|
||||||
type: "SUMMIT",
|
type: "SUMMIT",
|
||||||
status: "UPCOMING",
|
|
||||||
room: "",
|
room: "",
|
||||||
time: "",
|
time: "",
|
||||||
maxPlaces: undefined,
|
maxPlaces: undefined,
|
||||||
@@ -125,7 +121,6 @@ export default function EventManagement() {
|
|||||||
name: event.name,
|
name: event.name,
|
||||||
description: event.description,
|
description: event.description,
|
||||||
type: event.type,
|
type: event.type,
|
||||||
status: event.status,
|
|
||||||
room: event.room || "",
|
room: event.room || "",
|
||||||
time: event.time || "",
|
time: event.time || "",
|
||||||
maxPlaces: event.maxPlaces || undefined,
|
maxPlaces: event.maxPlaces || undefined,
|
||||||
@@ -163,7 +158,6 @@ export default function EventManagement() {
|
|||||||
name: "",
|
name: "",
|
||||||
description: "",
|
description: "",
|
||||||
type: "SUMMIT",
|
type: "SUMMIT",
|
||||||
status: "UPCOMING",
|
|
||||||
room: "",
|
room: "",
|
||||||
time: "",
|
time: "",
|
||||||
maxPlaces: undefined,
|
maxPlaces: undefined,
|
||||||
@@ -210,7 +204,6 @@ export default function EventManagement() {
|
|||||||
name: "",
|
name: "",
|
||||||
description: "",
|
description: "",
|
||||||
type: "SUMMIT",
|
type: "SUMMIT",
|
||||||
status: "UPCOMING",
|
|
||||||
room: "",
|
room: "",
|
||||||
time: "",
|
time: "",
|
||||||
maxPlaces: undefined,
|
maxPlaces: undefined,
|
||||||
@@ -300,27 +293,6 @@ export default function EventManagement() {
|
|||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label className="block text-sm text-gray-300 mb-1">
|
|
||||||
Statut
|
|
||||||
</label>
|
|
||||||
<select
|
|
||||||
value={formData.status}
|
|
||||||
onChange={(e) =>
|
|
||||||
setFormData({
|
|
||||||
...formData,
|
|
||||||
status: e.target.value as Event["status"],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
className="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm"
|
|
||||||
>
|
|
||||||
{eventStatuses.map((status) => (
|
|
||||||
<option key={status} value={status}>
|
|
||||||
{getStatusLabel(status)}
|
|
||||||
</option>
|
|
||||||
))}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="grid grid-cols-3 gap-4">
|
<div className="grid grid-cols-3 gap-4">
|
||||||
<div>
|
<div>
|
||||||
@@ -411,15 +383,16 @@ export default function EventManagement() {
|
|||||||
{getEventTypeLabel(event.type)}
|
{getEventTypeLabel(event.type)}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
className={`px-2 py-1 text-xs uppercase rounded ${
|
className={`px-2 py-1 text-xs uppercase rounded ${(() => {
|
||||||
event.status === "UPCOMING"
|
const status = calculateEventStatus(event.date);
|
||||||
|
return status === "UPCOMING"
|
||||||
? "bg-green-900/50 border border-green-500/50 text-green-400"
|
? "bg-green-900/50 border border-green-500/50 text-green-400"
|
||||||
: event.status === "LIVE"
|
: status === "LIVE"
|
||||||
? "bg-yellow-900/50 border border-yellow-500/50 text-yellow-400"
|
? "bg-yellow-900/50 border border-yellow-500/50 text-yellow-400"
|
||||||
: "bg-gray-900/50 border border-gray-500/50 text-gray-400"
|
: "bg-gray-900/50 border border-gray-500/50 text-gray-400";
|
||||||
}`}
|
})()}`}
|
||||||
>
|
>
|
||||||
{getStatusLabel(event.status)}
|
{getStatusLabel(calculateEventStatus(event.date))}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-gray-400 text-sm mb-2">
|
<p className="text-gray-400 text-sm mb-2">
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import { useState, useEffect, useMemo, useRef } from "react";
|
import { useState, useEffect, useMemo, useRef } from "react";
|
||||||
import { useSession } from "next-auth/react";
|
import { useSession } from "next-auth/react";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
|
import { calculateEventStatus } from "@/lib/eventStatus";
|
||||||
|
|
||||||
interface Event {
|
interface Event {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -10,7 +11,6 @@ interface Event {
|
|||||||
name: string;
|
name: string;
|
||||||
description: string;
|
description: string;
|
||||||
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
|
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
|
||||||
status: "UPCOMING" | "LIVE" | "PAST";
|
|
||||||
room?: string | null;
|
room?: string | null;
|
||||||
time?: string | null;
|
time?: string | null;
|
||||||
maxPlaces?: number | null;
|
maxPlaces?: number | null;
|
||||||
@@ -56,7 +56,7 @@ const getEventTypeLabel = (type: Event["type"]) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const getStatusBadge = (status: Event["status"]) => {
|
const getStatusBadge = (status: "UPCOMING" | "LIVE" | "PAST") => {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case "UPCOMING":
|
case "UPCOMING":
|
||||||
return (
|
return (
|
||||||
@@ -93,6 +93,9 @@ export default function EventsPageSection({
|
|||||||
const [currentMonth, setCurrentMonth] = useState(new Date());
|
const [currentMonth, setCurrentMonth] = useState(new Date());
|
||||||
const [selectedEvent, setSelectedEvent] = useState<Event | null>(null);
|
const [selectedEvent, setSelectedEvent] = useState<Event | null>(null);
|
||||||
|
|
||||||
|
// Helper function pour obtenir le statut d'un événement
|
||||||
|
const getEventStatus = (event: Event) => calculateEventStatus(event.date);
|
||||||
|
|
||||||
// Déterminer si on a des données initiales valides
|
// Déterminer si on a des données initiales valides
|
||||||
const hasInitialData = useMemo(
|
const hasInitialData = useMemo(
|
||||||
() => Object.keys(initialRegistrations).length > 0,
|
() => Object.keys(initialRegistrations).length > 0,
|
||||||
@@ -103,8 +106,12 @@ export default function EventsPageSection({
|
|||||||
const hasUsedInitialData = useRef(hasInitialData);
|
const hasUsedInitialData = useRef(hasInitialData);
|
||||||
|
|
||||||
// Séparer et trier les événements (du plus récent au plus ancien)
|
// Séparer et trier les événements (du plus récent au plus ancien)
|
||||||
|
// Le statut est calculé automatiquement en fonction de la date
|
||||||
const upcomingEvents = events
|
const upcomingEvents = events
|
||||||
.filter((e) => e.status === "UPCOMING" || e.status === "LIVE")
|
.filter((e) => {
|
||||||
|
const status = calculateEventStatus(e.date);
|
||||||
|
return status === "UPCOMING" || status === "LIVE";
|
||||||
|
})
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
// Trier par date décroissante (du plus récent au plus ancien)
|
// Trier par date décroissante (du plus récent au plus ancien)
|
||||||
const dateA = typeof a.date === "string" ? new Date(a.date) : a.date;
|
const dateA = typeof a.date === "string" ? new Date(a.date) : a.date;
|
||||||
@@ -112,7 +119,7 @@ export default function EventsPageSection({
|
|||||||
return dateB.getTime() - dateA.getTime();
|
return dateB.getTime() - dateA.getTime();
|
||||||
});
|
});
|
||||||
const pastEvents = events
|
const pastEvents = events
|
||||||
.filter((e) => e.status === "PAST")
|
.filter((e) => calculateEventStatus(e.date) === "PAST")
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
// Trier par date décroissante (du plus récent au plus ancien)
|
// Trier par date décroissante (du plus récent au plus ancien)
|
||||||
const dateA = typeof a.date === "string" ? new Date(a.date) : a.date;
|
const dateA = typeof a.date === "string" ? new Date(a.date) : a.date;
|
||||||
@@ -168,7 +175,9 @@ export default function EventsPageSection({
|
|||||||
|
|
||||||
// Charger les inscriptions depuis l'API seulement si on n'a pas de données initiales
|
// Charger les inscriptions depuis l'API seulement si on n'a pas de données initiales
|
||||||
const checkRegistrations = async () => {
|
const checkRegistrations = async () => {
|
||||||
const upcomingOnlyEvents = events.filter((e) => e.status === "UPCOMING");
|
const upcomingOnlyEvents = events.filter(
|
||||||
|
(e) => getEventStatus(e) === "UPCOMING"
|
||||||
|
);
|
||||||
const registrationChecks = upcomingOnlyEvents.map(async (event) => {
|
const registrationChecks = upcomingOnlyEvents.map(async (event) => {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`/api/events/${event.id}/register`);
|
const response = await fetch(`/api/events/${event.id}/register`);
|
||||||
@@ -298,9 +307,11 @@ export default function EventsPageSection({
|
|||||||
const hasEvents = dayEvents.length > 0;
|
const hasEvents = dayEvents.length > 0;
|
||||||
|
|
||||||
// Déterminer la couleur principale selon le type d'événement
|
// Déterminer la couleur principale selon le type d'événement
|
||||||
const hasUpcoming = dayEvents.some((e) => e.status === "UPCOMING");
|
const hasUpcoming = dayEvents.some(
|
||||||
const hasLive = dayEvents.some((e) => e.status === "LIVE");
|
(e) => getEventStatus(e) === "UPCOMING"
|
||||||
const hasPast = dayEvents.some((e) => e.status === "PAST");
|
);
|
||||||
|
const hasLive = dayEvents.some((e) => getEventStatus(e) === "LIVE");
|
||||||
|
const hasPast = dayEvents.some((e) => getEventStatus(e) === "PAST");
|
||||||
|
|
||||||
let eventBorderColor = "";
|
let eventBorderColor = "";
|
||||||
let eventBgColor = "";
|
let eventBgColor = "";
|
||||||
@@ -347,19 +358,22 @@ export default function EventsPageSection({
|
|||||||
</div>
|
</div>
|
||||||
{hasEvents && (
|
{hasEvents && (
|
||||||
<div className="absolute bottom-0.5 left-0 right-0 flex justify-center gap-0.5">
|
<div className="absolute bottom-0.5 left-0 right-0 flex justify-center gap-0.5">
|
||||||
{dayEvents.slice(0, 3).map((event) => (
|
{dayEvents.slice(0, 3).map((event) => {
|
||||||
|
const status = getEventStatus(event);
|
||||||
|
return (
|
||||||
<div
|
<div
|
||||||
key={event.id}
|
key={event.id}
|
||||||
className={`w-1 h-1 rounded-full ${
|
className={`w-1 h-1 rounded-full ${
|
||||||
event.status === "UPCOMING"
|
status === "UPCOMING"
|
||||||
? "bg-green-400"
|
? "bg-green-400"
|
||||||
: event.status === "LIVE"
|
: status === "LIVE"
|
||||||
? "bg-red-400 animate-pulse"
|
? "bg-red-400 animate-pulse"
|
||||||
: "bg-gray-400"
|
: "bg-gray-400"
|
||||||
}`}
|
}`}
|
||||||
title={event.name}
|
title={event.name}
|
||||||
/>
|
/>
|
||||||
))}
|
);
|
||||||
|
})}
|
||||||
{dayEvents.length > 3 && (
|
{dayEvents.length > 3 && (
|
||||||
<div className="w-1 h-1 rounded-full bg-gray-400" />
|
<div className="w-1 h-1 rounded-full bg-gray-400" />
|
||||||
)}
|
)}
|
||||||
@@ -393,7 +407,7 @@ export default function EventsPageSection({
|
|||||||
<div className="p-6">
|
<div className="p-6">
|
||||||
{/* Status Badge */}
|
{/* Status Badge */}
|
||||||
<div className="flex justify-between items-start mb-4">
|
<div className="flex justify-between items-start mb-4">
|
||||||
{getStatusBadge(event.status)}
|
{getStatusBadge(getEventStatus(event))}
|
||||||
<span className="text-pixel-gold text-xs uppercase tracking-widest">
|
<span className="text-pixel-gold text-xs uppercase tracking-widest">
|
||||||
{getEventTypeLabel(event.type)}
|
{getEventTypeLabel(event.type)}
|
||||||
</span>
|
</span>
|
||||||
@@ -457,7 +471,7 @@ export default function EventsPageSection({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Action Button */}
|
{/* Action Button */}
|
||||||
{event.status === "UPCOMING" && (
|
{getEventStatus(event) === "UPCOMING" && (
|
||||||
<>
|
<>
|
||||||
{registrations[event.id] ? (
|
{registrations[event.id] ? (
|
||||||
<button
|
<button
|
||||||
@@ -484,12 +498,12 @@ export default function EventsPageSection({
|
|||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{event.status === "LIVE" && (
|
{getEventStatus(event) === "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">
|
<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
|
Rejoindre en direct
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
{event.status === "PAST" && (
|
{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">
|
<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é
|
Événement terminé
|
||||||
</button>
|
</button>
|
||||||
@@ -662,7 +676,9 @@ export default function EventsPageSection({
|
|||||||
<div className="flex items-center justify-between mb-6">
|
<div className="flex items-center justify-between mb-6">
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<div className="flex items-center gap-3 mb-2">
|
<div className="flex items-center gap-3 mb-2">
|
||||||
{getStatusBadge(selectedEvent.status)}
|
{getStatusBadge(
|
||||||
|
selectedEvent ? getEventStatus(selectedEvent) : "UPCOMING"
|
||||||
|
)}
|
||||||
<span className="px-3 py-1 bg-pixel-gold/20 border border-pixel-gold/50 text-pixel-gold text-xs uppercase rounded">
|
<span className="px-3 py-1 bg-pixel-gold/20 border border-pixel-gold/50 text-pixel-gold text-xs uppercase rounded">
|
||||||
{getEventTypeLabel(selectedEvent.type)}
|
{getEventTypeLabel(selectedEvent.type)}
|
||||||
</span>
|
</span>
|
||||||
@@ -759,7 +775,8 @@ export default function EventsPageSection({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Action Button */}
|
{/* Action Button */}
|
||||||
{selectedEvent.status === "UPCOMING" && (
|
{selectedEvent &&
|
||||||
|
getEventStatus(selectedEvent) === "UPCOMING" && (
|
||||||
<div className="pt-4 border-t border-pixel-gold/20">
|
<div className="pt-4 border-t border-pixel-gold/20">
|
||||||
{registrations[selectedEvent.id] ? (
|
{registrations[selectedEvent.id] ? (
|
||||||
<button
|
<button
|
||||||
@@ -792,14 +809,14 @@ export default function EventsPageSection({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{selectedEvent.status === "LIVE" && (
|
{selectedEvent && getEventStatus(selectedEvent) === "LIVE" && (
|
||||||
<div className="pt-4 border-t border-pixel-gold/20">
|
<div className="pt-4 border-t border-pixel-gold/20">
|
||||||
<button className="w-full px-4 py-3 border border-red-500/50 bg-red-900/20 text-red-400 uppercase text-sm tracking-widest rounded hover:bg-red-900/30 transition animate-pulse">
|
<button className="w-full px-4 py-3 border border-red-500/50 bg-red-900/20 text-red-400 uppercase text-sm tracking-widest rounded hover:bg-red-900/30 transition animate-pulse">
|
||||||
Rejoindre en direct
|
Rejoindre en direct
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{selectedEvent.status === "PAST" && (
|
{selectedEvent && getEventStatus(selectedEvent) === "PAST" && (
|
||||||
<div className="pt-4 border-t border-pixel-gold/20">
|
<div className="pt-4 border-t border-pixel-gold/20">
|
||||||
<button className="w-full px-4 py-3 border border-gray-600/50 bg-gray-900/20 text-gray-500 uppercase text-sm tracking-widest rounded cursor-not-allowed">
|
<button className="w-full px-4 py-3 border border-gray-600/50 bg-gray-900/20 text-gray-500 uppercase text-sm tracking-widest rounded cursor-not-allowed">
|
||||||
Événement terminé
|
Événement terminé
|
||||||
|
|||||||
28
lib/eventStatus.ts
Normal file
28
lib/eventStatus.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* Calcule le statut d'un événement en fonction de sa date
|
||||||
|
* @param eventDate La date de l'événement
|
||||||
|
* @returns Le statut calculé (PAST, LIVE, ou UPCOMING)
|
||||||
|
*/
|
||||||
|
export function calculateEventStatus(
|
||||||
|
eventDate: Date | string
|
||||||
|
): "UPCOMING" | "LIVE" | "PAST" {
|
||||||
|
const date = typeof eventDate === "string" ? new Date(eventDate) : eventDate;
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
// Normaliser les dates à minuit UTC pour comparer uniquement les jours
|
||||||
|
const eventDateOnly = new Date(
|
||||||
|
Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())
|
||||||
|
);
|
||||||
|
|
||||||
|
const todayOnly = new Date(
|
||||||
|
Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())
|
||||||
|
);
|
||||||
|
|
||||||
|
if (eventDateOnly < todayOnly) {
|
||||||
|
return "PAST";
|
||||||
|
} else if (eventDateOnly.getTime() === todayOnly.getTime()) {
|
||||||
|
return "LIVE";
|
||||||
|
} else {
|
||||||
|
return "UPCOMING";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -174,13 +174,6 @@ export type EnumEventTypeFilter<$PrismaModel = never> = {
|
|||||||
not?: Prisma.NestedEnumEventTypeFilter<$PrismaModel> | $Enums.EventType
|
not?: Prisma.NestedEnumEventTypeFilter<$PrismaModel> | $Enums.EventType
|
||||||
}
|
}
|
||||||
|
|
||||||
export type EnumEventStatusFilter<$PrismaModel = never> = {
|
|
||||||
equals?: $Enums.EventStatus | Prisma.EnumEventStatusFieldRefInput<$PrismaModel>
|
|
||||||
in?: $Enums.EventStatus[]
|
|
||||||
notIn?: $Enums.EventStatus[]
|
|
||||||
not?: Prisma.NestedEnumEventStatusFilter<$PrismaModel> | $Enums.EventStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
export type IntNullableFilter<$PrismaModel = never> = {
|
export type IntNullableFilter<$PrismaModel = never> = {
|
||||||
equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null
|
equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null
|
||||||
in?: number[] | null
|
in?: number[] | null
|
||||||
@@ -202,16 +195,6 @@ export type EnumEventTypeWithAggregatesFilter<$PrismaModel = never> = {
|
|||||||
_max?: Prisma.NestedEnumEventTypeFilter<$PrismaModel>
|
_max?: Prisma.NestedEnumEventTypeFilter<$PrismaModel>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type EnumEventStatusWithAggregatesFilter<$PrismaModel = never> = {
|
|
||||||
equals?: $Enums.EventStatus | Prisma.EnumEventStatusFieldRefInput<$PrismaModel>
|
|
||||||
in?: $Enums.EventStatus[]
|
|
||||||
notIn?: $Enums.EventStatus[]
|
|
||||||
not?: Prisma.NestedEnumEventStatusWithAggregatesFilter<$PrismaModel> | $Enums.EventStatus
|
|
||||||
_count?: Prisma.NestedIntFilter<$PrismaModel>
|
|
||||||
_min?: Prisma.NestedEnumEventStatusFilter<$PrismaModel>
|
|
||||||
_max?: Prisma.NestedEnumEventStatusFilter<$PrismaModel>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type IntNullableWithAggregatesFilter<$PrismaModel = never> = {
|
export type IntNullableWithAggregatesFilter<$PrismaModel = never> = {
|
||||||
equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null
|
equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null
|
||||||
in?: number[] | null
|
in?: number[] | null
|
||||||
@@ -405,13 +388,6 @@ export type NestedEnumEventTypeFilter<$PrismaModel = never> = {
|
|||||||
not?: Prisma.NestedEnumEventTypeFilter<$PrismaModel> | $Enums.EventType
|
not?: Prisma.NestedEnumEventTypeFilter<$PrismaModel> | $Enums.EventType
|
||||||
}
|
}
|
||||||
|
|
||||||
export type NestedEnumEventStatusFilter<$PrismaModel = never> = {
|
|
||||||
equals?: $Enums.EventStatus | Prisma.EnumEventStatusFieldRefInput<$PrismaModel>
|
|
||||||
in?: $Enums.EventStatus[]
|
|
||||||
notIn?: $Enums.EventStatus[]
|
|
||||||
not?: Prisma.NestedEnumEventStatusFilter<$PrismaModel> | $Enums.EventStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
export type NestedEnumEventTypeWithAggregatesFilter<$PrismaModel = never> = {
|
export type NestedEnumEventTypeWithAggregatesFilter<$PrismaModel = never> = {
|
||||||
equals?: $Enums.EventType | Prisma.EnumEventTypeFieldRefInput<$PrismaModel>
|
equals?: $Enums.EventType | Prisma.EnumEventTypeFieldRefInput<$PrismaModel>
|
||||||
in?: $Enums.EventType[]
|
in?: $Enums.EventType[]
|
||||||
@@ -422,16 +398,6 @@ export type NestedEnumEventTypeWithAggregatesFilter<$PrismaModel = never> = {
|
|||||||
_max?: Prisma.NestedEnumEventTypeFilter<$PrismaModel>
|
_max?: Prisma.NestedEnumEventTypeFilter<$PrismaModel>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type NestedEnumEventStatusWithAggregatesFilter<$PrismaModel = never> = {
|
|
||||||
equals?: $Enums.EventStatus | Prisma.EnumEventStatusFieldRefInput<$PrismaModel>
|
|
||||||
in?: $Enums.EventStatus[]
|
|
||||||
notIn?: $Enums.EventStatus[]
|
|
||||||
not?: Prisma.NestedEnumEventStatusWithAggregatesFilter<$PrismaModel> | $Enums.EventStatus
|
|
||||||
_count?: Prisma.NestedIntFilter<$PrismaModel>
|
|
||||||
_min?: Prisma.NestedEnumEventStatusFilter<$PrismaModel>
|
|
||||||
_max?: Prisma.NestedEnumEventStatusFilter<$PrismaModel>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = {
|
export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = {
|
||||||
equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null
|
equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null
|
||||||
in?: number[] | null
|
in?: number[] | null
|
||||||
|
|||||||
@@ -28,15 +28,6 @@ export const EventType = {
|
|||||||
export type EventType = (typeof EventType)[keyof typeof EventType]
|
export type EventType = (typeof EventType)[keyof typeof EventType]
|
||||||
|
|
||||||
|
|
||||||
export const EventStatus = {
|
|
||||||
UPCOMING: 'UPCOMING',
|
|
||||||
LIVE: 'LIVE',
|
|
||||||
PAST: 'PAST'
|
|
||||||
} as const
|
|
||||||
|
|
||||||
export type EventStatus = (typeof EventStatus)[keyof typeof EventStatus]
|
|
||||||
|
|
||||||
|
|
||||||
export const CharacterClass = {
|
export const CharacterClass = {
|
||||||
WARRIOR: 'WARRIOR',
|
WARRIOR: 'WARRIOR',
|
||||||
MAGE: 'MAGE',
|
MAGE: 'MAGE',
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
|
|||||||
"clientVersion": "7.1.0",
|
"clientVersion": "7.1.0",
|
||||||
"engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba",
|
"engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba",
|
||||||
"activeProvider": "sqlite",
|
"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 CODE_KATA\n}\n\nenum EventStatus {\n UPCOMING\n LIVE\n PAST\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 status EventStatus\n room String?\n time String?\n maxPlaces Int?\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",
|
"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 CODE_KATA\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",
|
||||||
"runtimeDataModel": {
|
"runtimeDataModel": {
|
||||||
"models": {},
|
"models": {},
|
||||||
"enums": {},
|
"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\":\"status\",\"kind\":\"enum\",\"type\":\"EventStatus\"},{\"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\"}],\"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\":{}}")
|
||||||
|
|
||||||
async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
|
async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
|
||||||
const { Buffer } = await import('node:buffer')
|
const { Buffer } = await import('node:buffer')
|
||||||
|
|||||||
@@ -856,7 +856,6 @@ export const EventScalarFieldEnum = {
|
|||||||
name: 'name',
|
name: 'name',
|
||||||
description: 'description',
|
description: 'description',
|
||||||
type: 'type',
|
type: 'type',
|
||||||
status: 'status',
|
|
||||||
room: 'room',
|
room: 'room',
|
||||||
time: 'time',
|
time: 'time',
|
||||||
maxPlaces: 'maxPlaces',
|
maxPlaces: 'maxPlaces',
|
||||||
@@ -953,13 +952,6 @@ export type EnumEventTypeFieldRefInput<$PrismaModel> = FieldRefInputType<$Prisma
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reference to a field of type 'EventStatus'
|
|
||||||
*/
|
|
||||||
export type EnumEventStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'EventStatus'>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reference to a field of type 'Float'
|
* Reference to a field of type 'Float'
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -113,7 +113,6 @@ export const EventScalarFieldEnum = {
|
|||||||
name: 'name',
|
name: 'name',
|
||||||
description: 'description',
|
description: 'description',
|
||||||
type: 'type',
|
type: 'type',
|
||||||
status: 'status',
|
|
||||||
room: 'room',
|
room: 'room',
|
||||||
time: 'time',
|
time: 'time',
|
||||||
maxPlaces: 'maxPlaces',
|
maxPlaces: 'maxPlaces',
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ export type EventMinAggregateOutputType = {
|
|||||||
name: string | null
|
name: string | null
|
||||||
description: string | null
|
description: string | null
|
||||||
type: $Enums.EventType | null
|
type: $Enums.EventType | null
|
||||||
status: $Enums.EventStatus | null
|
|
||||||
room: string | null
|
room: string | null
|
||||||
time: string | null
|
time: string | null
|
||||||
maxPlaces: number | null
|
maxPlaces: number | null
|
||||||
@@ -54,7 +53,6 @@ export type EventMaxAggregateOutputType = {
|
|||||||
name: string | null
|
name: string | null
|
||||||
description: string | null
|
description: string | null
|
||||||
type: $Enums.EventType | null
|
type: $Enums.EventType | null
|
||||||
status: $Enums.EventStatus | null
|
|
||||||
room: string | null
|
room: string | null
|
||||||
time: string | null
|
time: string | null
|
||||||
maxPlaces: number | null
|
maxPlaces: number | null
|
||||||
@@ -68,7 +66,6 @@ export type EventCountAggregateOutputType = {
|
|||||||
name: number
|
name: number
|
||||||
description: number
|
description: number
|
||||||
type: number
|
type: number
|
||||||
status: number
|
|
||||||
room: number
|
room: number
|
||||||
time: number
|
time: number
|
||||||
maxPlaces: number
|
maxPlaces: number
|
||||||
@@ -92,7 +89,6 @@ export type EventMinAggregateInputType = {
|
|||||||
name?: true
|
name?: true
|
||||||
description?: true
|
description?: true
|
||||||
type?: true
|
type?: true
|
||||||
status?: true
|
|
||||||
room?: true
|
room?: true
|
||||||
time?: true
|
time?: true
|
||||||
maxPlaces?: true
|
maxPlaces?: true
|
||||||
@@ -106,7 +102,6 @@ export type EventMaxAggregateInputType = {
|
|||||||
name?: true
|
name?: true
|
||||||
description?: true
|
description?: true
|
||||||
type?: true
|
type?: true
|
||||||
status?: true
|
|
||||||
room?: true
|
room?: true
|
||||||
time?: true
|
time?: true
|
||||||
maxPlaces?: true
|
maxPlaces?: true
|
||||||
@@ -120,7 +115,6 @@ export type EventCountAggregateInputType = {
|
|||||||
name?: true
|
name?: true
|
||||||
description?: true
|
description?: true
|
||||||
type?: true
|
type?: true
|
||||||
status?: true
|
|
||||||
room?: true
|
room?: true
|
||||||
time?: true
|
time?: true
|
||||||
maxPlaces?: true
|
maxPlaces?: true
|
||||||
@@ -221,7 +215,6 @@ export type EventGroupByOutputType = {
|
|||||||
name: string
|
name: string
|
||||||
description: string
|
description: string
|
||||||
type: $Enums.EventType
|
type: $Enums.EventType
|
||||||
status: $Enums.EventStatus
|
|
||||||
room: string | null
|
room: string | null
|
||||||
time: string | null
|
time: string | null
|
||||||
maxPlaces: number | null
|
maxPlaces: number | null
|
||||||
@@ -258,7 +251,6 @@ export type EventWhereInput = {
|
|||||||
name?: Prisma.StringFilter<"Event"> | string
|
name?: Prisma.StringFilter<"Event"> | string
|
||||||
description?: Prisma.StringFilter<"Event"> | string
|
description?: Prisma.StringFilter<"Event"> | string
|
||||||
type?: Prisma.EnumEventTypeFilter<"Event"> | $Enums.EventType
|
type?: Prisma.EnumEventTypeFilter<"Event"> | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusFilter<"Event"> | $Enums.EventStatus
|
|
||||||
room?: Prisma.StringNullableFilter<"Event"> | string | null
|
room?: Prisma.StringNullableFilter<"Event"> | string | null
|
||||||
time?: Prisma.StringNullableFilter<"Event"> | string | null
|
time?: Prisma.StringNullableFilter<"Event"> | string | null
|
||||||
maxPlaces?: Prisma.IntNullableFilter<"Event"> | number | null
|
maxPlaces?: Prisma.IntNullableFilter<"Event"> | number | null
|
||||||
@@ -273,7 +265,6 @@ export type EventOrderByWithRelationInput = {
|
|||||||
name?: Prisma.SortOrder
|
name?: Prisma.SortOrder
|
||||||
description?: Prisma.SortOrder
|
description?: Prisma.SortOrder
|
||||||
type?: Prisma.SortOrder
|
type?: Prisma.SortOrder
|
||||||
status?: Prisma.SortOrder
|
|
||||||
room?: Prisma.SortOrderInput | Prisma.SortOrder
|
room?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
time?: Prisma.SortOrderInput | Prisma.SortOrder
|
time?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
maxPlaces?: Prisma.SortOrderInput | Prisma.SortOrder
|
maxPlaces?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
@@ -291,7 +282,6 @@ export type EventWhereUniqueInput = Prisma.AtLeast<{
|
|||||||
name?: Prisma.StringFilter<"Event"> | string
|
name?: Prisma.StringFilter<"Event"> | string
|
||||||
description?: Prisma.StringFilter<"Event"> | string
|
description?: Prisma.StringFilter<"Event"> | string
|
||||||
type?: Prisma.EnumEventTypeFilter<"Event"> | $Enums.EventType
|
type?: Prisma.EnumEventTypeFilter<"Event"> | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusFilter<"Event"> | $Enums.EventStatus
|
|
||||||
room?: Prisma.StringNullableFilter<"Event"> | string | null
|
room?: Prisma.StringNullableFilter<"Event"> | string | null
|
||||||
time?: Prisma.StringNullableFilter<"Event"> | string | null
|
time?: Prisma.StringNullableFilter<"Event"> | string | null
|
||||||
maxPlaces?: Prisma.IntNullableFilter<"Event"> | number | null
|
maxPlaces?: Prisma.IntNullableFilter<"Event"> | number | null
|
||||||
@@ -306,7 +296,6 @@ export type EventOrderByWithAggregationInput = {
|
|||||||
name?: Prisma.SortOrder
|
name?: Prisma.SortOrder
|
||||||
description?: Prisma.SortOrder
|
description?: Prisma.SortOrder
|
||||||
type?: Prisma.SortOrder
|
type?: Prisma.SortOrder
|
||||||
status?: Prisma.SortOrder
|
|
||||||
room?: Prisma.SortOrderInput | Prisma.SortOrder
|
room?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
time?: Prisma.SortOrderInput | Prisma.SortOrder
|
time?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
maxPlaces?: Prisma.SortOrderInput | Prisma.SortOrder
|
maxPlaces?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
@@ -328,7 +317,6 @@ export type EventScalarWhereWithAggregatesInput = {
|
|||||||
name?: Prisma.StringWithAggregatesFilter<"Event"> | string
|
name?: Prisma.StringWithAggregatesFilter<"Event"> | string
|
||||||
description?: Prisma.StringWithAggregatesFilter<"Event"> | string
|
description?: Prisma.StringWithAggregatesFilter<"Event"> | string
|
||||||
type?: Prisma.EnumEventTypeWithAggregatesFilter<"Event"> | $Enums.EventType
|
type?: Prisma.EnumEventTypeWithAggregatesFilter<"Event"> | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusWithAggregatesFilter<"Event"> | $Enums.EventStatus
|
|
||||||
room?: Prisma.StringNullableWithAggregatesFilter<"Event"> | string | null
|
room?: Prisma.StringNullableWithAggregatesFilter<"Event"> | string | null
|
||||||
time?: Prisma.StringNullableWithAggregatesFilter<"Event"> | string | null
|
time?: Prisma.StringNullableWithAggregatesFilter<"Event"> | string | null
|
||||||
maxPlaces?: Prisma.IntNullableWithAggregatesFilter<"Event"> | number | null
|
maxPlaces?: Prisma.IntNullableWithAggregatesFilter<"Event"> | number | null
|
||||||
@@ -342,7 +330,6 @@ export type EventCreateInput = {
|
|||||||
name: string
|
name: string
|
||||||
description: string
|
description: string
|
||||||
type: $Enums.EventType
|
type: $Enums.EventType
|
||||||
status: $Enums.EventStatus
|
|
||||||
room?: string | null
|
room?: string | null
|
||||||
time?: string | null
|
time?: string | null
|
||||||
maxPlaces?: number | null
|
maxPlaces?: number | null
|
||||||
@@ -357,7 +344,6 @@ export type EventUncheckedCreateInput = {
|
|||||||
name: string
|
name: string
|
||||||
description: string
|
description: string
|
||||||
type: $Enums.EventType
|
type: $Enums.EventType
|
||||||
status: $Enums.EventStatus
|
|
||||||
room?: string | null
|
room?: string | null
|
||||||
time?: string | null
|
time?: string | null
|
||||||
maxPlaces?: number | null
|
maxPlaces?: number | null
|
||||||
@@ -372,7 +358,6 @@ export type EventUpdateInput = {
|
|||||||
name?: Prisma.StringFieldUpdateOperationsInput | string
|
name?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
description?: Prisma.StringFieldUpdateOperationsInput | string
|
description?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
|
|
||||||
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||||
@@ -387,7 +372,6 @@ export type EventUncheckedUpdateInput = {
|
|||||||
name?: Prisma.StringFieldUpdateOperationsInput | string
|
name?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
description?: Prisma.StringFieldUpdateOperationsInput | string
|
description?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
|
|
||||||
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||||
@@ -402,7 +386,6 @@ export type EventCreateManyInput = {
|
|||||||
name: string
|
name: string
|
||||||
description: string
|
description: string
|
||||||
type: $Enums.EventType
|
type: $Enums.EventType
|
||||||
status: $Enums.EventStatus
|
|
||||||
room?: string | null
|
room?: string | null
|
||||||
time?: string | null
|
time?: string | null
|
||||||
maxPlaces?: number | null
|
maxPlaces?: number | null
|
||||||
@@ -416,7 +399,6 @@ export type EventUpdateManyMutationInput = {
|
|||||||
name?: Prisma.StringFieldUpdateOperationsInput | string
|
name?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
description?: Prisma.StringFieldUpdateOperationsInput | string
|
description?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
|
|
||||||
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||||
@@ -430,7 +412,6 @@ export type EventUncheckedUpdateManyInput = {
|
|||||||
name?: Prisma.StringFieldUpdateOperationsInput | string
|
name?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
description?: Prisma.StringFieldUpdateOperationsInput | string
|
description?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
|
|
||||||
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||||
@@ -444,7 +425,6 @@ export type EventCountOrderByAggregateInput = {
|
|||||||
name?: Prisma.SortOrder
|
name?: Prisma.SortOrder
|
||||||
description?: Prisma.SortOrder
|
description?: Prisma.SortOrder
|
||||||
type?: Prisma.SortOrder
|
type?: Prisma.SortOrder
|
||||||
status?: Prisma.SortOrder
|
|
||||||
room?: Prisma.SortOrder
|
room?: Prisma.SortOrder
|
||||||
time?: Prisma.SortOrder
|
time?: Prisma.SortOrder
|
||||||
maxPlaces?: Prisma.SortOrder
|
maxPlaces?: Prisma.SortOrder
|
||||||
@@ -462,7 +442,6 @@ export type EventMaxOrderByAggregateInput = {
|
|||||||
name?: Prisma.SortOrder
|
name?: Prisma.SortOrder
|
||||||
description?: Prisma.SortOrder
|
description?: Prisma.SortOrder
|
||||||
type?: Prisma.SortOrder
|
type?: Prisma.SortOrder
|
||||||
status?: Prisma.SortOrder
|
|
||||||
room?: Prisma.SortOrder
|
room?: Prisma.SortOrder
|
||||||
time?: Prisma.SortOrder
|
time?: Prisma.SortOrder
|
||||||
maxPlaces?: Prisma.SortOrder
|
maxPlaces?: Prisma.SortOrder
|
||||||
@@ -476,7 +455,6 @@ export type EventMinOrderByAggregateInput = {
|
|||||||
name?: Prisma.SortOrder
|
name?: Prisma.SortOrder
|
||||||
description?: Prisma.SortOrder
|
description?: Prisma.SortOrder
|
||||||
type?: Prisma.SortOrder
|
type?: Prisma.SortOrder
|
||||||
status?: Prisma.SortOrder
|
|
||||||
room?: Prisma.SortOrder
|
room?: Prisma.SortOrder
|
||||||
time?: Prisma.SortOrder
|
time?: Prisma.SortOrder
|
||||||
maxPlaces?: Prisma.SortOrder
|
maxPlaces?: Prisma.SortOrder
|
||||||
@@ -497,10 +475,6 @@ export type EnumEventTypeFieldUpdateOperationsInput = {
|
|||||||
set?: $Enums.EventType
|
set?: $Enums.EventType
|
||||||
}
|
}
|
||||||
|
|
||||||
export type EnumEventStatusFieldUpdateOperationsInput = {
|
|
||||||
set?: $Enums.EventStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
export type NullableIntFieldUpdateOperationsInput = {
|
export type NullableIntFieldUpdateOperationsInput = {
|
||||||
set?: number | null
|
set?: number | null
|
||||||
increment?: number
|
increment?: number
|
||||||
@@ -529,7 +503,6 @@ export type EventCreateWithoutRegistrationsInput = {
|
|||||||
name: string
|
name: string
|
||||||
description: string
|
description: string
|
||||||
type: $Enums.EventType
|
type: $Enums.EventType
|
||||||
status: $Enums.EventStatus
|
|
||||||
room?: string | null
|
room?: string | null
|
||||||
time?: string | null
|
time?: string | null
|
||||||
maxPlaces?: number | null
|
maxPlaces?: number | null
|
||||||
@@ -543,7 +516,6 @@ export type EventUncheckedCreateWithoutRegistrationsInput = {
|
|||||||
name: string
|
name: string
|
||||||
description: string
|
description: string
|
||||||
type: $Enums.EventType
|
type: $Enums.EventType
|
||||||
status: $Enums.EventStatus
|
|
||||||
room?: string | null
|
room?: string | null
|
||||||
time?: string | null
|
time?: string | null
|
||||||
maxPlaces?: number | null
|
maxPlaces?: number | null
|
||||||
@@ -573,7 +545,6 @@ export type EventUpdateWithoutRegistrationsInput = {
|
|||||||
name?: Prisma.StringFieldUpdateOperationsInput | string
|
name?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
description?: Prisma.StringFieldUpdateOperationsInput | string
|
description?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
|
|
||||||
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||||
@@ -587,7 +558,6 @@ export type EventUncheckedUpdateWithoutRegistrationsInput = {
|
|||||||
name?: Prisma.StringFieldUpdateOperationsInput | string
|
name?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
description?: Prisma.StringFieldUpdateOperationsInput | string
|
description?: Prisma.StringFieldUpdateOperationsInput | string
|
||||||
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType
|
||||||
status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus
|
|
||||||
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
room?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
time?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
maxPlaces?: Prisma.NullableIntFieldUpdateOperationsInput | number | null
|
||||||
@@ -632,7 +602,6 @@ export type EventSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs =
|
|||||||
name?: boolean
|
name?: boolean
|
||||||
description?: boolean
|
description?: boolean
|
||||||
type?: boolean
|
type?: boolean
|
||||||
status?: boolean
|
|
||||||
room?: boolean
|
room?: boolean
|
||||||
time?: boolean
|
time?: boolean
|
||||||
maxPlaces?: boolean
|
maxPlaces?: boolean
|
||||||
@@ -648,7 +617,6 @@ export type EventSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensi
|
|||||||
name?: boolean
|
name?: boolean
|
||||||
description?: boolean
|
description?: boolean
|
||||||
type?: boolean
|
type?: boolean
|
||||||
status?: boolean
|
|
||||||
room?: boolean
|
room?: boolean
|
||||||
time?: boolean
|
time?: boolean
|
||||||
maxPlaces?: boolean
|
maxPlaces?: boolean
|
||||||
@@ -662,7 +630,6 @@ export type EventSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensi
|
|||||||
name?: boolean
|
name?: boolean
|
||||||
description?: boolean
|
description?: boolean
|
||||||
type?: boolean
|
type?: boolean
|
||||||
status?: boolean
|
|
||||||
room?: boolean
|
room?: boolean
|
||||||
time?: boolean
|
time?: boolean
|
||||||
maxPlaces?: boolean
|
maxPlaces?: boolean
|
||||||
@@ -676,7 +643,6 @@ export type EventSelectScalar = {
|
|||||||
name?: boolean
|
name?: boolean
|
||||||
description?: boolean
|
description?: boolean
|
||||||
type?: boolean
|
type?: boolean
|
||||||
status?: boolean
|
|
||||||
room?: boolean
|
room?: boolean
|
||||||
time?: boolean
|
time?: boolean
|
||||||
maxPlaces?: boolean
|
maxPlaces?: boolean
|
||||||
@@ -684,7 +650,7 @@ export type EventSelectScalar = {
|
|||||||
updatedAt?: boolean
|
updatedAt?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export type EventOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "date" | "name" | "description" | "type" | "status" | "room" | "time" | "maxPlaces" | "createdAt" | "updatedAt", ExtArgs["result"]["event"]>
|
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> = {
|
export type EventInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||||
registrations?: boolean | Prisma.Event$registrationsArgs<ExtArgs>
|
registrations?: boolean | Prisma.Event$registrationsArgs<ExtArgs>
|
||||||
_count?: boolean | Prisma.EventCountOutputTypeDefaultArgs<ExtArgs>
|
_count?: boolean | Prisma.EventCountOutputTypeDefaultArgs<ExtArgs>
|
||||||
@@ -703,7 +669,6 @@ export type $EventPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs
|
|||||||
name: string
|
name: string
|
||||||
description: string
|
description: string
|
||||||
type: $Enums.EventType
|
type: $Enums.EventType
|
||||||
status: $Enums.EventStatus
|
|
||||||
room: string | null
|
room: string | null
|
||||||
time: string | null
|
time: string | null
|
||||||
maxPlaces: number | null
|
maxPlaces: number | null
|
||||||
@@ -1138,7 +1103,6 @@ export interface EventFieldRefs {
|
|||||||
readonly name: Prisma.FieldRef<"Event", 'String'>
|
readonly name: Prisma.FieldRef<"Event", 'String'>
|
||||||
readonly description: Prisma.FieldRef<"Event", 'String'>
|
readonly description: Prisma.FieldRef<"Event", 'String'>
|
||||||
readonly type: Prisma.FieldRef<"Event", 'EventType'>
|
readonly type: Prisma.FieldRef<"Event", 'EventType'>
|
||||||
readonly status: Prisma.FieldRef<"Event", 'EventStatus'>
|
|
||||||
readonly room: Prisma.FieldRef<"Event", 'String'>
|
readonly room: Prisma.FieldRef<"Event", 'String'>
|
||||||
readonly time: Prisma.FieldRef<"Event", 'String'>
|
readonly time: Prisma.FieldRef<"Event", 'String'>
|
||||||
readonly maxPlaces: Prisma.FieldRef<"Event", 'Int'>
|
readonly maxPlaces: Prisma.FieldRef<"Event", 'Int'>
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
-- RedefineTables
|
||||||
|
PRAGMA foreign_keys=OFF;
|
||||||
|
CREATE TABLE "_Event_new" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"date" DATETIME NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"description" TEXT NOT NULL,
|
||||||
|
"type" TEXT NOT NULL,
|
||||||
|
"room" TEXT,
|
||||||
|
"time" TEXT,
|
||||||
|
"maxPlaces" INTEGER,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" DATETIME NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO "_Event_new" ("id", "date", "name", "description", "type", "room", "time", "maxPlaces", "createdAt", "updatedAt") SELECT "id", "date", "name", "description", "type", "room", "time", "maxPlaces", "createdAt", "updatedAt" FROM "Event";
|
||||||
|
DROP TABLE "Event";
|
||||||
|
ALTER TABLE "_Event_new" RENAME TO "Event";
|
||||||
|
CREATE INDEX "Event_date_idx" ON "Event"("date");
|
||||||
|
PRAGMA foreign_keys=ON;
|
||||||
|
|
||||||
@@ -23,12 +23,6 @@ enum EventType {
|
|||||||
CODE_KATA
|
CODE_KATA
|
||||||
}
|
}
|
||||||
|
|
||||||
enum EventStatus {
|
|
||||||
UPCOMING
|
|
||||||
LIVE
|
|
||||||
PAST
|
|
||||||
}
|
|
||||||
|
|
||||||
enum CharacterClass {
|
enum CharacterClass {
|
||||||
WARRIOR
|
WARRIOR
|
||||||
MAGE
|
MAGE
|
||||||
@@ -89,7 +83,6 @@ model Event {
|
|||||||
name String
|
name String
|
||||||
description String
|
description String
|
||||||
type EventType
|
type EventType
|
||||||
status EventStatus
|
|
||||||
room String?
|
room String?
|
||||||
time String?
|
time String?
|
||||||
maxPlaces Int?
|
maxPlaces Int?
|
||||||
@@ -97,7 +90,6 @@ model Event {
|
|||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
registrations EventRegistration[]
|
registrations EventRegistration[]
|
||||||
|
|
||||||
@@index([status])
|
|
||||||
@@index([date])
|
@@index([date])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
PrismaClient,
|
PrismaClient,
|
||||||
EventType,
|
EventType,
|
||||||
EventStatus,
|
|
||||||
CharacterClass,
|
CharacterClass,
|
||||||
} from "@/prisma/generated/prisma/client";
|
} from "@/prisma/generated/prisma/client";
|
||||||
import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
|
import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
|
||||||
@@ -147,61 +146,12 @@ async function main() {
|
|||||||
|
|
||||||
// Créer des événements (vérifier s'ils existent déjà)
|
// Créer des événements (vérifier s'ils existent déjà)
|
||||||
const eventData = [
|
const eventData = [
|
||||||
{
|
|
||||||
date: new Date("2025-11-18"),
|
|
||||||
name: "Sommet de l'Innovation Tech",
|
|
||||||
description:
|
|
||||||
"Rejoignez les leaders de l'industrie et les innovateurs pour une journée de discussions sur les technologies de pointe, les percées de l'IA et des opportunités de networking.",
|
|
||||||
type: EventType.SUMMIT,
|
|
||||||
status: EventStatus.PAST,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
date: new Date("2025-12-03"),
|
|
||||||
name: "Lancement de la Révolution IA",
|
|
||||||
description:
|
|
||||||
"Assistez au lancement de systèmes d'IA révolutionnaires qui vont remodeler le paysage du gaming. Aperçus exclusifs et opportunités d'accès anticipé.",
|
|
||||||
type: EventType.LAUNCH,
|
|
||||||
status: EventStatus.PAST,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
date: new Date("2025-12-22"),
|
|
||||||
name: "Festival du Code d'Hiver",
|
|
||||||
description:
|
|
||||||
"Une célébration de l'excellence en programmation avec des hackathons, des défis de codage et des prix. Montrez vos compétences et rivalisez avec les meilleurs développeurs.",
|
|
||||||
type: EventType.FESTIVAL,
|
|
||||||
status: EventStatus.PAST,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
date: new Date("2025-01-15"),
|
|
||||||
name: "Expo Informatique Quantique",
|
|
||||||
description:
|
|
||||||
"Explorez l'avenir de l'informatique quantique dans le gaming. Démonstrations interactives, conférences d'experts et ateliers pratiques pour tous les niveaux.",
|
|
||||||
type: EventType.SUMMIT,
|
|
||||||
status: EventStatus.UPCOMING,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
date: new Date("2025-02-08"),
|
|
||||||
name: "Championnat Cyber Arena",
|
|
||||||
description:
|
|
||||||
"L'événement de gaming compétitif ultime. Compétissez pour la gloire, des récompenses exclusives et le titre de Champion Cyber Arena. Inscriptions ouvertes.",
|
|
||||||
type: EventType.COMPETITION,
|
|
||||||
status: EventStatus.UPCOMING,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
date: new Date("2025-03-12"),
|
|
||||||
name: "Gala Tech du Printemps",
|
|
||||||
description:
|
|
||||||
"Une soirée élégante célébrant les réalisations technologiques. Cérémonie de remise de prix, networking et annonces exclusives des plus grandes entreprises tech.",
|
|
||||||
type: EventType.FESTIVAL,
|
|
||||||
status: EventStatus.UPCOMING,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
date: new Date("2025-12-15"),
|
date: new Date("2025-12-15"),
|
||||||
name: "Builder pattern : construction et refactoring",
|
name: "Builder pattern : construction et refactoring",
|
||||||
description:
|
description:
|
||||||
"Lors de cet atelier, nous utiliserons le design pattern Builder pour structurer pas à pas la création d'objets complexes… sans transformer notre code en film digne de Red Is Dead.\n\nVous découvrirez comment ce pattern permet de découpler proprement la logique de construction, d'améliorer la lisibilité et de faciliter l'évolution du code — notamment lors de phases de refactoring où les responsabilités se mélangent plus vite que la foule au Palais des Festivals.\n\nL'objectif : poser les fondations pour introduire un vrai modèle, sans rien casser du comportement existant.\n\nQue vous souhaitiez renforcer vos compétences en conception, préparer votre prochain refactoring, ou simplement coder avec plus de style que Serge Karamazov dansant la carioca, venez construire avec nous.",
|
"Lors de cet atelier, nous utiliserons le design pattern Builder pour structurer pas à pas la création d'objets complexes… sans transformer notre code en film digne de Red Is Dead.\n\nVous découvrirez comment ce pattern permet de découpler proprement la logique de construction, d'améliorer la lisibilité et de faciliter l'évolution du code — notamment lors de phases de refactoring où les responsabilités se mélangent plus vite que la foule au Palais des Festivals.\n\nL'objectif : poser les fondations pour introduire un vrai modèle, sans rien casser du comportement existant.\n\nQue vous souhaitiez renforcer vos compétences en conception, préparer votre prochain refactoring, ou simplement coder avec plus de style que Serge Karamazov dansant la carioca, venez construire avec nous.",
|
||||||
type: EventType.CODE_KATA,
|
type: EventType.CODE_KATA,
|
||||||
status: EventStatus.UPCOMING,
|
|
||||||
room: "Nautilus",
|
room: "Nautilus",
|
||||||
time: "11h-12h",
|
time: "11h-12h",
|
||||||
maxPlaces: 25,
|
maxPlaces: 25,
|
||||||
@@ -212,7 +162,6 @@ async function main() {
|
|||||||
description:
|
description:
|
||||||
"Nous manipulons tous, au quotidien, des données que nous devons combiner : additionner des montants, calculer des moyennes, regrouper des résultats, agréger des indicateurs. Pourtant, derrière ces opérations, se cachent souvent des règles implicites, des exceptions, amenant une complexité qui rend le code difficile à comprendre et à faire évoluer.\n\nLes monoids permettent d'aborder ces problématiques avec une grille de lecture claire et structurante. Ils reposent sur une idée simple : pour agréger correctement des valeurs, il faut savoir comment elles se combinent et définir ce qui représente une valeur neutre.\n\nCet atelier propose une approche progressive pour comprendre comment ce concept peut transformer la manière de modéliser et de concevoir des comportements métier. Nous découvrirons comment les monoids aident à réduire la charge cognitive et à rendre le code plus cohérent avec l'intention métier.",
|
"Nous manipulons tous, au quotidien, des données que nous devons combiner : additionner des montants, calculer des moyennes, regrouper des résultats, agréger des indicateurs. Pourtant, derrière ces opérations, se cachent souvent des règles implicites, des exceptions, amenant une complexité qui rend le code difficile à comprendre et à faire évoluer.\n\nLes monoids permettent d'aborder ces problématiques avec une grille de lecture claire et structurante. Ils reposent sur une idée simple : pour agréger correctement des valeurs, il faut savoir comment elles se combinent et définir ce qui représente une valeur neutre.\n\nCet atelier propose une approche progressive pour comprendre comment ce concept peut transformer la manière de modéliser et de concevoir des comportements métier. Nous découvrirons comment les monoids aident à réduire la charge cognitive et à rendre le code plus cohérent avec l'intention métier.",
|
||||||
type: EventType.CODE_KATA,
|
type: EventType.CODE_KATA,
|
||||||
status: EventStatus.UPCOMING,
|
|
||||||
room: "Nautilus",
|
room: "Nautilus",
|
||||||
time: "11h-12h",
|
time: "11h-12h",
|
||||||
maxPlaces: 25,
|
maxPlaces: 25,
|
||||||
@@ -223,7 +172,6 @@ async function main() {
|
|||||||
description:
|
description:
|
||||||
"Rech. proj. pr proj. priv. self-dem.brt. poss. S'adr.à l'hôt. MART.\n\nBien sûr, S'adr.à l'hôt. MART. et plus si affinités, c'est plus humain… mais pas forcément plus compréhensible : on a beau lire et relire le contenu de la méthode, on est quasiment sûr que son nom, il bluffe !\n\nFaut-il pour autant laisser de mauvais noms tromper 1000 fois 1000 personnes ?\n\nDans cette nouvelle session, nous appliquerons Naming as a Process, une méthode de refactoring progressive centrée sur le nommage.\n\nObjectif : faire émerger la logique métier à travers des noms clairs, précis et alignés avec l'intention réelle du code. Au fil des étapes, nous transformerons un bloc obscur en fonctions lisibles, maintenables et prêtes à danser la carioca.\n\nPrenez un chewing-gum, ouvrez votre IDE, et venez explorer un moyen simple de refactorer vers un code plus respectueux des principes S, puis O, D, I et L ...",
|
"Rech. proj. pr proj. priv. self-dem.brt. poss. S'adr.à l'hôt. MART.\n\nBien sûr, S'adr.à l'hôt. MART. et plus si affinités, c'est plus humain… mais pas forcément plus compréhensible : on a beau lire et relire le contenu de la méthode, on est quasiment sûr que son nom, il bluffe !\n\nFaut-il pour autant laisser de mauvais noms tromper 1000 fois 1000 personnes ?\n\nDans cette nouvelle session, nous appliquerons Naming as a Process, une méthode de refactoring progressive centrée sur le nommage.\n\nObjectif : faire émerger la logique métier à travers des noms clairs, précis et alignés avec l'intention réelle du code. Au fil des étapes, nous transformerons un bloc obscur en fonctions lisibles, maintenables et prêtes à danser la carioca.\n\nPrenez un chewing-gum, ouvrez votre IDE, et venez explorer un moyen simple de refactorer vers un code plus respectueux des principes S, puis O, D, I et L ...",
|
||||||
type: EventType.CODE_KATA,
|
type: EventType.CODE_KATA,
|
||||||
status: EventStatus.UPCOMING,
|
|
||||||
room: "Nautilus",
|
room: "Nautilus",
|
||||||
time: "11h-12h",
|
time: "11h-12h",
|
||||||
maxPlaces: 25,
|
maxPlaces: 25,
|
||||||
@@ -234,7 +182,6 @@ async function main() {
|
|||||||
description:
|
description:
|
||||||
"Les ateliers d'Event Storming permettent de faire émerger des Policies : des règles métier qui traduisent comment le système réagit à un événement ou déclenche une action. Sur le papier, tout est clair — mais au moment de coder, ces règles se diluent souvent dans des if/else, des services surchargés ou des comportements implicites.\n\nLe design pattern Rule offre une façon concrète de ramener ces Policies au cœur du code, sous une forme explicite, modulaire et testable. Chaque règle devient un objet du domaine, capable de dire si elle s'applique et d'exécuter sa logique, en respectant les invariants du modèle.\n\nCe pattern facilite la traduction du langage métier en code exécutable : les règles deviennent lisibles, combinables et extensibles en limitant la complexité.\n\nEn explorant le Rule Pattern, nous découvrirons ainsi comment faire vivre les Policies dans notre code, au service d'un modèle plus riche, plus compréhensible, et mieux aligné avec la connaissance du métier.",
|
"Les ateliers d'Event Storming permettent de faire émerger des Policies : des règles métier qui traduisent comment le système réagit à un événement ou déclenche une action. Sur le papier, tout est clair — mais au moment de coder, ces règles se diluent souvent dans des if/else, des services surchargés ou des comportements implicites.\n\nLe design pattern Rule offre une façon concrète de ramener ces Policies au cœur du code, sous une forme explicite, modulaire et testable. Chaque règle devient un objet du domaine, capable de dire si elle s'applique et d'exécuter sa logique, en respectant les invariants du modèle.\n\nCe pattern facilite la traduction du langage métier en code exécutable : les règles deviennent lisibles, combinables et extensibles en limitant la complexité.\n\nEn explorant le Rule Pattern, nous découvrirons ainsi comment faire vivre les Policies dans notre code, au service d'un modèle plus riche, plus compréhensible, et mieux aligné avec la connaissance du métier.",
|
||||||
type: EventType.CODE_KATA,
|
type: EventType.CODE_KATA,
|
||||||
status: EventStatus.UPCOMING,
|
|
||||||
room: "Nautilus",
|
room: "Nautilus",
|
||||||
time: "11h-12h",
|
time: "11h-12h",
|
||||||
maxPlaces: 25,
|
maxPlaces: 25,
|
||||||
@@ -245,24 +192,18 @@ async function main() {
|
|||||||
description:
|
description:
|
||||||
"Lorsque le code commence à vieillir, il arrive qu'une méthode ou une classe devienne trop risquée à modifier directement : effets de bord, dépendances invisibles, tests manquants... le moindre changement entraîne des régressions.\n\nLes Wrap Techniques offrent une approche sûre et progressive : plutôt que de changer directement le code existant, on l'enveloppe dans une nouvelle abstraction ou une nouvelle méthode. On peut alors introduire de la logique ou un nouveau comportement, en changeant le contrat initial, sans casser les tests.\n\nDurant cette session nous verrons comment et quand utiliser ces techniques et nous en explorerons leurs bénéfices : isolation du risque, refactorings incrémentaux, amélioration de la testabilité.\n\nNous mettrons bien sûr en pratique sur un exemple de code pour comprendre comment ces refactorings facilitent les transitions vers un meilleur design.",
|
"Lorsque le code commence à vieillir, il arrive qu'une méthode ou une classe devienne trop risquée à modifier directement : effets de bord, dépendances invisibles, tests manquants... le moindre changement entraîne des régressions.\n\nLes Wrap Techniques offrent une approche sûre et progressive : plutôt que de changer directement le code existant, on l'enveloppe dans une nouvelle abstraction ou une nouvelle méthode. On peut alors introduire de la logique ou un nouveau comportement, en changeant le contrat initial, sans casser les tests.\n\nDurant cette session nous verrons comment et quand utiliser ces techniques et nous en explorerons leurs bénéfices : isolation du risque, refactorings incrémentaux, amélioration de la testabilité.\n\nNous mettrons bien sûr en pratique sur un exemple de code pour comprendre comment ces refactorings facilitent les transitions vers un meilleur design.",
|
||||||
type: EventType.CODE_KATA,
|
type: EventType.CODE_KATA,
|
||||||
status: EventStatus.UPCOMING,
|
|
||||||
room: "Nautilus",
|
room: "Nautilus",
|
||||||
time: "11h-12h",
|
time: "11h-12h",
|
||||||
maxPlaces: 25,
|
maxPlaces: 25,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Supprimer tous les événements existants avant de les recréer
|
||||||
|
await prisma.event.deleteMany({});
|
||||||
|
|
||||||
|
// Créer les nouveaux événements (le statut est calculé automatiquement côté client)
|
||||||
const events = await Promise.all(
|
const events = await Promise.all(
|
||||||
eventData.map(async (data) => {
|
eventData.map(async (data) => {
|
||||||
const existing = await prisma.event.findFirst({
|
|
||||||
where: { name: data.name },
|
|
||||||
});
|
|
||||||
if (existing) {
|
|
||||||
return prisma.event.update({
|
|
||||||
where: { id: existing.id },
|
|
||||||
data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return prisma.event.create({ data });
|
return prisma.event.create({ data });
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user