From fdd860c4567d69b58aa07c3e5a5182fc7473e92f Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Wed, 10 Dec 2025 05:27:35 +0100 Subject: [PATCH] Enhance event model and management: Add new fields for room, time, and maxPlaces to the Event model in Prisma schema. Update API routes and UI components to support these fields, improving event details and user interaction in event management and registration processes. --- app/api/admin/events/[id]/route.ts | 8 +- app/api/admin/events/route.ts | 11 +- components/EventManagement.tsx | 94 +++++++- components/EventsPageSection.tsx | 218 +++++++++++++++++- prisma/generated/prisma/commonInputTypes.ts | 54 +++++ prisma/generated/prisma/enums.ts | 3 +- prisma/generated/prisma/internal/class.ts | 4 +- .../prisma/internal/prismaNamespace.ts | 3 + .../prisma/internal/prismaNamespaceBrowser.ts | 3 + prisma/generated/prisma/models/Event.ts | 150 +++++++++++- .../migration.sql | 4 + prisma/schema.prisma | 4 + prisma/seed.ts | 30 ++- 13 files changed, 564 insertions(+), 22 deletions(-) create mode 100644 prisma/migrations/20251210042344_add_event_details_fields/migration.sql diff --git a/app/api/admin/events/[id]/route.ts b/app/api/admin/events/[id]/route.ts index b3fb9fb..881c8e5 100644 --- a/app/api/admin/events/[id]/route.ts +++ b/app/api/admin/events/[id]/route.ts @@ -16,7 +16,7 @@ export async function PUT( const { id } = await params; const body = await request.json(); - const { date, name, description, type, status } = body; + const { date, name, description, type, status, room, time, maxPlaces } = body; // Vérifier que l'événement existe const existingEvent = await prisma.event.findUnique({ @@ -36,6 +36,9 @@ export async function PUT( description?: string; type?: EventType; status?: EventStatus; + room?: string | null; + time?: string | null; + maxPlaces?: number | null; } = {}; if (date !== undefined) updateData.date = date; @@ -59,6 +62,9 @@ export async function PUT( } updateData.status = status as EventStatus; } + if (room !== undefined) updateData.room = room || null; + if (time !== undefined) updateData.time = time || null; + if (maxPlaces !== undefined) updateData.maxPlaces = maxPlaces ? parseInt(maxPlaces) : null; const event = await prisma.event.update({ where: { id }, diff --git a/app/api/admin/events/route.ts b/app/api/admin/events/route.ts index d75ae4d..e804f1e 100644 --- a/app/api/admin/events/route.ts +++ b/app/api/admin/events/route.ts @@ -22,6 +22,9 @@ export async function GET() { description: true, type: true, status: true, + room: true, + time: true, + maxPlaces: true, createdAt: true, updatedAt: true, _count: { @@ -40,6 +43,9 @@ export async function GET() { description: event.description, type: event.type, status: event.status, + room: event.room, + time: event.time, + maxPlaces: event.maxPlaces, createdAt: event.createdAt.toISOString(), updatedAt: event.updatedAt.toISOString(), registrationsCount: event._count.registrations, @@ -64,7 +70,7 @@ export async function POST(request: Request) { } const body = await request.json(); - const { date, name, description, type, status } = body; + const { date, name, description, type, status, room, time, maxPlaces } = body; if (!date || !name || !description || !type || !status) { return NextResponse.json( @@ -95,6 +101,9 @@ export async function POST(request: Request) { description, type: type as EventType, status: status as EventStatus, + room: room || null, + time: time || null, + maxPlaces: maxPlaces ? parseInt(maxPlaces) : null, }, }); diff --git a/components/EventManagement.tsx b/components/EventManagement.tsx index 8e34b3d..3a5fd78 100644 --- a/components/EventManagement.tsx +++ b/components/EventManagement.tsx @@ -7,8 +7,11 @@ interface Event { date: string; name: string; description: string; - type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION"; + type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA"; status: "UPCOMING" | "LIVE" | "PAST"; + room?: string | null; + time?: string | null; + maxPlaces?: number | null; createdAt: string; updatedAt: string; registrationsCount?: number; @@ -18,8 +21,11 @@ interface EventFormData { date: string; name: string; description: string; - type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION"; + type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA"; status: "UPCOMING" | "LIVE" | "PAST"; + room?: string; + time?: string; + maxPlaces?: number; } const eventTypes: Event["type"][] = [ @@ -27,6 +33,7 @@ const eventTypes: Event["type"][] = [ "LAUNCH", "FESTIVAL", "COMPETITION", + "CODE_KATA", ]; const eventStatuses: Event["status"][] = ["UPCOMING", "LIVE", "PAST"]; @@ -40,6 +47,8 @@ const getEventTypeLabel = (type: Event["type"]) => { return "Festival"; case "COMPETITION": return "Compétition"; + case "CODE_KATA": + return "Code Kata"; default: return type; } @@ -70,6 +79,9 @@ export default function EventManagement() { description: "", type: "SUMMIT", status: "UPCOMING", + room: "", + time: "", + maxPlaces: undefined, }); useEffect(() => { @@ -99,6 +111,9 @@ export default function EventManagement() { description: "", type: "SUMMIT", status: "UPCOMING", + room: "", + time: "", + maxPlaces: undefined, }); }; @@ -111,6 +126,9 @@ export default function EventManagement() { description: event.description, type: event.type, status: event.status, + room: event.room || "", + time: event.time || "", + maxPlaces: event.maxPlaces || undefined, }); }; @@ -146,6 +164,9 @@ export default function EventManagement() { description: "", type: "SUMMIT", status: "UPCOMING", + room: "", + time: "", + maxPlaces: undefined, }); } else { const error = await response?.json(); @@ -190,6 +211,9 @@ export default function EventManagement() { description: "", type: "SUMMIT", status: "UPCOMING", + room: "", + time: "", + maxPlaces: undefined, }); }; @@ -298,6 +322,55 @@ export default function EventManagement() { +
+
+ + + setFormData({ ...formData, room: e.target.value }) + } + placeholder="Ex: Nautilus" + className="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm" + /> +
+
+ + + setFormData({ ...formData, time: e.target.value }) + } + placeholder="Ex: 11h-12h" + className="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm" + /> +
+
+ + + setFormData({ + ...formData, + maxPlaces: e.target.value + ? parseInt(e.target.value) + : undefined, + }) + } + placeholder="Ex: 25" + className="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm" + /> +
+
) : (
+ + {/* Event Modal */} + {selectedEvent && ( +
setSelectedEvent(null)} + > +
e.stopPropagation()} + > +
+ {/* Header */} +
+
+
+ {getStatusBadge(selectedEvent.status)} + + {getEventTypeLabel(selectedEvent.type)} + +
+

+ {selectedEvent.name} +

+
+ +
+ + {/* Event Header Color Bar */} +
+ + {/* Date */} +
+ {selectedEvent.date} +
+ + {/* Event Details */} + {(selectedEvent.room || + selectedEvent.time || + selectedEvent.maxPlaces) && ( +
+ {selectedEvent.room && ( +
+ 📍 +
+
+ Salle +
+
+ {selectedEvent.room} +
+
+
+ )} + {selectedEvent.time && ( +
+ 🕐 +
+
+ Heure +
+
+ {selectedEvent.time} +
+
+
+ )} + {selectedEvent.maxPlaces && ( +
+ 👥 +
+
+ Places +
+
+ {selectedEvent.maxPlaces} +
+
+
+ )} +
+ )} + + {/* Full Description */} +
+

+ Description +

+

+ {selectedEvent.description} +

+
+ + {/* Action Button */} + {selectedEvent.status === "UPCOMING" && ( +
+ {registrations[selectedEvent.id] ? ( + + ) : ( + + )} +
+ )} + {selectedEvent.status === "LIVE" && ( +
+ +
+ )} + {selectedEvent.status === "PAST" && ( +
+ +
+ )} +
+
+
+ )} ); } diff --git a/prisma/generated/prisma/commonInputTypes.ts b/prisma/generated/prisma/commonInputTypes.ts index 9c84aaa..a51005d 100644 --- a/prisma/generated/prisma/commonInputTypes.ts +++ b/prisma/generated/prisma/commonInputTypes.ts @@ -181,6 +181,17 @@ export type EnumEventStatusFilter<$PrismaModel = never> = { not?: Prisma.NestedEnumEventStatusFilter<$PrismaModel> | $Enums.EventStatus } +export type IntNullableFilter<$PrismaModel = never> = { + equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.IntFieldRefInput<$PrismaModel> + lte?: number | Prisma.IntFieldRefInput<$PrismaModel> + gt?: number | Prisma.IntFieldRefInput<$PrismaModel> + gte?: number | Prisma.IntFieldRefInput<$PrismaModel> + not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null +} + export type EnumEventTypeWithAggregatesFilter<$PrismaModel = never> = { equals?: $Enums.EventType | Prisma.EnumEventTypeFieldRefInput<$PrismaModel> in?: $Enums.EventType[] @@ -201,6 +212,22 @@ export type EnumEventStatusWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedEnumEventStatusFilter<$PrismaModel> } +export type IntNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.IntFieldRefInput<$PrismaModel> + lte?: number | Prisma.IntFieldRefInput<$PrismaModel> + gt?: number | Prisma.IntFieldRefInput<$PrismaModel> + gte?: number | Prisma.IntFieldRefInput<$PrismaModel> + not?: Prisma.NestedIntNullableWithAggregatesFilter<$PrismaModel> | number | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _sum?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedIntNullableFilter<$PrismaModel> + _max?: Prisma.NestedIntNullableFilter<$PrismaModel> +} + export type NestedStringFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] @@ -405,4 +432,31 @@ export type NestedEnumEventStatusWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedEnumEventStatusFilter<$PrismaModel> } +export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.IntFieldRefInput<$PrismaModel> + lte?: number | Prisma.IntFieldRefInput<$PrismaModel> + gt?: number | Prisma.IntFieldRefInput<$PrismaModel> + gte?: number | Prisma.IntFieldRefInput<$PrismaModel> + not?: Prisma.NestedIntNullableWithAggregatesFilter<$PrismaModel> | number | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _sum?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedIntNullableFilter<$PrismaModel> + _max?: Prisma.NestedIntNullableFilter<$PrismaModel> +} + +export type NestedFloatNullableFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null +} + diff --git a/prisma/generated/prisma/enums.ts b/prisma/generated/prisma/enums.ts index 54123e4..38e5baf 100644 --- a/prisma/generated/prisma/enums.ts +++ b/prisma/generated/prisma/enums.ts @@ -21,7 +21,8 @@ export const EventType = { SUMMIT: 'SUMMIT', LAUNCH: 'LAUNCH', FESTIVAL: 'FESTIVAL', - COMPETITION: 'COMPETITION' + COMPETITION: 'COMPETITION', + CODE_KATA: 'CODE_KATA' } as const export type EventType = (typeof EventType)[keyof typeof EventType] diff --git a/prisma/generated/prisma/internal/class.ts b/prisma/generated/prisma/internal/class.ts index 4f24b15..7cd4501 100644 --- a/prisma/generated/prisma/internal/class.ts +++ b/prisma/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.1.0", "engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba", "activeProvider": "sqlite", - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n SUMMIT\n LAUNCH\n FESTIVAL\n COMPETITION\n}\n\nenum EventStatus {\n UPCOMING\n LIVE\n PAST\n}\n\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 String\n name String\n description String\n type EventType\n status EventStatus\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n registrations EventRegistration[]\n\n @@index([status])\n @@index([date])\n}\n\nmodel EventRegistration {\n id String @id @default(cuid())\n userId String\n eventId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n\n @@unique([userId, eventId])\n @@index([userId])\n @@index([eventId])\n}\n\nmodel SitePreferences {\n id String @id @default(\"global\")\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", + "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 String\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", "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\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EventStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"registrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventToEventRegistration\"}],\"dbName\":null},\"EventRegistration\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventRegistrationToUser\"},{\"name\":\"event\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToEventRegistration\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SitePreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +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\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EventStatus\"},{\"name\":\"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 { const { Buffer } = await import('node:buffer') diff --git a/prisma/generated/prisma/internal/prismaNamespace.ts b/prisma/generated/prisma/internal/prismaNamespace.ts index a1a63a9..3bb18d3 100644 --- a/prisma/generated/prisma/internal/prismaNamespace.ts +++ b/prisma/generated/prisma/internal/prismaNamespace.ts @@ -857,6 +857,9 @@ export const EventScalarFieldEnum = { description: 'description', type: 'type', status: 'status', + room: 'room', + time: 'time', + maxPlaces: 'maxPlaces', createdAt: 'createdAt', updatedAt: 'updatedAt' } as const diff --git a/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts b/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts index 1c0cb95..4b79c0d 100644 --- a/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -114,6 +114,9 @@ export const EventScalarFieldEnum = { description: 'description', type: 'type', status: 'status', + room: 'room', + time: 'time', + maxPlaces: 'maxPlaces', createdAt: 'createdAt', updatedAt: 'updatedAt' } as const diff --git a/prisma/generated/prisma/models/Event.ts b/prisma/generated/prisma/models/Event.ts index 27d8ec5..f4638e9 100644 --- a/prisma/generated/prisma/models/Event.ts +++ b/prisma/generated/prisma/models/Event.ts @@ -20,10 +20,20 @@ export type EventModel = runtime.Types.Result.DefaultSelection | string type?: Prisma.EnumEventTypeFilter<"Event"> | $Enums.EventType status?: Prisma.EnumEventStatusFilter<"Event"> | $Enums.EventStatus + room?: Prisma.StringNullableFilter<"Event"> | string | null + time?: Prisma.StringNullableFilter<"Event"> | string | null + maxPlaces?: Prisma.IntNullableFilter<"Event"> | number | null createdAt?: Prisma.DateTimeFilter<"Event"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Event"> | Date | string registrations?: Prisma.EventRegistrationListRelationFilter @@ -216,6 +274,9 @@ export type EventOrderByWithRelationInput = { description?: Prisma.SortOrder type?: Prisma.SortOrder status?: Prisma.SortOrder + room?: Prisma.SortOrderInput | Prisma.SortOrder + time?: Prisma.SortOrderInput | Prisma.SortOrder + maxPlaces?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder registrations?: Prisma.EventRegistrationOrderByRelationAggregateInput @@ -231,6 +292,9 @@ export type EventWhereUniqueInput = Prisma.AtLeast<{ description?: Prisma.StringFilter<"Event"> | string type?: Prisma.EnumEventTypeFilter<"Event"> | $Enums.EventType status?: Prisma.EnumEventStatusFilter<"Event"> | $Enums.EventStatus + room?: Prisma.StringNullableFilter<"Event"> | string | null + time?: Prisma.StringNullableFilter<"Event"> | string | null + maxPlaces?: Prisma.IntNullableFilter<"Event"> | number | null createdAt?: Prisma.DateTimeFilter<"Event"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Event"> | Date | string registrations?: Prisma.EventRegistrationListRelationFilter @@ -243,11 +307,16 @@ export type EventOrderByWithAggregationInput = { description?: Prisma.SortOrder type?: Prisma.SortOrder status?: Prisma.SortOrder + room?: Prisma.SortOrderInput | Prisma.SortOrder + time?: Prisma.SortOrderInput | Prisma.SortOrder + maxPlaces?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder _count?: Prisma.EventCountOrderByAggregateInput + _avg?: Prisma.EventAvgOrderByAggregateInput _max?: Prisma.EventMaxOrderByAggregateInput _min?: Prisma.EventMinOrderByAggregateInput + _sum?: Prisma.EventSumOrderByAggregateInput } export type EventScalarWhereWithAggregatesInput = { @@ -260,6 +329,9 @@ export type EventScalarWhereWithAggregatesInput = { description?: Prisma.StringWithAggregatesFilter<"Event"> | string type?: Prisma.EnumEventTypeWithAggregatesFilter<"Event"> | $Enums.EventType status?: Prisma.EnumEventStatusWithAggregatesFilter<"Event"> | $Enums.EventStatus + room?: Prisma.StringNullableWithAggregatesFilter<"Event"> | string | null + time?: Prisma.StringNullableWithAggregatesFilter<"Event"> | string | null + maxPlaces?: Prisma.IntNullableWithAggregatesFilter<"Event"> | number | null createdAt?: Prisma.DateTimeWithAggregatesFilter<"Event"> | Date | string updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Event"> | Date | string } @@ -271,6 +343,9 @@ export type EventCreateInput = { description: string type: $Enums.EventType status: $Enums.EventStatus + room?: string | null + time?: string | null + maxPlaces?: number | null createdAt?: Date | string updatedAt?: Date | string registrations?: Prisma.EventRegistrationCreateNestedManyWithoutEventInput @@ -283,6 +358,9 @@ export type EventUncheckedCreateInput = { description: string type: $Enums.EventType status: $Enums.EventStatus + room?: string | null + time?: string | null + maxPlaces?: number | null createdAt?: Date | string updatedAt?: Date | string registrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutEventInput @@ -295,6 +373,9 @@ export type EventUpdateInput = { description?: Prisma.StringFieldUpdateOperationsInput | string type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus + 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 @@ -307,6 +388,9 @@ export type EventUncheckedUpdateInput = { description?: Prisma.StringFieldUpdateOperationsInput | string type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus + 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 @@ -319,6 +403,9 @@ export type EventCreateManyInput = { description: string type: $Enums.EventType status: $Enums.EventStatus + room?: string | null + time?: string | null + maxPlaces?: number | null createdAt?: Date | string updatedAt?: Date | string } @@ -330,6 +417,9 @@ export type EventUpdateManyMutationInput = { description?: Prisma.StringFieldUpdateOperationsInput | string type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus + 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 } @@ -341,6 +431,9 @@ export type EventUncheckedUpdateManyInput = { description?: Prisma.StringFieldUpdateOperationsInput | string type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus + 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 } @@ -352,10 +445,17 @@ export type EventCountOrderByAggregateInput = { description?: Prisma.SortOrder type?: Prisma.SortOrder status?: Prisma.SortOrder + room?: Prisma.SortOrder + time?: Prisma.SortOrder + maxPlaces?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } +export type EventAvgOrderByAggregateInput = { + maxPlaces?: Prisma.SortOrder +} + export type EventMaxOrderByAggregateInput = { id?: Prisma.SortOrder date?: Prisma.SortOrder @@ -363,6 +463,9 @@ export type EventMaxOrderByAggregateInput = { description?: Prisma.SortOrder type?: Prisma.SortOrder status?: Prisma.SortOrder + room?: Prisma.SortOrder + time?: Prisma.SortOrder + maxPlaces?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -374,10 +477,17 @@ export type EventMinOrderByAggregateInput = { description?: Prisma.SortOrder type?: Prisma.SortOrder status?: Prisma.SortOrder + room?: Prisma.SortOrder + time?: Prisma.SortOrder + maxPlaces?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } +export type EventSumOrderByAggregateInput = { + maxPlaces?: Prisma.SortOrder +} + export type EventScalarRelationFilter = { is?: Prisma.EventWhereInput isNot?: Prisma.EventWhereInput @@ -391,6 +501,14 @@ export type EnumEventStatusFieldUpdateOperationsInput = { set?: $Enums.EventStatus } +export type NullableIntFieldUpdateOperationsInput = { + set?: number | null + increment?: number + decrement?: number + multiply?: number + divide?: number +} + export type EventCreateNestedOneWithoutRegistrationsInput = { create?: Prisma.XOR connectOrCreate?: Prisma.EventCreateOrConnectWithoutRegistrationsInput @@ -412,6 +530,9 @@ export type EventCreateWithoutRegistrationsInput = { description: string type: $Enums.EventType status: $Enums.EventStatus + room?: string | null + time?: string | null + maxPlaces?: number | null createdAt?: Date | string updatedAt?: Date | string } @@ -423,6 +544,9 @@ export type EventUncheckedCreateWithoutRegistrationsInput = { description: string type: $Enums.EventType status: $Enums.EventStatus + room?: string | null + time?: string | null + maxPlaces?: number | null createdAt?: Date | string updatedAt?: Date | string } @@ -450,6 +574,9 @@ export type EventUpdateWithoutRegistrationsInput = { description?: Prisma.StringFieldUpdateOperationsInput | string type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus + 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 } @@ -461,6 +588,9 @@ export type EventUncheckedUpdateWithoutRegistrationsInput = { description?: Prisma.StringFieldUpdateOperationsInput | string type?: Prisma.EnumEventTypeFieldUpdateOperationsInput | $Enums.EventType status?: Prisma.EnumEventStatusFieldUpdateOperationsInput | $Enums.EventStatus + 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 } @@ -503,6 +633,9 @@ export type EventSelect @@ -516,6 +649,9 @@ export type EventSelectCreateManyAndReturn @@ -527,6 +663,9 @@ export type EventSelectUpdateManyAndReturn @@ -538,11 +677,14 @@ export type EventSelectScalar = { description?: boolean type?: boolean status?: boolean + room?: boolean + time?: boolean + maxPlaces?: boolean createdAt?: boolean updatedAt?: boolean } -export type EventOmit = runtime.Types.Extensions.GetOmit<"id" | "date" | "name" | "description" | "type" | "status" | "createdAt" | "updatedAt", ExtArgs["result"]["event"]> +export type EventOmit = runtime.Types.Extensions.GetOmit<"id" | "date" | "name" | "description" | "type" | "status" | "room" | "time" | "maxPlaces" | "createdAt" | "updatedAt", ExtArgs["result"]["event"]> export type EventInclude = { registrations?: boolean | Prisma.Event$registrationsArgs _count?: boolean | Prisma.EventCountOutputTypeDefaultArgs @@ -562,6 +704,9 @@ export type $EventPayload @@ -994,6 +1139,9 @@ export interface EventFieldRefs { readonly description: Prisma.FieldRef<"Event", 'String'> readonly type: Prisma.FieldRef<"Event", 'EventType'> readonly status: Prisma.FieldRef<"Event", 'EventStatus'> + readonly room: Prisma.FieldRef<"Event", 'String'> + readonly time: Prisma.FieldRef<"Event", 'String'> + readonly maxPlaces: Prisma.FieldRef<"Event", 'Int'> readonly createdAt: Prisma.FieldRef<"Event", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"Event", 'DateTime'> } diff --git a/prisma/migrations/20251210042344_add_event_details_fields/migration.sql b/prisma/migrations/20251210042344_add_event_details_fields/migration.sql new file mode 100644 index 0000000..1964333 --- /dev/null +++ b/prisma/migrations/20251210042344_add_event_details_fields/migration.sql @@ -0,0 +1,4 @@ +-- AlterTable +ALTER TABLE "Event" ADD COLUMN "maxPlaces" INTEGER; +ALTER TABLE "Event" ADD COLUMN "room" TEXT; +ALTER TABLE "Event" ADD COLUMN "time" TEXT; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0d5fbfd..b476f9f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -20,6 +20,7 @@ enum EventType { LAUNCH FESTIVAL COMPETITION + CODE_KATA } enum EventStatus { @@ -89,6 +90,9 @@ model Event { description String type EventType status EventStatus + room String? + time String? + maxPlaces Int? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt registrations EventRegistration[] diff --git a/prisma/seed.ts b/prisma/seed.ts index 0b3944c..557ab7d 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -148,7 +148,7 @@ async function main() { // Créer des événements (vérifier s'ils existent déjà) const eventData = [ { - date: "18 NOVEMBRE 2023", + date: "2023-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.", @@ -156,7 +156,7 @@ async function main() { status: EventStatus.PAST, }, { - date: "3 DÉCEMBRE 2023", + date: "2023-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é.", @@ -164,7 +164,7 @@ async function main() { status: EventStatus.PAST, }, { - date: "22 DÉCEMBRE 2023", + date: "2023-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.", @@ -172,7 +172,7 @@ async function main() { status: EventStatus.PAST, }, { - date: "15 JANVIER 2024", + date: "2024-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.", @@ -180,7 +180,7 @@ async function main() { status: EventStatus.UPCOMING, }, { - date: "8 FÉVRIER 2024", + date: "2024-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.", @@ -188,13 +188,24 @@ async function main() { status: EventStatus.UPCOMING, }, { - date: "12 MARS 2024", + date: "2024-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: "2024-12-15", + name: "Builder pattern : construction et refactoring", + 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.", + type: EventType.CODE_KATA, + status: EventStatus.UPCOMING, + room: "Nautilus", + time: "11h-12h", + maxPlaces: 25, + }, ]; const events = await Promise.all( @@ -202,7 +213,12 @@ async function main() { const existing = await prisma.event.findFirst({ where: { name: data.name }, }); - if (existing) return existing; + if (existing) { + return prisma.event.update({ + where: { id: existing.id }, + data, + }); + } return prisma.event.create({ data }); }) );