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?