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?