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.
This commit is contained in:
@@ -37,4 +37,3 @@ pnpm start
|
|||||||
- React 18
|
- React 18
|
||||||
- TypeScript
|
- TypeScript
|
||||||
- Tailwind CSS
|
- Tailwind CSS
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ export async function GET() {
|
|||||||
level: true,
|
level: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
bio: true,
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ export async function GET() {
|
|||||||
level: number;
|
level: number;
|
||||||
avatar: string | null;
|
avatar: string | null;
|
||||||
bio: string | null;
|
bio: string | null;
|
||||||
|
characterClass: string | null;
|
||||||
},
|
},
|
||||||
index: number
|
index: number
|
||||||
) => ({
|
) => ({
|
||||||
@@ -36,6 +38,7 @@ export async function GET() {
|
|||||||
level: user.level,
|
level: user.level,
|
||||||
avatar: user.avatar,
|
avatar: user.avatar,
|
||||||
bio: user.bio,
|
bio: user.bio,
|
||||||
|
characterClass: user.characterClass,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { auth } from "@/lib/auth";
|
import { auth } from "@/lib/auth";
|
||||||
import { prisma } from "@/lib/prisma";
|
import { prisma } from "@/lib/prisma";
|
||||||
|
import { CharacterClass } from "@/prisma/generated/prisma/enums";
|
||||||
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
try {
|
try {
|
||||||
@@ -18,6 +19,7 @@ export async function GET() {
|
|||||||
username: true,
|
username: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
bio: true,
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
hp: true,
|
hp: true,
|
||||||
maxHp: true,
|
maxHp: true,
|
||||||
xp: true,
|
xp: true,
|
||||||
@@ -51,7 +53,7 @@ export async function PUT(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const body = await request.json();
|
const body = await request.json();
|
||||||
const { username, avatar, bio } = body;
|
const { username, avatar, bio, characterClass } = body;
|
||||||
|
|
||||||
// Validation
|
// Validation
|
||||||
if (username !== undefined) {
|
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
|
// 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) {
|
if (username !== undefined) {
|
||||||
updateData.username = username.trim();
|
updateData.username = username.trim();
|
||||||
}
|
}
|
||||||
@@ -112,6 +141,9 @@ export async function PUT(request: Request) {
|
|||||||
if (bio !== undefined) {
|
if (bio !== undefined) {
|
||||||
updateData.bio = bio.trim() || null;
|
updateData.bio = bio.trim() || null;
|
||||||
}
|
}
|
||||||
|
if (characterClass !== undefined) {
|
||||||
|
updateData.characterClass = (characterClass as CharacterClass) || null;
|
||||||
|
}
|
||||||
|
|
||||||
const updatedUser = await prisma.user.update({
|
const updatedUser = await prisma.user.update({
|
||||||
where: { id: session.user.id },
|
where: { id: session.user.id },
|
||||||
@@ -122,6 +154,7 @@ export async function PUT(request: Request) {
|
|||||||
username: true,
|
username: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
bio: true,
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
hp: true,
|
hp: true,
|
||||||
maxHp: true,
|
maxHp: true,
|
||||||
xp: true,
|
xp: true,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ interface LeaderboardEntry {
|
|||||||
level: number;
|
level: number;
|
||||||
avatar: string | null;
|
avatar: string | null;
|
||||||
bio: string | null;
|
bio: string | null;
|
||||||
|
characterClass: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function LeaderboardPage() {
|
export default async function LeaderboardPage() {
|
||||||
@@ -25,6 +26,7 @@ export default async function LeaderboardPage() {
|
|||||||
level: true,
|
level: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
bio: true,
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -35,6 +37,7 @@ export default async function LeaderboardPage() {
|
|||||||
level: user.level,
|
level: user.level,
|
||||||
avatar: user.avatar,
|
avatar: user.avatar,
|
||||||
bio: user.bio,
|
bio: user.bio,
|
||||||
|
characterClass: user.characterClass,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const backgroundImage = await getBackgroundImage(
|
const backgroundImage = await getBackgroundImage(
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export default async function ProfilePage() {
|
|||||||
username: true,
|
username: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
bio: true,
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
hp: true,
|
hp: true,
|
||||||
maxHp: true,
|
maxHp: true,
|
||||||
xp: true,
|
xp: true,
|
||||||
@@ -34,13 +35,24 @@ export default async function ProfilePage() {
|
|||||||
redirect("/login");
|
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 (
|
return (
|
||||||
<main className="min-h-screen bg-black relative">
|
<main className="min-h-screen bg-black relative">
|
||||||
<NavigationWrapper />
|
<NavigationWrapper />
|
||||||
<ProfileForm initialProfile={user} backgroundImage={backgroundImage} />
|
<ProfileForm
|
||||||
|
initialProfile={userProfile}
|
||||||
|
backgroundImage={backgroundImage}
|
||||||
|
/>
|
||||||
</main>
|
</main>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ interface LeaderboardEntry {
|
|||||||
level: number;
|
level: number;
|
||||||
avatar?: string | null;
|
avatar?: string | null;
|
||||||
bio?: string | null;
|
bio?: string | null;
|
||||||
|
characterClass?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format number with consistent locale to avoid hydration mismatch
|
// Format number with consistent locale to avoid hydration mismatch
|
||||||
@@ -82,12 +83,71 @@ export default function Leaderboard() {
|
|||||||
{entry.rank}
|
{entry.rank}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-span-5 flex items-center relative group">
|
<div className="col-span-5 flex items-center gap-2 relative group">
|
||||||
<span className="font-bold text-pixel-gold cursor-pointer relative z-10">
|
<span className="font-bold text-pixel-gold cursor-pointer relative z-10">
|
||||||
{entry.username}
|
{entry.username}
|
||||||
</span>
|
</span>
|
||||||
{entry.bio && (
|
{entry.characterClass && (
|
||||||
|
<span className="text-xs text-gray-400 uppercase tracking-wider">
|
||||||
|
[{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"}
|
||||||
|
]
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
{(entry.bio || entry.characterClass) && (
|
||||||
<div className="absolute left-0 top-full mt-1 z-[100] w-72 p-4 bg-black border-2 border-pixel-gold/70 rounded-lg shadow-2xl opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 pointer-events-none">
|
<div className="absolute left-0 top-full mt-1 z-[100] w-72 p-4 bg-black border-2 border-pixel-gold/70 rounded-lg shadow-2xl opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 pointer-events-none">
|
||||||
|
{entry.characterClass && (
|
||||||
|
<div className="mb-3">
|
||||||
|
<div className="text-xs text-pixel-gold uppercase tracking-widest mb-1 font-bold">
|
||||||
|
Classe
|
||||||
|
</div>
|
||||||
|
<div className="text-sm text-gray-200 flex items-center gap-2">
|
||||||
|
<span>
|
||||||
|
{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" && "💀"}
|
||||||
|
</span>
|
||||||
|
<span className="uppercase tracking-wider">
|
||||||
|
{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"}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{entry.bio && (
|
||||||
|
<>
|
||||||
|
{entry.characterClass && (
|
||||||
|
<div className="border-b border-pixel-gold/30 mb-3 pb-3"></div>
|
||||||
|
)}
|
||||||
|
<div>
|
||||||
<div className="text-xs text-pixel-gold uppercase tracking-widest mb-2 border-b border-pixel-gold/30 pb-1 font-bold">
|
<div className="text-xs text-pixel-gold uppercase tracking-widest mb-2 border-b border-pixel-gold/30 pb-1 font-bold">
|
||||||
Bio
|
Bio
|
||||||
</div>
|
</div>
|
||||||
@@ -95,6 +155,9 @@ export default function Leaderboard() {
|
|||||||
{entry.bio}
|
{entry.bio}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="col-span-3 text-right flex items-center justify-end">
|
<div className="col-span-3 text-right flex items-center justify-end">
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ interface LeaderboardEntry {
|
|||||||
level: number;
|
level: number;
|
||||||
avatar?: string | null;
|
avatar?: string | null;
|
||||||
bio?: string | null;
|
bio?: string | null;
|
||||||
|
characterClass?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LeaderboardSectionProps {
|
interface LeaderboardSectionProps {
|
||||||
@@ -119,11 +120,68 @@ export default function LeaderboardSection({
|
|||||||
>
|
>
|
||||||
{entry.username}
|
{entry.username}
|
||||||
</span>
|
</span>
|
||||||
|
{entry.characterClass && (
|
||||||
|
<span className="text-xs text-gray-400 uppercase tracking-wider">
|
||||||
|
[{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" && "💀"}]
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
{entry.rank <= 3 && (
|
{entry.rank <= 3 && (
|
||||||
<span className="text-pixel-gold text-xs">✦</span>
|
<span className="text-pixel-gold text-xs">✦</span>
|
||||||
)}
|
)}
|
||||||
{entry.bio && (
|
{(entry.bio || entry.characterClass) && (
|
||||||
<div className="absolute left-0 top-full mt-1 z-[100] w-72 p-4 bg-black border-2 border-pixel-gold/70 rounded-lg shadow-2xl opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 pointer-events-none">
|
<div className="absolute left-0 top-full mt-1 z-[100] w-72 p-4 bg-black border-2 border-pixel-gold/70 rounded-lg shadow-2xl opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 pointer-events-none">
|
||||||
|
{entry.characterClass && (
|
||||||
|
<div className="mb-3">
|
||||||
|
<div className="text-xs text-pixel-gold uppercase tracking-widest mb-1 font-bold">
|
||||||
|
Classe
|
||||||
|
</div>
|
||||||
|
<div className="text-sm text-gray-200 flex items-center gap-2">
|
||||||
|
<span>
|
||||||
|
{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" && "💀"}
|
||||||
|
</span>
|
||||||
|
<span className="uppercase tracking-wider">
|
||||||
|
{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"}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{entry.bio && (
|
||||||
|
<>
|
||||||
|
{entry.characterClass && (
|
||||||
|
<div className="border-b border-pixel-gold/30 mb-3 pb-3"></div>
|
||||||
|
)}
|
||||||
|
<div>
|
||||||
<div className="text-xs text-pixel-gold uppercase tracking-widest mb-2 border-b border-pixel-gold/30 pb-1 font-bold">
|
<div className="text-xs text-pixel-gold uppercase tracking-widest mb-2 border-b border-pixel-gold/30 pb-1 font-bold">
|
||||||
Bio
|
Bio
|
||||||
</div>
|
</div>
|
||||||
@@ -131,6 +189,9 @@ export default function LeaderboardSection({
|
|||||||
{entry.bio}
|
{entry.bio}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,26 @@
|
|||||||
import { useState, useRef } from "react";
|
import { useState, useRef } from "react";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
|
|
||||||
|
type CharacterClass =
|
||||||
|
| "WARRIOR"
|
||||||
|
| "MAGE"
|
||||||
|
| "ROGUE"
|
||||||
|
| "RANGER"
|
||||||
|
| "PALADIN"
|
||||||
|
| "ENGINEER"
|
||||||
|
| "MERCHANT"
|
||||||
|
| "SCHOLAR"
|
||||||
|
| "BERSERKER"
|
||||||
|
| "NECROMANCER"
|
||||||
|
| null;
|
||||||
|
|
||||||
interface UserProfile {
|
interface UserProfile {
|
||||||
id: string;
|
id: string;
|
||||||
email: string;
|
email: string;
|
||||||
username: string;
|
username: string;
|
||||||
avatar: string | null;
|
avatar: string | null;
|
||||||
bio: string | null;
|
bio: string | null;
|
||||||
|
characterClass: CharacterClass;
|
||||||
hp: number;
|
hp: number;
|
||||||
maxHp: number;
|
maxHp: number;
|
||||||
xp: number;
|
xp: number;
|
||||||
@@ -40,6 +54,9 @@ export default function ProfileForm({
|
|||||||
const [username, setUsername] = useState(initialProfile.username);
|
const [username, setUsername] = useState(initialProfile.username);
|
||||||
const [avatar, setAvatar] = useState<string | null>(initialProfile.avatar);
|
const [avatar, setAvatar] = useState<string | null>(initialProfile.avatar);
|
||||||
const [bio, setBio] = useState<string | null>(initialProfile.bio || null);
|
const [bio, setBio] = useState<string | null>(initialProfile.bio || null);
|
||||||
|
const [characterClass, setCharacterClass] = useState<CharacterClass>(
|
||||||
|
initialProfile.characterClass || null
|
||||||
|
);
|
||||||
const fileInputRef = useRef<HTMLInputElement>(null);
|
const fileInputRef = useRef<HTMLInputElement>(null);
|
||||||
const [uploadingAvatar, setUploadingAvatar] = useState(false);
|
const [uploadingAvatar, setUploadingAvatar] = useState(false);
|
||||||
|
|
||||||
@@ -102,6 +119,7 @@ export default function ProfileForm({
|
|||||||
username,
|
username,
|
||||||
avatar,
|
avatar,
|
||||||
bio,
|
bio,
|
||||||
|
characterClass,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -109,6 +127,7 @@ export default function ProfileForm({
|
|||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
setProfile(data);
|
setProfile(data);
|
||||||
setBio(data.bio || null);
|
setBio(data.bio || null);
|
||||||
|
setCharacterClass(data.characterClass || null);
|
||||||
setSuccess("Profil mis à jour avec succès");
|
setSuccess("Profil mis à jour avec succès");
|
||||||
setTimeout(() => setSuccess(null), 3000);
|
setTimeout(() => setSuccess(null), 3000);
|
||||||
} else {
|
} else {
|
||||||
@@ -338,6 +357,111 @@ export default function ProfileForm({
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Character Class Selection */}
|
||||||
|
<div>
|
||||||
|
<label className="block text-pixel-gold text-sm uppercase tracking-widest mb-3">
|
||||||
|
Classe de Personnage
|
||||||
|
</label>
|
||||||
|
<div className="grid grid-cols-2 md:grid-cols-3 gap-3">
|
||||||
|
{[
|
||||||
|
{
|
||||||
|
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) => (
|
||||||
|
<button
|
||||||
|
key={cls.value}
|
||||||
|
type="button"
|
||||||
|
onClick={() =>
|
||||||
|
setCharacterClass(cls.value as CharacterClass)
|
||||||
|
}
|
||||||
|
className={`p-4 border-2 rounded-lg text-left transition-all ${
|
||||||
|
characterClass === cls.value
|
||||||
|
? "border-pixel-gold bg-pixel-gold/20 shadow-lg shadow-pixel-gold/30"
|
||||||
|
: "border-pixel-gold/30 bg-black/40 hover:border-pixel-gold/50 hover:bg-black/60"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-2 mb-1">
|
||||||
|
<span className="text-2xl">{cls.icon}</span>
|
||||||
|
<span
|
||||||
|
className={`font-bold text-sm uppercase tracking-wider ${
|
||||||
|
characterClass === cls.value
|
||||||
|
? "text-pixel-gold"
|
||||||
|
: "text-white"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{cls.name}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="text-xs text-gray-400 leading-tight">
|
||||||
|
{cls.desc}
|
||||||
|
</p>
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
{characterClass && (
|
||||||
|
<p className="text-pixel-gold text-xs mt-2 uppercase tracking-widest">
|
||||||
|
✓ Classe sélectionnée
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Stats Display */}
|
{/* Stats Display */}
|
||||||
<div className="border-t border-pixel-gold/20 pt-6">
|
<div className="border-t border-pixel-gold/20 pt-6">
|
||||||
<h3 className="text-pixel-gold text-sm uppercase tracking-widest mb-4">
|
<h3 className="text-pixel-gold text-sm uppercase tracking-widest mb-4">
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export async function getBackgroundImage(
|
|||||||
const imageKey = `${page}Background` as keyof typeof sitePreferences;
|
const imageKey = `${page}Background` as keyof typeof sitePreferences;
|
||||||
const customImage = sitePreferences[imageKey];
|
const customImage = sitePreferences[imageKey];
|
||||||
|
|
||||||
return customImage || defaultImage;
|
return (customImage as string | null) || defaultImage;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error fetching background image:", error);
|
console.error("Error fetching background image:", error);
|
||||||
return defaultImage;
|
return defaultImage;
|
||||||
|
|||||||
@@ -60,6 +60,13 @@ export type StringNullableFilter<$PrismaModel = never> = {
|
|||||||
not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null
|
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> = {
|
export type DateTimeFilter<$PrismaModel = never> = {
|
||||||
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
|
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
|
||||||
in?: Date[] | string[]
|
in?: Date[] | string[]
|
||||||
@@ -136,6 +143,16 @@ export type StringNullableWithAggregatesFilter<$PrismaModel = never> = {
|
|||||||
_max?: Prisma.NestedStringNullableFilter<$PrismaModel>
|
_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> = {
|
export type DateTimeWithAggregatesFilter<$PrismaModel = never> = {
|
||||||
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
|
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
|
||||||
in?: Date[] | string[]
|
in?: Date[] | string[]
|
||||||
@@ -230,6 +247,13 @@ export type NestedStringNullableFilter<$PrismaModel = never> = {
|
|||||||
not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null
|
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> = {
|
export type NestedDateTimeFilter<$PrismaModel = never> = {
|
||||||
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
|
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
|
||||||
in?: Date[] | string[]
|
in?: Date[] | string[]
|
||||||
@@ -323,6 +347,16 @@ export type NestedIntNullableFilter<$PrismaModel = never> = {
|
|||||||
not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null
|
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> = {
|
export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = {
|
||||||
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
|
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
|
||||||
in?: Date[] | string[]
|
in?: Date[] | string[]
|
||||||
|
|||||||
@@ -34,3 +34,19 @@ export const EventStatus = {
|
|||||||
} as const
|
} as const
|
||||||
|
|
||||||
export type EventStatus = (typeof EventStatus)[keyof typeof EventStatus]
|
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]
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
|
|||||||
"clientVersion": "7.1.0",
|
"clientVersion": "7.1.0",
|
||||||
"engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba",
|
"engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba",
|
||||||
"activeProvider": "sqlite",
|
"activeProvider": "sqlite",
|
||||||
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n SUMMIT\n LAUNCH\n FESTIVAL\n COMPETITION\n}\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": {
|
"runtimeDataModel": {
|
||||||
"models": {},
|
"models": {},
|
||||||
"enums": {},
|
"enums": {},
|
||||||
@@ -28,7 +28,7 @@ const config: runtime.GetPrismaClientConfig = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"username\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"score\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"level\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"hp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxHp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"xp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxXp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"avatar\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"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<WebAssembly.Module> {
|
async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
|
||||||
const { Buffer } = await import('node:buffer')
|
const { Buffer } = await import('node:buffer')
|
||||||
|
|||||||
@@ -828,6 +828,7 @@ export const UserScalarFieldEnum = {
|
|||||||
maxXp: 'maxXp',
|
maxXp: 'maxXp',
|
||||||
avatar: 'avatar',
|
avatar: 'avatar',
|
||||||
bio: 'bio',
|
bio: 'bio',
|
||||||
|
characterClass: 'characterClass',
|
||||||
createdAt: 'createdAt',
|
createdAt: 'createdAt',
|
||||||
updatedAt: 'updatedAt'
|
updatedAt: 'updatedAt'
|
||||||
} as const
|
} 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'
|
* Reference to a field of type 'DateTime'
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ export const UserScalarFieldEnum = {
|
|||||||
maxXp: 'maxXp',
|
maxXp: 'maxXp',
|
||||||
avatar: 'avatar',
|
avatar: 'avatar',
|
||||||
bio: 'bio',
|
bio: 'bio',
|
||||||
|
characterClass: 'characterClass',
|
||||||
createdAt: 'createdAt',
|
createdAt: 'createdAt',
|
||||||
updatedAt: 'updatedAt'
|
updatedAt: 'updatedAt'
|
||||||
} as const
|
} as const
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ export type UserMinAggregateOutputType = {
|
|||||||
maxXp: number | null
|
maxXp: number | null
|
||||||
avatar: string | null
|
avatar: string | null
|
||||||
bio: string | null
|
bio: string | null
|
||||||
|
characterClass: $Enums.CharacterClass | null
|
||||||
createdAt: Date | null
|
createdAt: Date | null
|
||||||
updatedAt: Date | null
|
updatedAt: Date | null
|
||||||
}
|
}
|
||||||
@@ -76,6 +77,7 @@ export type UserMaxAggregateOutputType = {
|
|||||||
maxXp: number | null
|
maxXp: number | null
|
||||||
avatar: string | null
|
avatar: string | null
|
||||||
bio: string | null
|
bio: string | null
|
||||||
|
characterClass: $Enums.CharacterClass | null
|
||||||
createdAt: Date | null
|
createdAt: Date | null
|
||||||
updatedAt: Date | null
|
updatedAt: Date | null
|
||||||
}
|
}
|
||||||
@@ -94,6 +96,7 @@ export type UserCountAggregateOutputType = {
|
|||||||
maxXp: number
|
maxXp: number
|
||||||
avatar: number
|
avatar: number
|
||||||
bio: number
|
bio: number
|
||||||
|
characterClass: number
|
||||||
createdAt: number
|
createdAt: number
|
||||||
updatedAt: number
|
updatedAt: number
|
||||||
_all: number
|
_all: number
|
||||||
@@ -132,6 +135,7 @@ export type UserMinAggregateInputType = {
|
|||||||
maxXp?: true
|
maxXp?: true
|
||||||
avatar?: true
|
avatar?: true
|
||||||
bio?: true
|
bio?: true
|
||||||
|
characterClass?: true
|
||||||
createdAt?: true
|
createdAt?: true
|
||||||
updatedAt?: true
|
updatedAt?: true
|
||||||
}
|
}
|
||||||
@@ -150,6 +154,7 @@ export type UserMaxAggregateInputType = {
|
|||||||
maxXp?: true
|
maxXp?: true
|
||||||
avatar?: true
|
avatar?: true
|
||||||
bio?: true
|
bio?: true
|
||||||
|
characterClass?: true
|
||||||
createdAt?: true
|
createdAt?: true
|
||||||
updatedAt?: true
|
updatedAt?: true
|
||||||
}
|
}
|
||||||
@@ -168,6 +173,7 @@ export type UserCountAggregateInputType = {
|
|||||||
maxXp?: true
|
maxXp?: true
|
||||||
avatar?: true
|
avatar?: true
|
||||||
bio?: true
|
bio?: true
|
||||||
|
characterClass?: true
|
||||||
createdAt?: true
|
createdAt?: true
|
||||||
updatedAt?: true
|
updatedAt?: true
|
||||||
_all?: true
|
_all?: true
|
||||||
@@ -273,6 +279,7 @@ export type UserGroupByOutputType = {
|
|||||||
maxXp: number
|
maxXp: number
|
||||||
avatar: string | null
|
avatar: string | null
|
||||||
bio: string | null
|
bio: string | null
|
||||||
|
characterClass: $Enums.CharacterClass | null
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
updatedAt: Date
|
updatedAt: Date
|
||||||
_count: UserCountAggregateOutputType | null
|
_count: UserCountAggregateOutputType | null
|
||||||
@@ -314,6 +321,7 @@ export type UserWhereInput = {
|
|||||||
maxXp?: Prisma.IntFilter<"User"> | number
|
maxXp?: Prisma.IntFilter<"User"> | number
|
||||||
avatar?: Prisma.StringNullableFilter<"User"> | string | null
|
avatar?: Prisma.StringNullableFilter<"User"> | string | null
|
||||||
bio?: Prisma.StringNullableFilter<"User"> | string | null
|
bio?: Prisma.StringNullableFilter<"User"> | string | null
|
||||||
|
characterClass?: Prisma.EnumCharacterClassNullableFilter<"User"> | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
||||||
preferences?: Prisma.XOR<Prisma.UserPreferencesNullableScalarRelationFilter, Prisma.UserPreferencesWhereInput> | null
|
preferences?: Prisma.XOR<Prisma.UserPreferencesNullableScalarRelationFilter, Prisma.UserPreferencesWhereInput> | null
|
||||||
@@ -334,6 +342,7 @@ export type UserOrderByWithRelationInput = {
|
|||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrderInput | Prisma.SortOrder
|
avatar?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
bio?: Prisma.SortOrderInput | Prisma.SortOrder
|
bio?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
|
characterClass?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
createdAt?: Prisma.SortOrder
|
createdAt?: Prisma.SortOrder
|
||||||
updatedAt?: Prisma.SortOrder
|
updatedAt?: Prisma.SortOrder
|
||||||
preferences?: Prisma.UserPreferencesOrderByWithRelationInput
|
preferences?: Prisma.UserPreferencesOrderByWithRelationInput
|
||||||
@@ -357,6 +366,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{
|
|||||||
maxXp?: Prisma.IntFilter<"User"> | number
|
maxXp?: Prisma.IntFilter<"User"> | number
|
||||||
avatar?: Prisma.StringNullableFilter<"User"> | string | null
|
avatar?: Prisma.StringNullableFilter<"User"> | string | null
|
||||||
bio?: Prisma.StringNullableFilter<"User"> | string | null
|
bio?: Prisma.StringNullableFilter<"User"> | string | null
|
||||||
|
characterClass?: Prisma.EnumCharacterClassNullableFilter<"User"> | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
|
||||||
preferences?: Prisma.XOR<Prisma.UserPreferencesNullableScalarRelationFilter, Prisma.UserPreferencesWhereInput> | null
|
preferences?: Prisma.XOR<Prisma.UserPreferencesNullableScalarRelationFilter, Prisma.UserPreferencesWhereInput> | null
|
||||||
@@ -377,6 +387,7 @@ export type UserOrderByWithAggregationInput = {
|
|||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrderInput | Prisma.SortOrder
|
avatar?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
bio?: Prisma.SortOrderInput | Prisma.SortOrder
|
bio?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
|
characterClass?: Prisma.SortOrderInput | Prisma.SortOrder
|
||||||
createdAt?: Prisma.SortOrder
|
createdAt?: Prisma.SortOrder
|
||||||
updatedAt?: Prisma.SortOrder
|
updatedAt?: Prisma.SortOrder
|
||||||
_count?: Prisma.UserCountOrderByAggregateInput
|
_count?: Prisma.UserCountOrderByAggregateInput
|
||||||
@@ -403,6 +414,7 @@ export type UserScalarWhereWithAggregatesInput = {
|
|||||||
maxXp?: Prisma.IntWithAggregatesFilter<"User"> | number
|
maxXp?: Prisma.IntWithAggregatesFilter<"User"> | number
|
||||||
avatar?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null
|
avatar?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null
|
||||||
bio?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null
|
bio?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null
|
||||||
|
characterClass?: Prisma.EnumCharacterClassNullableWithAggregatesFilter<"User"> | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string
|
createdAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string
|
||||||
updatedAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string
|
updatedAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string
|
||||||
}
|
}
|
||||||
@@ -421,6 +433,7 @@ export type UserCreateInput = {
|
|||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: string | null
|
||||||
bio?: string | null
|
bio?: string | null
|
||||||
|
characterClass?: $Enums.CharacterClass | null
|
||||||
createdAt?: Date | string
|
createdAt?: Date | string
|
||||||
updatedAt?: Date | string
|
updatedAt?: Date | string
|
||||||
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
|
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
|
||||||
@@ -441,6 +454,7 @@ export type UserUncheckedCreateInput = {
|
|||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: string | null
|
||||||
bio?: string | null
|
bio?: string | null
|
||||||
|
characterClass?: $Enums.CharacterClass | null
|
||||||
createdAt?: Date | string
|
createdAt?: Date | string
|
||||||
updatedAt?: Date | string
|
updatedAt?: Date | string
|
||||||
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
|
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
|
||||||
@@ -461,6 +475,7 @@ export type UserUpdateInput = {
|
|||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
|
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
|
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
|
||||||
@@ -481,6 +496,7 @@ export type UserUncheckedUpdateInput = {
|
|||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
|
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
|
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
|
||||||
@@ -501,6 +517,7 @@ export type UserCreateManyInput = {
|
|||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: string | null
|
||||||
bio?: string | null
|
bio?: string | null
|
||||||
|
characterClass?: $Enums.CharacterClass | null
|
||||||
createdAt?: Date | string
|
createdAt?: Date | string
|
||||||
updatedAt?: Date | string
|
updatedAt?: Date | string
|
||||||
}
|
}
|
||||||
@@ -519,6 +536,7 @@ export type UserUpdateManyMutationInput = {
|
|||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
|
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
}
|
}
|
||||||
@@ -537,6 +555,7 @@ export type UserUncheckedUpdateManyInput = {
|
|||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
|
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
}
|
}
|
||||||
@@ -555,6 +574,7 @@ export type UserCountOrderByAggregateInput = {
|
|||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrder
|
avatar?: Prisma.SortOrder
|
||||||
bio?: Prisma.SortOrder
|
bio?: Prisma.SortOrder
|
||||||
|
characterClass?: Prisma.SortOrder
|
||||||
createdAt?: Prisma.SortOrder
|
createdAt?: Prisma.SortOrder
|
||||||
updatedAt?: Prisma.SortOrder
|
updatedAt?: Prisma.SortOrder
|
||||||
}
|
}
|
||||||
@@ -582,6 +602,7 @@ export type UserMaxOrderByAggregateInput = {
|
|||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrder
|
avatar?: Prisma.SortOrder
|
||||||
bio?: Prisma.SortOrder
|
bio?: Prisma.SortOrder
|
||||||
|
characterClass?: Prisma.SortOrder
|
||||||
createdAt?: Prisma.SortOrder
|
createdAt?: Prisma.SortOrder
|
||||||
updatedAt?: Prisma.SortOrder
|
updatedAt?: Prisma.SortOrder
|
||||||
}
|
}
|
||||||
@@ -600,6 +621,7 @@ export type UserMinOrderByAggregateInput = {
|
|||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrder
|
avatar?: Prisma.SortOrder
|
||||||
bio?: Prisma.SortOrder
|
bio?: Prisma.SortOrder
|
||||||
|
characterClass?: Prisma.SortOrder
|
||||||
createdAt?: Prisma.SortOrder
|
createdAt?: Prisma.SortOrder
|
||||||
updatedAt?: Prisma.SortOrder
|
updatedAt?: Prisma.SortOrder
|
||||||
}
|
}
|
||||||
@@ -638,6 +660,10 @@ export type NullableStringFieldUpdateOperationsInput = {
|
|||||||
set?: string | null
|
set?: string | null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type NullableEnumCharacterClassFieldUpdateOperationsInput = {
|
||||||
|
set?: $Enums.CharacterClass | null
|
||||||
|
}
|
||||||
|
|
||||||
export type DateTimeFieldUpdateOperationsInput = {
|
export type DateTimeFieldUpdateOperationsInput = {
|
||||||
set?: Date | string
|
set?: Date | string
|
||||||
}
|
}
|
||||||
@@ -684,6 +710,7 @@ export type UserCreateWithoutPreferencesInput = {
|
|||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: string | null
|
||||||
bio?: string | null
|
bio?: string | null
|
||||||
|
characterClass?: $Enums.CharacterClass | null
|
||||||
createdAt?: Date | string
|
createdAt?: Date | string
|
||||||
updatedAt?: Date | string
|
updatedAt?: Date | string
|
||||||
eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput
|
eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput
|
||||||
@@ -703,6 +730,7 @@ export type UserUncheckedCreateWithoutPreferencesInput = {
|
|||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: string | null
|
||||||
bio?: string | null
|
bio?: string | null
|
||||||
|
characterClass?: $Enums.CharacterClass | null
|
||||||
createdAt?: Date | string
|
createdAt?: Date | string
|
||||||
updatedAt?: Date | string
|
updatedAt?: Date | string
|
||||||
eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput
|
eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput
|
||||||
@@ -738,6 +766,7 @@ export type UserUpdateWithoutPreferencesInput = {
|
|||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
|
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput
|
eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput
|
||||||
@@ -757,6 +786,7 @@ export type UserUncheckedUpdateWithoutPreferencesInput = {
|
|||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
|
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput
|
eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput
|
||||||
@@ -776,6 +806,7 @@ export type UserCreateWithoutEventRegistrationsInput = {
|
|||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: string | null
|
||||||
bio?: string | null
|
bio?: string | null
|
||||||
|
characterClass?: $Enums.CharacterClass | null
|
||||||
createdAt?: Date | string
|
createdAt?: Date | string
|
||||||
updatedAt?: Date | string
|
updatedAt?: Date | string
|
||||||
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
|
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
|
||||||
@@ -795,6 +826,7 @@ export type UserUncheckedCreateWithoutEventRegistrationsInput = {
|
|||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: string | null
|
||||||
bio?: string | null
|
bio?: string | null
|
||||||
|
characterClass?: $Enums.CharacterClass | null
|
||||||
createdAt?: Date | string
|
createdAt?: Date | string
|
||||||
updatedAt?: Date | string
|
updatedAt?: Date | string
|
||||||
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
|
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
|
||||||
@@ -830,6 +862,7 @@ export type UserUpdateWithoutEventRegistrationsInput = {
|
|||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
|
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
|
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
|
||||||
@@ -849,6 +882,7 @@ export type UserUncheckedUpdateWithoutEventRegistrationsInput = {
|
|||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
||||||
|
characterClass?: Prisma.NullableEnumCharacterClassFieldUpdateOperationsInput | $Enums.CharacterClass | null
|
||||||
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
|
||||||
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
|
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
|
||||||
@@ -899,6 +933,7 @@ export type UserSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = r
|
|||||||
maxXp?: boolean
|
maxXp?: boolean
|
||||||
avatar?: boolean
|
avatar?: boolean
|
||||||
bio?: boolean
|
bio?: boolean
|
||||||
|
characterClass?: boolean
|
||||||
createdAt?: boolean
|
createdAt?: boolean
|
||||||
updatedAt?: boolean
|
updatedAt?: boolean
|
||||||
preferences?: boolean | Prisma.User$preferencesArgs<ExtArgs>
|
preferences?: boolean | Prisma.User$preferencesArgs<ExtArgs>
|
||||||
@@ -920,6 +955,7 @@ export type UserSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensio
|
|||||||
maxXp?: boolean
|
maxXp?: boolean
|
||||||
avatar?: boolean
|
avatar?: boolean
|
||||||
bio?: boolean
|
bio?: boolean
|
||||||
|
characterClass?: boolean
|
||||||
createdAt?: boolean
|
createdAt?: boolean
|
||||||
updatedAt?: boolean
|
updatedAt?: boolean
|
||||||
}, ExtArgs["result"]["user"]>
|
}, ExtArgs["result"]["user"]>
|
||||||
@@ -938,6 +974,7 @@ export type UserSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensio
|
|||||||
maxXp?: boolean
|
maxXp?: boolean
|
||||||
avatar?: boolean
|
avatar?: boolean
|
||||||
bio?: boolean
|
bio?: boolean
|
||||||
|
characterClass?: boolean
|
||||||
createdAt?: boolean
|
createdAt?: boolean
|
||||||
updatedAt?: boolean
|
updatedAt?: boolean
|
||||||
}, ExtArgs["result"]["user"]>
|
}, ExtArgs["result"]["user"]>
|
||||||
@@ -956,11 +993,12 @@ export type UserSelectScalar = {
|
|||||||
maxXp?: boolean
|
maxXp?: boolean
|
||||||
avatar?: boolean
|
avatar?: boolean
|
||||||
bio?: boolean
|
bio?: boolean
|
||||||
|
characterClass?: boolean
|
||||||
createdAt?: boolean
|
createdAt?: boolean
|
||||||
updatedAt?: boolean
|
updatedAt?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export type UserOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = 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<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = 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<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
export type UserInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
|
||||||
preferences?: boolean | Prisma.User$preferencesArgs<ExtArgs>
|
preferences?: boolean | Prisma.User$preferencesArgs<ExtArgs>
|
||||||
eventRegistrations?: boolean | Prisma.User$eventRegistrationsArgs<ExtArgs>
|
eventRegistrations?: boolean | Prisma.User$eventRegistrationsArgs<ExtArgs>
|
||||||
@@ -989,6 +1027,7 @@ export type $UserPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
|
|||||||
maxXp: number
|
maxXp: number
|
||||||
avatar: string | null
|
avatar: string | null
|
||||||
bio: string | null
|
bio: string | null
|
||||||
|
characterClass: $Enums.CharacterClass | null
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
updatedAt: Date
|
updatedAt: Date
|
||||||
}, ExtArgs["result"]["user"]>
|
}, ExtArgs["result"]["user"]>
|
||||||
@@ -1429,6 +1468,7 @@ export interface UserFieldRefs {
|
|||||||
readonly maxXp: Prisma.FieldRef<"User", 'Int'>
|
readonly maxXp: Prisma.FieldRef<"User", 'Int'>
|
||||||
readonly avatar: Prisma.FieldRef<"User", 'String'>
|
readonly avatar: Prisma.FieldRef<"User", 'String'>
|
||||||
readonly bio: Prisma.FieldRef<"User", 'String'>
|
readonly bio: Prisma.FieldRef<"User", 'String'>
|
||||||
|
readonly characterClass: Prisma.FieldRef<"User", 'CharacterClass'>
|
||||||
readonly createdAt: Prisma.FieldRef<"User", 'DateTime'>
|
readonly createdAt: Prisma.FieldRef<"User", 'DateTime'>
|
||||||
readonly updatedAt: Prisma.FieldRef<"User", 'DateTime'>
|
readonly updatedAt: Prisma.FieldRef<"User", 'DateTime'>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "User" ADD COLUMN "characterClass" TEXT;
|
||||||
@@ -28,6 +28,19 @@ enum EventStatus {
|
|||||||
PAST
|
PAST
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum CharacterClass {
|
||||||
|
WARRIOR
|
||||||
|
MAGE
|
||||||
|
ROGUE
|
||||||
|
RANGER
|
||||||
|
PALADIN
|
||||||
|
ENGINEER
|
||||||
|
MERCHANT
|
||||||
|
SCHOLAR
|
||||||
|
BERSERKER
|
||||||
|
NECROMANCER
|
||||||
|
}
|
||||||
|
|
||||||
model User {
|
model User {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
email String @unique
|
email String @unique
|
||||||
@@ -42,6 +55,7 @@ model User {
|
|||||||
maxXp Int @default(5000)
|
maxXp Int @default(5000)
|
||||||
avatar String?
|
avatar String?
|
||||||
bio String?
|
bio String?
|
||||||
|
characterClass CharacterClass?
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
preferences UserPreferences?
|
preferences UserPreferences?
|
||||||
|
|||||||
Reference in New Issue
Block a user