Compare commits
2 Commits
16b0437ecb
...
b245be3bf4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b245be3bf4 | ||
|
|
3a0dd57bb6 |
@@ -37,4 +37,3 @@ pnpm start
|
|||||||
- React 18
|
- React 18
|
||||||
- TypeScript
|
- TypeScript
|
||||||
- Tailwind CSS
|
- Tailwind CSS
|
||||||
|
|
||||||
|
|||||||
@@ -14,16 +14,33 @@ export async function GET() {
|
|||||||
score: true,
|
score: true,
|
||||||
level: true,
|
level: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const leaderboard = users.map((user: { id: string; username: string; score: number; level: number; avatar: string | null }, index: number) => ({
|
const leaderboard = users.map(
|
||||||
rank: index + 1,
|
(
|
||||||
username: user.username,
|
user: {
|
||||||
score: user.score,
|
id: string;
|
||||||
level: user.level,
|
username: string;
|
||||||
avatar: user.avatar,
|
score: number;
|
||||||
}));
|
level: number;
|
||||||
|
avatar: string | null;
|
||||||
|
bio: string | null;
|
||||||
|
characterClass: string | null;
|
||||||
|
},
|
||||||
|
index: number
|
||||||
|
) => ({
|
||||||
|
rank: index + 1,
|
||||||
|
username: user.username,
|
||||||
|
score: user.score,
|
||||||
|
level: user.level,
|
||||||
|
avatar: user.avatar,
|
||||||
|
bio: user.bio,
|
||||||
|
characterClass: user.characterClass,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
return NextResponse.json(leaderboard);
|
return NextResponse.json(leaderboard);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -34,4 +51,3 @@ export async function GET() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
@@ -17,6 +18,8 @@ export async function GET() {
|
|||||||
email: true,
|
email: true,
|
||||||
username: true,
|
username: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
hp: true,
|
hp: true,
|
||||||
maxHp: true,
|
maxHp: true,
|
||||||
xp: true,
|
xp: true,
|
||||||
@@ -50,7 +53,7 @@ export async function PUT(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const body = await request.json();
|
const body = await request.json();
|
||||||
const { username, avatar } = body;
|
const { username, avatar, bio, characterClass } = body;
|
||||||
|
|
||||||
// Validation
|
// Validation
|
||||||
if (username !== undefined) {
|
if (username !== undefined) {
|
||||||
@@ -84,14 +87,63 @@ export async function PUT(request: Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validation bio
|
||||||
|
if (bio !== undefined) {
|
||||||
|
if (typeof bio !== "string") {
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: "La bio doit être une chaîne de caractères" },
|
||||||
|
{ status: 400 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (bio.length > 500) {
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: "La bio ne peut pas dépasser 500 caractères" },
|
||||||
|
{ status: 400 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 } = {};
|
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();
|
||||||
}
|
}
|
||||||
if (avatar !== undefined) {
|
if (avatar !== undefined) {
|
||||||
updateData.avatar = avatar || null;
|
updateData.avatar = avatar || null;
|
||||||
}
|
}
|
||||||
|
if (bio !== undefined) {
|
||||||
|
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 },
|
||||||
@@ -101,6 +153,8 @@ export async function PUT(request: Request) {
|
|||||||
email: true,
|
email: true,
|
||||||
username: true,
|
username: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
hp: true,
|
hp: true,
|
||||||
maxHp: true,
|
maxHp: true,
|
||||||
xp: true,
|
xp: true,
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ interface LeaderboardEntry {
|
|||||||
score: number;
|
score: number;
|
||||||
level: number;
|
level: number;
|
||||||
avatar: string | null;
|
avatar: string | null;
|
||||||
|
bio: string | null;
|
||||||
|
characterClass: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function LeaderboardPage() {
|
export default async function LeaderboardPage() {
|
||||||
@@ -23,6 +25,8 @@ export default async function LeaderboardPage() {
|
|||||||
score: true,
|
score: true,
|
||||||
level: true,
|
level: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -32,6 +36,8 @@ export default async function LeaderboardPage() {
|
|||||||
score: user.score,
|
score: user.score,
|
||||||
level: user.level,
|
level: user.level,
|
||||||
avatar: user.avatar,
|
avatar: user.avatar,
|
||||||
|
bio: user.bio,
|
||||||
|
characterClass: user.characterClass,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const backgroundImage = await getBackgroundImage(
|
const backgroundImage = await getBackgroundImage(
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ export default async function ProfilePage() {
|
|||||||
email: true,
|
email: true,
|
||||||
username: true,
|
username: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
|
bio: true,
|
||||||
|
characterClass: true,
|
||||||
hp: true,
|
hp: true,
|
||||||
maxHp: true,
|
maxHp: true,
|
||||||
xp: true,
|
xp: true,
|
||||||
@@ -33,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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ interface LeaderboardEntry {
|
|||||||
score: number;
|
score: number;
|
||||||
level: number;
|
level: number;
|
||||||
avatar?: string | null;
|
avatar?: 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
|
||||||
@@ -48,7 +50,7 @@ export default function Leaderboard() {
|
|||||||
LEADERBOARD
|
LEADERBOARD
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div className="bg-black/80 border-2 border-pixel-gold/30 rounded-lg overflow-hidden backdrop-blur-sm">
|
<div className="bg-black/80 border-2 border-pixel-gold/30 rounded-lg backdrop-blur-sm">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="bg-gray-900/80 border-b-2 border-pixel-gold/30 grid grid-cols-12 gap-4 p-4 font-bold text-sm text-gray-300">
|
<div className="bg-gray-900/80 border-b-2 border-pixel-gold/30 grid grid-cols-12 gap-4 p-4 font-bold text-sm text-gray-300">
|
||||||
<div className="col-span-1 text-center">Rank</div>
|
<div className="col-span-1 text-center">Rank</div>
|
||||||
@@ -58,11 +60,11 @@ export default function Leaderboard() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Entries */}
|
{/* Entries */}
|
||||||
<div className="divide-y divide-pixel-gold/10">
|
<div className="divide-y divide-pixel-gold/10 overflow-visible">
|
||||||
{leaderboard.map((entry) => (
|
{leaderboard.map((entry) => (
|
||||||
<div
|
<div
|
||||||
key={entry.rank}
|
key={entry.rank}
|
||||||
className={`grid grid-cols-12 gap-4 p-4 hover:bg-gray-900/50 transition ${
|
className={`grid grid-cols-12 gap-4 p-4 hover:bg-gray-900/50 transition relative ${
|
||||||
entry.rank <= 3 ? "bg-gray-950/50" : "bg-black/40"
|
entry.rank <= 3 ? "bg-gray-950/50" : "bg-black/40"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
@@ -81,10 +83,82 @@ export default function Leaderboard() {
|
|||||||
{entry.rank}
|
{entry.rank}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-span-5 flex items-center">
|
<div className="col-span-5 flex items-center gap-2 relative group">
|
||||||
<span className="font-bold text-pixel-gold">
|
<span className="font-bold text-pixel-gold cursor-pointer relative z-10">
|
||||||
{entry.username}
|
{entry.username}
|
||||||
</span>
|
</span>
|
||||||
|
{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">
|
||||||
|
{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">
|
||||||
|
Bio
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-gray-200 leading-relaxed whitespace-pre-wrap break-words">
|
||||||
|
{entry.bio}
|
||||||
|
</p>
|
||||||
|
</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">
|
||||||
<span className="font-mono text-gray-300">
|
<span className="font-mono text-gray-300">
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ interface LeaderboardEntry {
|
|||||||
score: number;
|
score: number;
|
||||||
level: number;
|
level: number;
|
||||||
avatar?: string | null;
|
avatar?: string | null;
|
||||||
|
bio?: string | null;
|
||||||
|
characterClass?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LeaderboardSectionProps {
|
interface LeaderboardSectionProps {
|
||||||
@@ -23,7 +25,7 @@ export default function LeaderboardSection({
|
|||||||
backgroundImage,
|
backgroundImage,
|
||||||
}: LeaderboardSectionProps) {
|
}: LeaderboardSectionProps) {
|
||||||
return (
|
return (
|
||||||
<section className="relative w-full min-h-screen flex flex-col items-center justify-center overflow-hidden pt-24 pb-16">
|
<section className="relative w-full min-h-screen flex flex-col items-center justify-center pt-24 pb-16">
|
||||||
{/* Background Image */}
|
{/* Background Image */}
|
||||||
<div
|
<div
|
||||||
className="absolute inset-0 bg-cover bg-center bg-no-repeat"
|
className="absolute inset-0 bg-cover bg-center bg-no-repeat"
|
||||||
@@ -57,7 +59,7 @@ export default function LeaderboardSection({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Leaderboard Table */}
|
{/* Leaderboard Table */}
|
||||||
<div className="bg-black/60 border border-pixel-gold/30 rounded-lg overflow-hidden backdrop-blur-sm">
|
<div className="bg-black/60 border border-pixel-gold/30 rounded-lg backdrop-blur-sm">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="bg-gray-900/80 border-b border-pixel-gold/30 grid grid-cols-12 gap-4 p-4 font-bold text-xs uppercase tracking-widest text-gray-300">
|
<div className="bg-gray-900/80 border-b border-pixel-gold/30 grid grid-cols-12 gap-4 p-4 font-bold text-xs uppercase tracking-widest text-gray-300">
|
||||||
<div className="col-span-1 text-center">Rank</div>
|
<div className="col-span-1 text-center">Rank</div>
|
||||||
@@ -67,11 +69,11 @@ export default function LeaderboardSection({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Entries */}
|
{/* Entries */}
|
||||||
<div className="divide-y divide-pixel-gold/10">
|
<div className="divide-y divide-pixel-gold/10 overflow-visible">
|
||||||
{leaderboard.map((entry) => (
|
{leaderboard.map((entry) => (
|
||||||
<div
|
<div
|
||||||
key={entry.rank}
|
key={entry.rank}
|
||||||
className={`grid grid-cols-12 gap-4 p-4 hover:bg-gray-900/50 transition ${
|
className={`grid grid-cols-12 gap-4 p-4 hover:bg-gray-900/50 transition relative ${
|
||||||
entry.rank <= 3
|
entry.rank <= 3
|
||||||
? "bg-gradient-to-r from-pixel-gold/10 via-pixel-gold/5 to-transparent"
|
? "bg-gradient-to-r from-pixel-gold/10 via-pixel-gold/5 to-transparent"
|
||||||
: "bg-black/40"
|
: "bg-black/40"
|
||||||
@@ -95,7 +97,7 @@ export default function LeaderboardSection({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Player */}
|
{/* Player */}
|
||||||
<div className="col-span-6 flex items-center gap-3">
|
<div className="col-span-6 flex items-center gap-3 relative group">
|
||||||
{entry.avatar ? (
|
{entry.avatar ? (
|
||||||
<div className="w-10 h-10 rounded-full border border-pixel-gold/30 overflow-hidden">
|
<div className="w-10 h-10 rounded-full border border-pixel-gold/30 overflow-hidden">
|
||||||
<img
|
<img
|
||||||
@@ -112,15 +114,85 @@ export default function LeaderboardSection({
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<span
|
<span
|
||||||
className={`font-bold ${
|
className={`font-bold cursor-pointer relative z-10 ${
|
||||||
entry.rank <= 3 ? "text-pixel-gold" : "text-white"
|
entry.rank <= 3 ? "text-pixel-gold" : "text-white"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{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.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">
|
||||||
|
{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">
|
||||||
|
Bio
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-gray-200 leading-relaxed whitespace-pre-wrap break-words">
|
||||||
|
{entry.bio}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Score */}
|
{/* Score */}
|
||||||
|
|||||||
@@ -3,11 +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;
|
||||||
|
characterClass: CharacterClass;
|
||||||
hp: number;
|
hp: number;
|
||||||
maxHp: number;
|
maxHp: number;
|
||||||
xp: number;
|
xp: number;
|
||||||
@@ -38,6 +53,10 @@ 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 [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);
|
||||||
|
|
||||||
@@ -99,12 +118,16 @@ export default function ProfileForm({
|
|||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
username,
|
username,
|
||||||
avatar,
|
avatar,
|
||||||
|
bio,
|
||||||
|
characterClass,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
setProfile(data);
|
setProfile(data);
|
||||||
|
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 {
|
||||||
@@ -316,6 +339,129 @@ export default function ProfileForm({
|
|||||||
<p className="text-gray-500 text-xs mt-1">3-20 caractères</p>
|
<p className="text-gray-500 text-xs mt-1">3-20 caractères</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Bio Field */}
|
||||||
|
<div>
|
||||||
|
<label className="block text-pixel-gold text-sm uppercase tracking-widest mb-2">
|
||||||
|
Bio
|
||||||
|
</label>
|
||||||
|
<textarea
|
||||||
|
value={bio || ""}
|
||||||
|
onChange={(e) => setBio(e.target.value)}
|
||||||
|
className="w-full px-4 py-3 bg-black/40 border border-pixel-gold/30 rounded text-white focus:outline-none focus:border-pixel-gold transition resize-none"
|
||||||
|
rows={4}
|
||||||
|
maxLength={500}
|
||||||
|
placeholder="Parlez-nous de vous..."
|
||||||
|
/>
|
||||||
|
<p className="text-gray-500 text-xs mt-1">
|
||||||
|
{(bio || "").length}/500 caractères
|
||||||
|
</p>
|
||||||
|
</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 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\":\"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')
|
||||||
|
|||||||
@@ -827,6 +827,8 @@ export const UserScalarFieldEnum = {
|
|||||||
xp: 'xp',
|
xp: 'xp',
|
||||||
maxXp: 'maxXp',
|
maxXp: 'maxXp',
|
||||||
avatar: 'avatar',
|
avatar: 'avatar',
|
||||||
|
bio: 'bio',
|
||||||
|
characterClass: 'characterClass',
|
||||||
createdAt: 'createdAt',
|
createdAt: 'createdAt',
|
||||||
updatedAt: 'updatedAt'
|
updatedAt: 'updatedAt'
|
||||||
} as const
|
} as const
|
||||||
@@ -927,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'
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ export const UserScalarFieldEnum = {
|
|||||||
xp: 'xp',
|
xp: 'xp',
|
||||||
maxXp: 'maxXp',
|
maxXp: 'maxXp',
|
||||||
avatar: 'avatar',
|
avatar: 'avatar',
|
||||||
|
bio: 'bio',
|
||||||
|
characterClass: 'characterClass',
|
||||||
createdAt: 'createdAt',
|
createdAt: 'createdAt',
|
||||||
updatedAt: 'updatedAt'
|
updatedAt: 'updatedAt'
|
||||||
} as const
|
} as const
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ export type UserMinAggregateOutputType = {
|
|||||||
xp: number | null
|
xp: number | null
|
||||||
maxXp: number | null
|
maxXp: number | null
|
||||||
avatar: string | null
|
avatar: string | null
|
||||||
|
bio: string | null
|
||||||
|
characterClass: $Enums.CharacterClass | null
|
||||||
createdAt: Date | null
|
createdAt: Date | null
|
||||||
updatedAt: Date | null
|
updatedAt: Date | null
|
||||||
}
|
}
|
||||||
@@ -74,6 +76,8 @@ export type UserMaxAggregateOutputType = {
|
|||||||
xp: number | null
|
xp: number | null
|
||||||
maxXp: number | null
|
maxXp: number | null
|
||||||
avatar: string | null
|
avatar: string | null
|
||||||
|
bio: string | null
|
||||||
|
characterClass: $Enums.CharacterClass | null
|
||||||
createdAt: Date | null
|
createdAt: Date | null
|
||||||
updatedAt: Date | null
|
updatedAt: Date | null
|
||||||
}
|
}
|
||||||
@@ -91,6 +95,8 @@ export type UserCountAggregateOutputType = {
|
|||||||
xp: number
|
xp: number
|
||||||
maxXp: number
|
maxXp: number
|
||||||
avatar: number
|
avatar: number
|
||||||
|
bio: number
|
||||||
|
characterClass: number
|
||||||
createdAt: number
|
createdAt: number
|
||||||
updatedAt: number
|
updatedAt: number
|
||||||
_all: number
|
_all: number
|
||||||
@@ -128,6 +134,8 @@ export type UserMinAggregateInputType = {
|
|||||||
xp?: true
|
xp?: true
|
||||||
maxXp?: true
|
maxXp?: true
|
||||||
avatar?: true
|
avatar?: true
|
||||||
|
bio?: true
|
||||||
|
characterClass?: true
|
||||||
createdAt?: true
|
createdAt?: true
|
||||||
updatedAt?: true
|
updatedAt?: true
|
||||||
}
|
}
|
||||||
@@ -145,6 +153,8 @@ export type UserMaxAggregateInputType = {
|
|||||||
xp?: true
|
xp?: true
|
||||||
maxXp?: true
|
maxXp?: true
|
||||||
avatar?: true
|
avatar?: true
|
||||||
|
bio?: true
|
||||||
|
characterClass?: true
|
||||||
createdAt?: true
|
createdAt?: true
|
||||||
updatedAt?: true
|
updatedAt?: true
|
||||||
}
|
}
|
||||||
@@ -162,6 +172,8 @@ export type UserCountAggregateInputType = {
|
|||||||
xp?: true
|
xp?: true
|
||||||
maxXp?: true
|
maxXp?: true
|
||||||
avatar?: true
|
avatar?: true
|
||||||
|
bio?: true
|
||||||
|
characterClass?: true
|
||||||
createdAt?: true
|
createdAt?: true
|
||||||
updatedAt?: true
|
updatedAt?: true
|
||||||
_all?: true
|
_all?: true
|
||||||
@@ -266,6 +278,8 @@ export type UserGroupByOutputType = {
|
|||||||
xp: number
|
xp: number
|
||||||
maxXp: number
|
maxXp: number
|
||||||
avatar: string | null
|
avatar: string | null
|
||||||
|
bio: string | null
|
||||||
|
characterClass: $Enums.CharacterClass | null
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
updatedAt: Date
|
updatedAt: Date
|
||||||
_count: UserCountAggregateOutputType | null
|
_count: UserCountAggregateOutputType | null
|
||||||
@@ -306,6 +320,8 @@ export type UserWhereInput = {
|
|||||||
xp?: Prisma.IntFilter<"User"> | number
|
xp?: Prisma.IntFilter<"User"> | number
|
||||||
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
|
||||||
|
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
|
||||||
@@ -325,6 +341,8 @@ export type UserOrderByWithRelationInput = {
|
|||||||
xp?: Prisma.SortOrder
|
xp?: Prisma.SortOrder
|
||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrderInput | Prisma.SortOrder
|
avatar?: 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
|
||||||
@@ -347,6 +365,8 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{
|
|||||||
xp?: Prisma.IntFilter<"User"> | number
|
xp?: Prisma.IntFilter<"User"> | number
|
||||||
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
|
||||||
|
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
|
||||||
@@ -366,6 +386,8 @@ export type UserOrderByWithAggregationInput = {
|
|||||||
xp?: Prisma.SortOrder
|
xp?: Prisma.SortOrder
|
||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrderInput | Prisma.SortOrder
|
avatar?: 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
|
||||||
@@ -391,6 +413,8 @@ export type UserScalarWhereWithAggregatesInput = {
|
|||||||
xp?: Prisma.IntWithAggregatesFilter<"User"> | number
|
xp?: Prisma.IntWithAggregatesFilter<"User"> | number
|
||||||
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
|
||||||
|
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
|
||||||
}
|
}
|
||||||
@@ -408,6 +432,8 @@ export type UserCreateInput = {
|
|||||||
xp?: number
|
xp?: number
|
||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: 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
|
||||||
@@ -427,6 +453,8 @@ export type UserUncheckedCreateInput = {
|
|||||||
xp?: number
|
xp?: number
|
||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: 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
|
||||||
@@ -446,6 +474,8 @@ export type UserUpdateInput = {
|
|||||||
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: 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
|
||||||
@@ -465,6 +495,8 @@ export type UserUncheckedUpdateInput = {
|
|||||||
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: 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
|
||||||
@@ -484,6 +516,8 @@ export type UserCreateManyInput = {
|
|||||||
xp?: number
|
xp?: number
|
||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: string | null
|
||||||
|
bio?: string | null
|
||||||
|
characterClass?: $Enums.CharacterClass | null
|
||||||
createdAt?: Date | string
|
createdAt?: Date | string
|
||||||
updatedAt?: Date | string
|
updatedAt?: Date | string
|
||||||
}
|
}
|
||||||
@@ -501,6 +535,8 @@ export type UserUpdateManyMutationInput = {
|
|||||||
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: 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
|
||||||
}
|
}
|
||||||
@@ -518,6 +554,8 @@ export type UserUncheckedUpdateManyInput = {
|
|||||||
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: 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
|
||||||
}
|
}
|
||||||
@@ -535,6 +573,8 @@ export type UserCountOrderByAggregateInput = {
|
|||||||
xp?: Prisma.SortOrder
|
xp?: Prisma.SortOrder
|
||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrder
|
avatar?: Prisma.SortOrder
|
||||||
|
bio?: Prisma.SortOrder
|
||||||
|
characterClass?: Prisma.SortOrder
|
||||||
createdAt?: Prisma.SortOrder
|
createdAt?: Prisma.SortOrder
|
||||||
updatedAt?: Prisma.SortOrder
|
updatedAt?: Prisma.SortOrder
|
||||||
}
|
}
|
||||||
@@ -561,6 +601,8 @@ export type UserMaxOrderByAggregateInput = {
|
|||||||
xp?: Prisma.SortOrder
|
xp?: Prisma.SortOrder
|
||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrder
|
avatar?: Prisma.SortOrder
|
||||||
|
bio?: Prisma.SortOrder
|
||||||
|
characterClass?: Prisma.SortOrder
|
||||||
createdAt?: Prisma.SortOrder
|
createdAt?: Prisma.SortOrder
|
||||||
updatedAt?: Prisma.SortOrder
|
updatedAt?: Prisma.SortOrder
|
||||||
}
|
}
|
||||||
@@ -578,6 +620,8 @@ export type UserMinOrderByAggregateInput = {
|
|||||||
xp?: Prisma.SortOrder
|
xp?: Prisma.SortOrder
|
||||||
maxXp?: Prisma.SortOrder
|
maxXp?: Prisma.SortOrder
|
||||||
avatar?: Prisma.SortOrder
|
avatar?: Prisma.SortOrder
|
||||||
|
bio?: Prisma.SortOrder
|
||||||
|
characterClass?: Prisma.SortOrder
|
||||||
createdAt?: Prisma.SortOrder
|
createdAt?: Prisma.SortOrder
|
||||||
updatedAt?: Prisma.SortOrder
|
updatedAt?: Prisma.SortOrder
|
||||||
}
|
}
|
||||||
@@ -616,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
|
||||||
}
|
}
|
||||||
@@ -661,6 +709,8 @@ export type UserCreateWithoutPreferencesInput = {
|
|||||||
xp?: number
|
xp?: number
|
||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: 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
|
||||||
@@ -679,6 +729,8 @@ export type UserUncheckedCreateWithoutPreferencesInput = {
|
|||||||
xp?: number
|
xp?: number
|
||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: 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
|
||||||
@@ -713,6 +765,8 @@ export type UserUpdateWithoutPreferencesInput = {
|
|||||||
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: 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
|
||||||
@@ -731,6 +785,8 @@ export type UserUncheckedUpdateWithoutPreferencesInput = {
|
|||||||
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: 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
|
||||||
@@ -749,6 +805,8 @@ export type UserCreateWithoutEventRegistrationsInput = {
|
|||||||
xp?: number
|
xp?: number
|
||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: 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
|
||||||
@@ -767,6 +825,8 @@ export type UserUncheckedCreateWithoutEventRegistrationsInput = {
|
|||||||
xp?: number
|
xp?: number
|
||||||
maxXp?: number
|
maxXp?: number
|
||||||
avatar?: string | null
|
avatar?: 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
|
||||||
@@ -801,6 +861,8 @@ export type UserUpdateWithoutEventRegistrationsInput = {
|
|||||||
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: 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
|
||||||
@@ -819,6 +881,8 @@ export type UserUncheckedUpdateWithoutEventRegistrationsInput = {
|
|||||||
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
xp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
|
||||||
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
|
avatar?: 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
|
||||||
@@ -868,6 +932,8 @@ export type UserSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = r
|
|||||||
xp?: boolean
|
xp?: boolean
|
||||||
maxXp?: boolean
|
maxXp?: boolean
|
||||||
avatar?: boolean
|
avatar?: 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>
|
||||||
@@ -888,6 +954,8 @@ export type UserSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensio
|
|||||||
xp?: boolean
|
xp?: boolean
|
||||||
maxXp?: boolean
|
maxXp?: boolean
|
||||||
avatar?: boolean
|
avatar?: boolean
|
||||||
|
bio?: boolean
|
||||||
|
characterClass?: boolean
|
||||||
createdAt?: boolean
|
createdAt?: boolean
|
||||||
updatedAt?: boolean
|
updatedAt?: boolean
|
||||||
}, ExtArgs["result"]["user"]>
|
}, ExtArgs["result"]["user"]>
|
||||||
@@ -905,6 +973,8 @@ export type UserSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensio
|
|||||||
xp?: boolean
|
xp?: boolean
|
||||||
maxXp?: boolean
|
maxXp?: boolean
|
||||||
avatar?: boolean
|
avatar?: boolean
|
||||||
|
bio?: boolean
|
||||||
|
characterClass?: boolean
|
||||||
createdAt?: boolean
|
createdAt?: boolean
|
||||||
updatedAt?: boolean
|
updatedAt?: boolean
|
||||||
}, ExtArgs["result"]["user"]>
|
}, ExtArgs["result"]["user"]>
|
||||||
@@ -922,11 +992,13 @@ export type UserSelectScalar = {
|
|||||||
xp?: boolean
|
xp?: boolean
|
||||||
maxXp?: boolean
|
maxXp?: boolean
|
||||||
avatar?: boolean
|
avatar?: 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" | "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>
|
||||||
@@ -954,6 +1026,8 @@ export type $UserPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
|
|||||||
xp: number
|
xp: number
|
||||||
maxXp: number
|
maxXp: number
|
||||||
avatar: string | null
|
avatar: string | null
|
||||||
|
bio: string | null
|
||||||
|
characterClass: $Enums.CharacterClass | null
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
updatedAt: Date
|
updatedAt: Date
|
||||||
}, ExtArgs["result"]["user"]>
|
}, ExtArgs["result"]["user"]>
|
||||||
@@ -1393,6 +1467,8 @@ export interface UserFieldRefs {
|
|||||||
readonly xp: Prisma.FieldRef<"User", 'Int'>
|
readonly xp: Prisma.FieldRef<"User", 'Int'>
|
||||||
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 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 "bio" TEXT;
|
||||||
@@ -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
|
||||||
@@ -41,6 +54,8 @@ model User {
|
|||||||
xp Int @default(0)
|
xp Int @default(0)
|
||||||
maxXp Int @default(5000)
|
maxXp Int @default(5000)
|
||||||
avatar String?
|
avatar 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