From b245be3bf4c9f3f98ed61f25a657b2538b09d3b7 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Tue, 9 Dec 2025 22:03:51 +0100 Subject: [PATCH] Enhance user profiles with character class feature: Add character class field to user model and update related API routes, UI components, and validation logic. This update improves user profile customization and leaderboard entries by allowing users to select and display their character class. --- README.md | 1 - app/api/leaderboard/route.ts | 3 + app/api/profile/route.ts | 37 +++++- app/leaderboard/page.tsx | 3 + app/profile/page.tsx | 18 ++- components/Leaderboard.tsx | 79 +++++++++-- components/LeaderboardSection.tsx | 75 ++++++++++- components/ProfileForm.tsx | 124 ++++++++++++++++++ lib/preferences.ts | 2 +- prisma/generated/prisma/commonInputTypes.ts | 34 +++++ prisma/generated/prisma/enums.ts | 16 +++ prisma/generated/prisma/internal/class.ts | 4 +- .../prisma/internal/prismaNamespace.ts | 8 ++ .../prisma/internal/prismaNamespaceBrowser.ts | 1 + prisma/generated/prisma/models/User.ts | 42 +++++- .../migration.sql | 2 + prisma/schema.prisma | 14 ++ 17 files changed, 438 insertions(+), 25 deletions(-) create mode 100644 prisma/migrations/20251209210032_add_character_class/migration.sql diff --git a/README.md b/README.md index 6f00a8d..5384f18 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,3 @@ pnpm start - React 18 - TypeScript - Tailwind CSS - diff --git a/app/api/leaderboard/route.ts b/app/api/leaderboard/route.ts index 0cfd212..538e929 100644 --- a/app/api/leaderboard/route.ts +++ b/app/api/leaderboard/route.ts @@ -15,6 +15,7 @@ export async function GET() { level: true, avatar: true, bio: true, + characterClass: true, }, }); @@ -27,6 +28,7 @@ export async function GET() { level: number; avatar: string | null; bio: string | null; + characterClass: string | null; }, index: number ) => ({ @@ -36,6 +38,7 @@ export async function GET() { level: user.level, avatar: user.avatar, bio: user.bio, + characterClass: user.characterClass, }) ); diff --git a/app/api/profile/route.ts b/app/api/profile/route.ts index a3953d9..e740f5e 100644 --- a/app/api/profile/route.ts +++ b/app/api/profile/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from "next/server"; import { auth } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; +import { CharacterClass } from "@/prisma/generated/prisma/enums"; export async function GET() { try { @@ -18,6 +19,7 @@ export async function GET() { username: true, avatar: true, bio: true, + characterClass: true, hp: true, maxHp: true, xp: true, @@ -51,7 +53,7 @@ export async function PUT(request: Request) { } const body = await request.json(); - const { username, avatar, bio } = body; + const { username, avatar, bio, characterClass } = body; // Validation if (username !== undefined) { @@ -101,8 +103,35 @@ export async function PUT(request: Request) { } } + // Validation characterClass + const validClasses = [ + "WARRIOR", + "MAGE", + "ROGUE", + "RANGER", + "PALADIN", + "ENGINEER", + "MERCHANT", + "SCHOLAR", + "BERSERKER", + "NECROMANCER", + ]; + if (characterClass !== undefined && characterClass !== null) { + if (!validClasses.includes(characterClass)) { + return NextResponse.json( + { error: "Classe de personnage invalide" }, + { status: 400 } + ); + } + } + // Mettre à jour l'utilisateur - const updateData: { username?: string; avatar?: string | null; bio?: string | null } = {}; + const updateData: { + username?: string; + avatar?: string | null; + bio?: string | null; + characterClass?: CharacterClass | null; + } = {}; if (username !== undefined) { updateData.username = username.trim(); } @@ -112,6 +141,9 @@ export async function PUT(request: Request) { if (bio !== undefined) { updateData.bio = bio.trim() || null; } + if (characterClass !== undefined) { + updateData.characterClass = (characterClass as CharacterClass) || null; + } const updatedUser = await prisma.user.update({ where: { id: session.user.id }, @@ -122,6 +154,7 @@ export async function PUT(request: Request) { username: true, avatar: true, bio: true, + characterClass: true, hp: true, maxHp: true, xp: true, diff --git a/app/leaderboard/page.tsx b/app/leaderboard/page.tsx index c7e5738..fbe42d3 100644 --- a/app/leaderboard/page.tsx +++ b/app/leaderboard/page.tsx @@ -10,6 +10,7 @@ interface LeaderboardEntry { level: number; avatar: string | null; bio: string | null; + characterClass: string | null; } export default async function LeaderboardPage() { @@ -25,6 +26,7 @@ export default async function LeaderboardPage() { level: true, avatar: true, bio: true, + characterClass: true, }, }); @@ -35,6 +37,7 @@ export default async function LeaderboardPage() { level: user.level, avatar: user.avatar, bio: user.bio, + characterClass: user.characterClass, })); const backgroundImage = await getBackgroundImage( diff --git a/app/profile/page.tsx b/app/profile/page.tsx index d4e8568..e9b3bd5 100644 --- a/app/profile/page.tsx +++ b/app/profile/page.tsx @@ -20,6 +20,7 @@ export default async function ProfilePage() { username: true, avatar: true, bio: true, + characterClass: true, hp: true, maxHp: true, xp: true, @@ -34,13 +35,24 @@ export default async function ProfilePage() { redirect("/login"); } - const backgroundImage = await getBackgroundImage("home", "/got-background.jpg"); + const backgroundImage = await getBackgroundImage( + "home", + "/got-background.jpg" + ); + + // Convert Date to string for the component + const userProfile = { + ...user, + createdAt: user.createdAt.toISOString(), + }; return (
- +
); } - diff --git a/components/Leaderboard.tsx b/components/Leaderboard.tsx index f2d0ac7..8680090 100644 --- a/components/Leaderboard.tsx +++ b/components/Leaderboard.tsx @@ -9,6 +9,7 @@ interface LeaderboardEntry { level: number; avatar?: string | null; bio?: string | null; + characterClass?: string | null; } // Format number with consistent locale to avoid hydration mismatch @@ -82,18 +83,80 @@ export default function Leaderboard() { {entry.rank} -
+
{entry.username} - {entry.bio && ( + {entry.characterClass && ( + + [{entry.characterClass === "WARRIOR" && "⚔️ Guerrier"} + {entry.characterClass === "MAGE" && "🔮 Mage"} + {entry.characterClass === "ROGUE" && "🗡️ Voleur"} + {entry.characterClass === "RANGER" && "🏹 Rôdeur"} + {entry.characterClass === "PALADIN" && "🛡️ Paladin"} + {entry.characterClass === "ENGINEER" && "⚙️ Ingénieur"} + {entry.characterClass === "MERCHANT" && "💰 Marchand"} + {entry.characterClass === "SCHOLAR" && "📚 Érudit"} + {entry.characterClass === "BERSERKER" && "🔥 Berserker"} + {entry.characterClass === "NECROMANCER" && + "💀 Nécromancien"} + ] + + )} + {(entry.bio || entry.characterClass) && (
-
- Bio -
-

- {entry.bio} -

+ {entry.characterClass && ( +
+
+ Classe +
+
+ + {entry.characterClass === "WARRIOR" && "⚔️"} + {entry.characterClass === "MAGE" && "🔮"} + {entry.characterClass === "ROGUE" && "🗡️"} + {entry.characterClass === "RANGER" && "🏹"} + {entry.characterClass === "PALADIN" && "🛡️"} + {entry.characterClass === "ENGINEER" && "⚙️"} + {entry.characterClass === "MERCHANT" && "💰"} + {entry.characterClass === "SCHOLAR" && "📚"} + {entry.characterClass === "BERSERKER" && "🔥"} + {entry.characterClass === "NECROMANCER" && "💀"} + + + {entry.characterClass === "WARRIOR" && "Guerrier"} + {entry.characterClass === "MAGE" && "Mage"} + {entry.characterClass === "ROGUE" && "Voleur"} + {entry.characterClass === "RANGER" && "Rôdeur"} + {entry.characterClass === "PALADIN" && "Paladin"} + {entry.characterClass === "ENGINEER" && + "Ingénieur"} + {entry.characterClass === "MERCHANT" && + "Marchand"} + {entry.characterClass === "SCHOLAR" && "Érudit"} + {entry.characterClass === "BERSERKER" && + "Berserker"} + {entry.characterClass === "NECROMANCER" && + "Nécromancien"} + +
+
+ )} + {entry.bio && ( + <> + {entry.characterClass && ( +
+ )} +
+
+ Bio +
+

+ {entry.bio} +

+
+ + )}
)}
diff --git a/components/LeaderboardSection.tsx b/components/LeaderboardSection.tsx index fe56505..52bc934 100644 --- a/components/LeaderboardSection.tsx +++ b/components/LeaderboardSection.tsx @@ -7,6 +7,7 @@ interface LeaderboardEntry { level: number; avatar?: string | null; bio?: string | null; + characterClass?: string | null; } interface LeaderboardSectionProps { @@ -119,17 +120,77 @@ export default function LeaderboardSection({ > {entry.username} + {entry.characterClass && ( + + [{entry.characterClass === "WARRIOR" && "⚔️"} + {entry.characterClass === "MAGE" && "🔮"} + {entry.characterClass === "ROGUE" && "🗡️"} + {entry.characterClass === "RANGER" && "🏹"} + {entry.characterClass === "PALADIN" && "🛡️"} + {entry.characterClass === "ENGINEER" && "⚙️"} + {entry.characterClass === "MERCHANT" && "💰"} + {entry.characterClass === "SCHOLAR" && "📚"} + {entry.characterClass === "BERSERKER" && "🔥"} + {entry.characterClass === "NECROMANCER" && "💀"}] + + )} {entry.rank <= 3 && ( )} - {entry.bio && ( + {(entry.bio || entry.characterClass) && (
-
- Bio -
-

- {entry.bio} -

+ {entry.characterClass && ( +
+
+ Classe +
+
+ + {entry.characterClass === "WARRIOR" && "⚔️"} + {entry.characterClass === "MAGE" && "🔮"} + {entry.characterClass === "ROGUE" && "🗡️"} + {entry.characterClass === "RANGER" && "🏹"} + {entry.characterClass === "PALADIN" && "🛡️"} + {entry.characterClass === "ENGINEER" && "⚙️"} + {entry.characterClass === "MERCHANT" && "💰"} + {entry.characterClass === "SCHOLAR" && "📚"} + {entry.characterClass === "BERSERKER" && "🔥"} + {entry.characterClass === "NECROMANCER" && "💀"} + + + {entry.characterClass === "WARRIOR" && "Guerrier"} + {entry.characterClass === "MAGE" && "Mage"} + {entry.characterClass === "ROGUE" && "Voleur"} + {entry.characterClass === "RANGER" && "Rôdeur"} + {entry.characterClass === "PALADIN" && "Paladin"} + {entry.characterClass === "ENGINEER" && + "Ingénieur"} + {entry.characterClass === "MERCHANT" && + "Marchand"} + {entry.characterClass === "SCHOLAR" && "Érudit"} + {entry.characterClass === "BERSERKER" && + "Berserker"} + {entry.characterClass === "NECROMANCER" && + "Nécromancien"} + +
+
+ )} + {entry.bio && ( + <> + {entry.characterClass && ( +
+ )} +
+
+ Bio +
+

+ {entry.bio} +

+
+ + )}
)}
diff --git a/components/ProfileForm.tsx b/components/ProfileForm.tsx index c4cf255..935664b 100644 --- a/components/ProfileForm.tsx +++ b/components/ProfileForm.tsx @@ -3,12 +3,26 @@ import { useState, useRef } from "react"; import { useRouter } from "next/navigation"; +type CharacterClass = + | "WARRIOR" + | "MAGE" + | "ROGUE" + | "RANGER" + | "PALADIN" + | "ENGINEER" + | "MERCHANT" + | "SCHOLAR" + | "BERSERKER" + | "NECROMANCER" + | null; + interface UserProfile { id: string; email: string; username: string; avatar: string | null; bio: string | null; + characterClass: CharacterClass; hp: number; maxHp: number; xp: number; @@ -40,6 +54,9 @@ export default function ProfileForm({ const [username, setUsername] = useState(initialProfile.username); const [avatar, setAvatar] = useState(initialProfile.avatar); const [bio, setBio] = useState(initialProfile.bio || null); + const [characterClass, setCharacterClass] = useState( + initialProfile.characterClass || null + ); const fileInputRef = useRef(null); const [uploadingAvatar, setUploadingAvatar] = useState(false); @@ -102,6 +119,7 @@ export default function ProfileForm({ username, avatar, bio, + characterClass, }), }); @@ -109,6 +127,7 @@ export default function ProfileForm({ const data = await response.json(); setProfile(data); setBio(data.bio || null); + setCharacterClass(data.characterClass || null); setSuccess("Profil mis à jour avec succès"); setTimeout(() => setSuccess(null), 3000); } else { @@ -338,6 +357,111 @@ export default function ProfileForm({

+ {/* Character Class Selection */} +
+ +
+ {[ + { + value: "WARRIOR", + name: "Guerrier", + icon: "⚔️", + desc: "Maître du combat au corps à corps", + }, + { + value: "MAGE", + name: "Mage", + icon: "🔮", + desc: "Manipulateur des arcanes", + }, + { + value: "ROGUE", + name: "Voleur", + icon: "🗡️", + desc: "Furtif et mortel", + }, + { + value: "RANGER", + name: "Rôdeur", + icon: "🏹", + desc: "Chasseur des terres sauvages", + }, + { + value: "PALADIN", + name: "Paladin", + icon: "🛡️", + desc: "Protecteur sacré", + }, + { + value: "ENGINEER", + name: "Ingénieur", + icon: "⚙️", + desc: "Créateur d'artefacts", + }, + { + value: "MERCHANT", + name: "Marchand", + icon: "💰", + desc: "Maître du commerce", + }, + { + value: "SCHOLAR", + name: "Érudit", + icon: "📚", + desc: "Gardien du savoir", + }, + { + value: "BERSERKER", + name: "Berserker", + icon: "🔥", + desc: "Rage destructrice", + }, + { + value: "NECROMANCER", + name: "Nécromancien", + icon: "💀", + desc: "Maître des morts", + }, + ].map((cls) => ( + + ))} +
+ {characterClass && ( +

+ ✓ Classe sélectionnée +

+ )} +
+ {/* Stats Display */}

diff --git a/lib/preferences.ts b/lib/preferences.ts index 8b7cc46..2695332 100644 --- a/lib/preferences.ts +++ b/lib/preferences.ts @@ -16,7 +16,7 @@ export async function getBackgroundImage( const imageKey = `${page}Background` as keyof typeof sitePreferences; const customImage = sitePreferences[imageKey]; - return customImage || defaultImage; + return (customImage as string | null) || defaultImage; } catch (error) { console.error("Error fetching background image:", error); return defaultImage; diff --git a/prisma/generated/prisma/commonInputTypes.ts b/prisma/generated/prisma/commonInputTypes.ts index c654f3c..9c84aaa 100644 --- a/prisma/generated/prisma/commonInputTypes.ts +++ b/prisma/generated/prisma/commonInputTypes.ts @@ -60,6 +60,13 @@ export type StringNullableFilter<$PrismaModel = never> = { not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null } +export type EnumCharacterClassNullableFilter<$PrismaModel = never> = { + equals?: $Enums.CharacterClass | Prisma.EnumCharacterClassFieldRefInput<$PrismaModel> | null + in?: $Enums.CharacterClass[] | null + notIn?: $Enums.CharacterClass[] | null + not?: Prisma.NestedEnumCharacterClassNullableFilter<$PrismaModel> | $Enums.CharacterClass | null +} + export type DateTimeFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> in?: Date[] | string[] @@ -136,6 +143,16 @@ export type StringNullableWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedStringNullableFilter<$PrismaModel> } +export type EnumCharacterClassNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.CharacterClass | Prisma.EnumCharacterClassFieldRefInput<$PrismaModel> | null + in?: $Enums.CharacterClass[] | null + notIn?: $Enums.CharacterClass[] | null + not?: Prisma.NestedEnumCharacterClassNullableWithAggregatesFilter<$PrismaModel> | $Enums.CharacterClass | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedEnumCharacterClassNullableFilter<$PrismaModel> + _max?: Prisma.NestedEnumCharacterClassNullableFilter<$PrismaModel> +} + export type DateTimeWithAggregatesFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> in?: Date[] | string[] @@ -230,6 +247,13 @@ export type NestedStringNullableFilter<$PrismaModel = never> = { not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null } +export type NestedEnumCharacterClassNullableFilter<$PrismaModel = never> = { + equals?: $Enums.CharacterClass | Prisma.EnumCharacterClassFieldRefInput<$PrismaModel> | null + in?: $Enums.CharacterClass[] | null + notIn?: $Enums.CharacterClass[] | null + not?: Prisma.NestedEnumCharacterClassNullableFilter<$PrismaModel> | $Enums.CharacterClass | null +} + export type NestedDateTimeFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> in?: Date[] | string[] @@ -323,6 +347,16 @@ export type NestedIntNullableFilter<$PrismaModel = never> = { not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null } +export type NestedEnumCharacterClassNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.CharacterClass | Prisma.EnumCharacterClassFieldRefInput<$PrismaModel> | null + in?: $Enums.CharacterClass[] | null + notIn?: $Enums.CharacterClass[] | null + not?: Prisma.NestedEnumCharacterClassNullableWithAggregatesFilter<$PrismaModel> | $Enums.CharacterClass | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedEnumCharacterClassNullableFilter<$PrismaModel> + _max?: Prisma.NestedEnumCharacterClassNullableFilter<$PrismaModel> +} + export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> in?: Date[] | string[] diff --git a/prisma/generated/prisma/enums.ts b/prisma/generated/prisma/enums.ts index 24a3886..54123e4 100644 --- a/prisma/generated/prisma/enums.ts +++ b/prisma/generated/prisma/enums.ts @@ -34,3 +34,19 @@ export const EventStatus = { } as const export type EventStatus = (typeof EventStatus)[keyof typeof EventStatus] + + +export const CharacterClass = { + WARRIOR: 'WARRIOR', + MAGE: 'MAGE', + ROGUE: 'ROGUE', + RANGER: 'RANGER', + PALADIN: 'PALADIN', + ENGINEER: 'ENGINEER', + MERCHANT: 'MERCHANT', + SCHOLAR: 'SCHOLAR', + BERSERKER: 'BERSERKER', + NECROMANCER: 'NECROMANCER' +} as const + +export type CharacterClass = (typeof CharacterClass)[keyof typeof CharacterClass] diff --git a/prisma/generated/prisma/internal/class.ts b/prisma/generated/prisma/internal/class.ts index baac8f6..4f24b15 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\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 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}\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", "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\":\"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\":\"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 fd51dc1..a1a63a9 100644 --- a/prisma/generated/prisma/internal/prismaNamespace.ts +++ b/prisma/generated/prisma/internal/prismaNamespace.ts @@ -828,6 +828,7 @@ export const UserScalarFieldEnum = { maxXp: 'maxXp', avatar: 'avatar', bio: 'bio', + characterClass: 'characterClass', createdAt: 'createdAt', updatedAt: 'updatedAt' } as const @@ -928,6 +929,13 @@ export type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'In +/** + * Reference to a field of type 'CharacterClass' + */ +export type EnumCharacterClassFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'CharacterClass'> + + + /** * Reference to a field of type 'DateTime' */ diff --git a/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts b/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts index acc78a9..1c0cb95 100644 --- a/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -85,6 +85,7 @@ export const UserScalarFieldEnum = { maxXp: 'maxXp', avatar: 'avatar', bio: 'bio', + characterClass: 'characterClass', createdAt: 'createdAt', updatedAt: 'updatedAt' } as const diff --git a/prisma/generated/prisma/models/User.ts b/prisma/generated/prisma/models/User.ts index a4d10f0..f091c98 100644 --- a/prisma/generated/prisma/models/User.ts +++ b/prisma/generated/prisma/models/User.ts @@ -58,6 +58,7 @@ export type UserMinAggregateOutputType = { maxXp: number | null avatar: string | null bio: string | null + characterClass: $Enums.CharacterClass | null createdAt: Date | null updatedAt: Date | null } @@ -76,6 +77,7 @@ export type UserMaxAggregateOutputType = { maxXp: number | null avatar: string | null bio: string | null + characterClass: $Enums.CharacterClass | null createdAt: Date | null updatedAt: Date | null } @@ -94,6 +96,7 @@ export type UserCountAggregateOutputType = { maxXp: number avatar: number bio: number + characterClass: number createdAt: number updatedAt: number _all: number @@ -132,6 +135,7 @@ export type UserMinAggregateInputType = { maxXp?: true avatar?: true bio?: true + characterClass?: true createdAt?: true updatedAt?: true } @@ -150,6 +154,7 @@ export type UserMaxAggregateInputType = { maxXp?: true avatar?: true bio?: true + characterClass?: true createdAt?: true updatedAt?: true } @@ -168,6 +173,7 @@ export type UserCountAggregateInputType = { maxXp?: true avatar?: true bio?: true + characterClass?: true createdAt?: true updatedAt?: true _all?: true @@ -273,6 +279,7 @@ export type UserGroupByOutputType = { maxXp: number avatar: string | null bio: string | null + characterClass: $Enums.CharacterClass | null createdAt: Date updatedAt: Date _count: UserCountAggregateOutputType | null @@ -314,6 +321,7 @@ export type UserWhereInput = { maxXp?: Prisma.IntFilter<"User"> | number avatar?: Prisma.StringNullableFilter<"User"> | string | null bio?: Prisma.StringNullableFilter<"User"> | string | null + characterClass?: Prisma.EnumCharacterClassNullableFilter<"User"> | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string preferences?: Prisma.XOR | null @@ -334,6 +342,7 @@ export type UserOrderByWithRelationInput = { maxXp?: Prisma.SortOrder avatar?: Prisma.SortOrderInput | Prisma.SortOrder bio?: Prisma.SortOrderInput | Prisma.SortOrder + characterClass?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder preferences?: Prisma.UserPreferencesOrderByWithRelationInput @@ -357,6 +366,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{ maxXp?: Prisma.IntFilter<"User"> | number avatar?: Prisma.StringNullableFilter<"User"> | string | null bio?: Prisma.StringNullableFilter<"User"> | string | null + characterClass?: Prisma.EnumCharacterClassNullableFilter<"User"> | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string preferences?: Prisma.XOR | null @@ -377,6 +387,7 @@ export type UserOrderByWithAggregationInput = { maxXp?: Prisma.SortOrder avatar?: Prisma.SortOrderInput | Prisma.SortOrder bio?: Prisma.SortOrderInput | Prisma.SortOrder + characterClass?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder _count?: Prisma.UserCountOrderByAggregateInput @@ -403,6 +414,7 @@ export type UserScalarWhereWithAggregatesInput = { maxXp?: Prisma.IntWithAggregatesFilter<"User"> | number avatar?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null bio?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null + characterClass?: Prisma.EnumCharacterClassNullableWithAggregatesFilter<"User"> | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string } @@ -421,6 +433,7 @@ export type UserCreateInput = { maxXp?: number avatar?: string | null bio?: string | null + characterClass?: $Enums.CharacterClass | null createdAt?: Date | string updatedAt?: Date | string preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput @@ -441,6 +454,7 @@ export type UserUncheckedCreateInput = { maxXp?: number avatar?: string | null bio?: string | null + characterClass?: $Enums.CharacterClass | null createdAt?: Date | string updatedAt?: Date | string preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput @@ -461,6 +475,7 @@ export type UserUpdateInput = { maxXp?: Prisma.IntFieldUpdateOperationsInput | number avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput @@ -481,6 +496,7 @@ export type UserUncheckedUpdateInput = { maxXp?: Prisma.IntFieldUpdateOperationsInput | number avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput @@ -501,6 +517,7 @@ export type UserCreateManyInput = { maxXp?: number avatar?: string | null bio?: string | null + characterClass?: $Enums.CharacterClass | null createdAt?: Date | string updatedAt?: Date | string } @@ -519,6 +536,7 @@ export type UserUpdateManyMutationInput = { maxXp?: Prisma.IntFieldUpdateOperationsInput | number avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -537,6 +555,7 @@ export type UserUncheckedUpdateManyInput = { maxXp?: Prisma.IntFieldUpdateOperationsInput | number avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -555,6 +574,7 @@ export type UserCountOrderByAggregateInput = { maxXp?: Prisma.SortOrder avatar?: Prisma.SortOrder bio?: Prisma.SortOrder + characterClass?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -582,6 +602,7 @@ export type UserMaxOrderByAggregateInput = { maxXp?: Prisma.SortOrder avatar?: Prisma.SortOrder bio?: Prisma.SortOrder + characterClass?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -600,6 +621,7 @@ export type UserMinOrderByAggregateInput = { maxXp?: Prisma.SortOrder avatar?: Prisma.SortOrder bio?: Prisma.SortOrder + characterClass?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -638,6 +660,10 @@ export type NullableStringFieldUpdateOperationsInput = { set?: string | null } +export type NullableEnumCharacterClassFieldUpdateOperationsInput = { + set?: $Enums.CharacterClass | null +} + export type DateTimeFieldUpdateOperationsInput = { set?: Date | string } @@ -684,6 +710,7 @@ export type UserCreateWithoutPreferencesInput = { maxXp?: number avatar?: string | null bio?: string | null + characterClass?: $Enums.CharacterClass | null createdAt?: Date | string updatedAt?: Date | string eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput @@ -703,6 +730,7 @@ export type UserUncheckedCreateWithoutPreferencesInput = { maxXp?: number avatar?: string | null bio?: string | null + characterClass?: $Enums.CharacterClass | null createdAt?: Date | string updatedAt?: Date | string eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput @@ -738,6 +766,7 @@ export type UserUpdateWithoutPreferencesInput = { maxXp?: Prisma.IntFieldUpdateOperationsInput | number avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput @@ -757,6 +786,7 @@ export type UserUncheckedUpdateWithoutPreferencesInput = { maxXp?: Prisma.IntFieldUpdateOperationsInput | number avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput @@ -776,6 +806,7 @@ export type UserCreateWithoutEventRegistrationsInput = { maxXp?: number avatar?: string | null bio?: string | null + characterClass?: $Enums.CharacterClass | null createdAt?: Date | string updatedAt?: Date | string preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput @@ -795,6 +826,7 @@ export type UserUncheckedCreateWithoutEventRegistrationsInput = { maxXp?: number avatar?: string | null bio?: string | null + characterClass?: $Enums.CharacterClass | null createdAt?: Date | string updatedAt?: Date | string preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput @@ -830,6 +862,7 @@ export type UserUpdateWithoutEventRegistrationsInput = { maxXp?: Prisma.IntFieldUpdateOperationsInput | number avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput @@ -849,6 +882,7 @@ export type UserUncheckedUpdateWithoutEventRegistrationsInput = { maxXp?: Prisma.IntFieldUpdateOperationsInput | number avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput @@ -899,6 +933,7 @@ export type UserSelect @@ -920,6 +955,7 @@ export type UserSelectCreateManyAndReturn @@ -938,6 +974,7 @@ export type UserSelectUpdateManyAndReturn @@ -956,11 +993,12 @@ export type UserSelectScalar = { maxXp?: boolean avatar?: boolean bio?: boolean + characterClass?: boolean createdAt?: boolean updatedAt?: boolean } -export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "email" | "password" | "username" | "role" | "score" | "level" | "hp" | "maxHp" | "xp" | "maxXp" | "avatar" | "bio" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]> +export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "email" | "password" | "username" | "role" | "score" | "level" | "hp" | "maxHp" | "xp" | "maxXp" | "avatar" | "bio" | "characterClass" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]> export type UserInclude = { preferences?: boolean | Prisma.User$preferencesArgs eventRegistrations?: boolean | Prisma.User$eventRegistrationsArgs @@ -989,6 +1027,7 @@ export type $UserPayload @@ -1429,6 +1468,7 @@ export interface UserFieldRefs { readonly maxXp: Prisma.FieldRef<"User", 'Int'> readonly avatar: Prisma.FieldRef<"User", 'String'> readonly bio: Prisma.FieldRef<"User", 'String'> + readonly characterClass: Prisma.FieldRef<"User", 'CharacterClass'> readonly createdAt: Prisma.FieldRef<"User", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"User", 'DateTime'> } diff --git a/prisma/migrations/20251209210032_add_character_class/migration.sql b/prisma/migrations/20251209210032_add_character_class/migration.sql new file mode 100644 index 0000000..0666ad7 --- /dev/null +++ b/prisma/migrations/20251209210032_add_character_class/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "characterClass" TEXT; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4d7efdc..0d5fbfd 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -28,6 +28,19 @@ enum EventStatus { PAST } +enum CharacterClass { + WARRIOR + MAGE + ROGUE + RANGER + PALADIN + ENGINEER + MERCHANT + SCHOLAR + BERSERKER + NECROMANCER +} + model User { id String @id @default(cuid()) email String @unique @@ -42,6 +55,7 @@ model User { maxXp Int @default(5000) avatar String? bio String? + characterClass CharacterClass? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt preferences UserPreferences?