diff --git a/app/api/leaderboard/route.ts b/app/api/leaderboard/route.ts
index a0dca1f..0cfd212 100644
--- a/app/api/leaderboard/route.ts
+++ b/app/api/leaderboard/route.ts
@@ -14,16 +14,30 @@ export async function GET() {
score: true,
level: true,
avatar: true,
+ bio: true,
},
});
- const leaderboard = users.map((user: { id: string; username: string; score: number; level: number; avatar: string | null }, index: number) => ({
- rank: index + 1,
- username: user.username,
- score: user.score,
- level: user.level,
- avatar: user.avatar,
- }));
+ const leaderboard = users.map(
+ (
+ user: {
+ id: string;
+ username: string;
+ score: number;
+ level: number;
+ avatar: string | null;
+ bio: string | null;
+ },
+ index: number
+ ) => ({
+ rank: index + 1,
+ username: user.username,
+ score: user.score,
+ level: user.level,
+ avatar: user.avatar,
+ bio: user.bio,
+ })
+ );
return NextResponse.json(leaderboard);
} catch (error) {
@@ -34,4 +48,3 @@ export async function GET() {
);
}
}
-
diff --git a/app/api/profile/route.ts b/app/api/profile/route.ts
index 630c141..a3953d9 100644
--- a/app/api/profile/route.ts
+++ b/app/api/profile/route.ts
@@ -17,6 +17,7 @@ export async function GET() {
email: true,
username: true,
avatar: true,
+ bio: true,
hp: true,
maxHp: true,
xp: true,
@@ -50,7 +51,7 @@ export async function PUT(request: Request) {
}
const body = await request.json();
- const { username, avatar } = body;
+ const { username, avatar, bio } = body;
// Validation
if (username !== undefined) {
@@ -84,14 +85,33 @@ 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 }
+ );
+ }
+ }
+
// Mettre à jour l'utilisateur
- const updateData: { username?: string; avatar?: string | null } = {};
+ const updateData: { username?: string; avatar?: string | null; bio?: string | null } = {};
if (username !== undefined) {
updateData.username = username.trim();
}
if (avatar !== undefined) {
updateData.avatar = avatar || null;
}
+ if (bio !== undefined) {
+ updateData.bio = bio.trim() || null;
+ }
const updatedUser = await prisma.user.update({
where: { id: session.user.id },
@@ -101,6 +121,7 @@ export async function PUT(request: Request) {
email: true,
username: true,
avatar: true,
+ bio: true,
hp: true,
maxHp: true,
xp: true,
diff --git a/app/leaderboard/page.tsx b/app/leaderboard/page.tsx
index 07f623b..c7e5738 100644
--- a/app/leaderboard/page.tsx
+++ b/app/leaderboard/page.tsx
@@ -9,6 +9,7 @@ interface LeaderboardEntry {
score: number;
level: number;
avatar: string | null;
+ bio: string | null;
}
export default async function LeaderboardPage() {
@@ -23,6 +24,7 @@ export default async function LeaderboardPage() {
score: true,
level: true,
avatar: true,
+ bio: true,
},
});
@@ -32,6 +34,7 @@ export default async function LeaderboardPage() {
score: user.score,
level: user.level,
avatar: user.avatar,
+ bio: user.bio,
}));
const backgroundImage = await getBackgroundImage(
diff --git a/app/profile/page.tsx b/app/profile/page.tsx
index eedbd92..d4e8568 100644
--- a/app/profile/page.tsx
+++ b/app/profile/page.tsx
@@ -19,6 +19,7 @@ export default async function ProfilePage() {
email: true,
username: true,
avatar: true,
+ bio: true,
hp: true,
maxHp: true,
xp: true,
diff --git a/components/Leaderboard.tsx b/components/Leaderboard.tsx
index 2c42007..f2d0ac7 100644
--- a/components/Leaderboard.tsx
+++ b/components/Leaderboard.tsx
@@ -8,6 +8,7 @@ interface LeaderboardEntry {
score: number;
level: number;
avatar?: string | null;
+ bio?: string | null;
}
// Format number with consistent locale to avoid hydration mismatch
@@ -48,7 +49,7 @@ export default function Leaderboard() {
LEADERBOARD
-
+
{/* Header */}
Rank
@@ -58,11 +59,11 @@ export default function Leaderboard() {
{/* Entries */}
-
+
{leaderboard.map((entry) => (
@@ -81,10 +82,20 @@ export default function Leaderboard() {
{entry.rank}
-
-
+
+
{entry.username}
+ {entry.bio && (
+
+
+ Bio
+
+
+ {entry.bio}
+
+
+ )}
diff --git a/components/LeaderboardSection.tsx b/components/LeaderboardSection.tsx
index 5a13d79..fe56505 100644
--- a/components/LeaderboardSection.tsx
+++ b/components/LeaderboardSection.tsx
@@ -6,6 +6,7 @@ interface LeaderboardEntry {
score: number;
level: number;
avatar?: string | null;
+ bio?: string | null;
}
interface LeaderboardSectionProps {
@@ -23,7 +24,7 @@ export default function LeaderboardSection({
backgroundImage,
}: LeaderboardSectionProps) {
return (
-
+
{/* Background Image */}
{/* Leaderboard Table */}
-
+
{/* Header */}
Rank
@@ -67,11 +68,11 @@ export default function LeaderboardSection({
{/* Entries */}
-
+
{leaderboard.map((entry) => (
{/* Player */}
-
+
{entry.avatar ? (
![]()
)}
@@ -121,6 +122,16 @@ export default function LeaderboardSection({
{entry.rank <= 3 && (
✦
)}
+ {entry.bio && (
+
+
+ Bio
+
+
+ {entry.bio}
+
+
+ )}
{/* Score */}
diff --git a/components/ProfileForm.tsx b/components/ProfileForm.tsx
index 2c2d224..c4cf255 100644
--- a/components/ProfileForm.tsx
+++ b/components/ProfileForm.tsx
@@ -8,6 +8,7 @@ interface UserProfile {
email: string;
username: string;
avatar: string | null;
+ bio: string | null;
hp: number;
maxHp: number;
xp: number;
@@ -38,6 +39,7 @@ export default function ProfileForm({
const [username, setUsername] = useState(initialProfile.username);
const [avatar, setAvatar] = useState
(initialProfile.avatar);
+ const [bio, setBio] = useState(initialProfile.bio || null);
const fileInputRef = useRef(null);
const [uploadingAvatar, setUploadingAvatar] = useState(false);
@@ -99,12 +101,14 @@ export default function ProfileForm({
body: JSON.stringify({
username,
avatar,
+ bio,
}),
});
if (response.ok) {
const data = await response.json();
setProfile(data);
+ setBio(data.bio || null);
setSuccess("Profil mis à jour avec succès");
setTimeout(() => setSuccess(null), 3000);
} else {
@@ -316,6 +320,24 @@ export default function ProfileForm({
3-20 caractères
+ {/* Bio Field */}
+
+
{/* Stats Display */}
diff --git a/prisma/generated/prisma/internal/class.ts b/prisma/generated/prisma/internal/class.ts
index 56802b9..baac8f6 100644
--- a/prisma/generated/prisma/internal/class.ts
+++ b/prisma/generated/prisma/internal/class.ts
@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
"clientVersion": "7.1.0",
"engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba",
"activeProvider": "sqlite",
- "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n SUMMIT\n LAUNCH\n FESTIVAL\n COMPETITION\n}\n\nenum EventStatus {\n UPCOMING\n LIVE\n PAST\n}\n\nmodel User {\n id String @id @default(cuid())\n email String @unique\n password String\n username String @unique\n role Role @default(USER)\n score Int @default(0)\n level Int @default(1)\n hp Int @default(1000)\n maxHp Int @default(1000)\n xp Int @default(0)\n maxXp Int @default(5000)\n avatar String?\n 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\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",
"runtimeDataModel": {
"models": {},
"enums": {},
@@ -28,7 +28,7 @@ const config: runtime.GetPrismaClientConfig = {
}
}
-config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"username\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"score\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"level\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"hp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxHp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"xp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxXp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"avatar\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"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\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"preferences\",\"kind\":\"object\",\"type\":\"UserPreferences\",\"relationName\":\"UserToUserPreferences\"},{\"name\":\"eventRegistrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventRegistrationToUser\"}],\"dbName\":null},\"UserPreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserPreferences\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"theme\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EventStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"registrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventToEventRegistration\"}],\"dbName\":null},\"EventRegistration\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventRegistrationToUser\"},{\"name\":\"event\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToEventRegistration\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SitePreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
async function decodeBase64AsWasm(wasmBase64: string): Promise {
const { Buffer } = await import('node:buffer')
diff --git a/prisma/generated/prisma/internal/prismaNamespace.ts b/prisma/generated/prisma/internal/prismaNamespace.ts
index 01f7e81..fd51dc1 100644
--- a/prisma/generated/prisma/internal/prismaNamespace.ts
+++ b/prisma/generated/prisma/internal/prismaNamespace.ts
@@ -827,6 +827,7 @@ export const UserScalarFieldEnum = {
xp: 'xp',
maxXp: 'maxXp',
avatar: 'avatar',
+ bio: 'bio',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
diff --git a/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts b/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts
index 104e599..acc78a9 100644
--- a/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts
+++ b/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts
@@ -84,6 +84,7 @@ export const UserScalarFieldEnum = {
xp: 'xp',
maxXp: 'maxXp',
avatar: 'avatar',
+ bio: 'bio',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
diff --git a/prisma/generated/prisma/models/User.ts b/prisma/generated/prisma/models/User.ts
index 5f8cccc..a4d10f0 100644
--- a/prisma/generated/prisma/models/User.ts
+++ b/prisma/generated/prisma/models/User.ts
@@ -57,6 +57,7 @@ export type UserMinAggregateOutputType = {
xp: number | null
maxXp: number | null
avatar: string | null
+ bio: string | null
createdAt: Date | null
updatedAt: Date | null
}
@@ -74,6 +75,7 @@ export type UserMaxAggregateOutputType = {
xp: number | null
maxXp: number | null
avatar: string | null
+ bio: string | null
createdAt: Date | null
updatedAt: Date | null
}
@@ -91,6 +93,7 @@ export type UserCountAggregateOutputType = {
xp: number
maxXp: number
avatar: number
+ bio: number
createdAt: number
updatedAt: number
_all: number
@@ -128,6 +131,7 @@ export type UserMinAggregateInputType = {
xp?: true
maxXp?: true
avatar?: true
+ bio?: true
createdAt?: true
updatedAt?: true
}
@@ -145,6 +149,7 @@ export type UserMaxAggregateInputType = {
xp?: true
maxXp?: true
avatar?: true
+ bio?: true
createdAt?: true
updatedAt?: true
}
@@ -162,6 +167,7 @@ export type UserCountAggregateInputType = {
xp?: true
maxXp?: true
avatar?: true
+ bio?: true
createdAt?: true
updatedAt?: true
_all?: true
@@ -266,6 +272,7 @@ export type UserGroupByOutputType = {
xp: number
maxXp: number
avatar: string | null
+ bio: string | null
createdAt: Date
updatedAt: Date
_count: UserCountAggregateOutputType | null
@@ -306,6 +313,7 @@ export type UserWhereInput = {
xp?: Prisma.IntFilter<"User"> | number
maxXp?: Prisma.IntFilter<"User"> | number
avatar?: Prisma.StringNullableFilter<"User"> | string | null
+ bio?: Prisma.StringNullableFilter<"User"> | string | null
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
preferences?: Prisma.XOR | null
@@ -325,6 +333,7 @@ export type UserOrderByWithRelationInput = {
xp?: Prisma.SortOrder
maxXp?: Prisma.SortOrder
avatar?: Prisma.SortOrderInput | Prisma.SortOrder
+ bio?: Prisma.SortOrderInput | Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
preferences?: Prisma.UserPreferencesOrderByWithRelationInput
@@ -347,6 +356,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{
xp?: Prisma.IntFilter<"User"> | number
maxXp?: Prisma.IntFilter<"User"> | number
avatar?: Prisma.StringNullableFilter<"User"> | string | null
+ bio?: Prisma.StringNullableFilter<"User"> | string | null
createdAt?: Prisma.DateTimeFilter<"User"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string
preferences?: Prisma.XOR | null
@@ -366,6 +376,7 @@ export type UserOrderByWithAggregationInput = {
xp?: Prisma.SortOrder
maxXp?: Prisma.SortOrder
avatar?: Prisma.SortOrderInput | Prisma.SortOrder
+ bio?: Prisma.SortOrderInput | Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
_count?: Prisma.UserCountOrderByAggregateInput
@@ -391,6 +402,7 @@ export type UserScalarWhereWithAggregatesInput = {
xp?: Prisma.IntWithAggregatesFilter<"User"> | number
maxXp?: Prisma.IntWithAggregatesFilter<"User"> | number
avatar?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null
+ bio?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null
createdAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string
updatedAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string
}
@@ -408,6 +420,7 @@ export type UserCreateInput = {
xp?: number
maxXp?: number
avatar?: string | null
+ bio?: string | null
createdAt?: Date | string
updatedAt?: Date | string
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
@@ -427,6 +440,7 @@ export type UserUncheckedCreateInput = {
xp?: number
maxXp?: number
avatar?: string | null
+ bio?: string | null
createdAt?: Date | string
updatedAt?: Date | string
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
@@ -446,6 +460,7 @@ export type UserUpdateInput = {
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
@@ -465,6 +480,7 @@ export type UserUncheckedUpdateInput = {
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
@@ -484,6 +500,7 @@ export type UserCreateManyInput = {
xp?: number
maxXp?: number
avatar?: string | null
+ bio?: string | null
createdAt?: Date | string
updatedAt?: Date | string
}
@@ -501,6 +518,7 @@ export type UserUpdateManyMutationInput = {
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
}
@@ -518,6 +536,7 @@ export type UserUncheckedUpdateManyInput = {
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
}
@@ -535,6 +554,7 @@ export type UserCountOrderByAggregateInput = {
xp?: Prisma.SortOrder
maxXp?: Prisma.SortOrder
avatar?: Prisma.SortOrder
+ bio?: Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
}
@@ -561,6 +581,7 @@ export type UserMaxOrderByAggregateInput = {
xp?: Prisma.SortOrder
maxXp?: Prisma.SortOrder
avatar?: Prisma.SortOrder
+ bio?: Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
}
@@ -578,6 +599,7 @@ export type UserMinOrderByAggregateInput = {
xp?: Prisma.SortOrder
maxXp?: Prisma.SortOrder
avatar?: Prisma.SortOrder
+ bio?: Prisma.SortOrder
createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder
}
@@ -661,6 +683,7 @@ export type UserCreateWithoutPreferencesInput = {
xp?: number
maxXp?: number
avatar?: string | null
+ bio?: string | null
createdAt?: Date | string
updatedAt?: Date | string
eventRegistrations?: Prisma.EventRegistrationCreateNestedManyWithoutUserInput
@@ -679,6 +702,7 @@ export type UserUncheckedCreateWithoutPreferencesInput = {
xp?: number
maxXp?: number
avatar?: string | null
+ bio?: string | null
createdAt?: Date | string
updatedAt?: Date | string
eventRegistrations?: Prisma.EventRegistrationUncheckedCreateNestedManyWithoutUserInput
@@ -713,6 +737,7 @@ export type UserUpdateWithoutPreferencesInput = {
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
eventRegistrations?: Prisma.EventRegistrationUpdateManyWithoutUserNestedInput
@@ -731,6 +756,7 @@ export type UserUncheckedUpdateWithoutPreferencesInput = {
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
eventRegistrations?: Prisma.EventRegistrationUncheckedUpdateManyWithoutUserNestedInput
@@ -749,6 +775,7 @@ export type UserCreateWithoutEventRegistrationsInput = {
xp?: number
maxXp?: number
avatar?: string | null
+ bio?: string | null
createdAt?: Date | string
updatedAt?: Date | string
preferences?: Prisma.UserPreferencesCreateNestedOneWithoutUserInput
@@ -767,6 +794,7 @@ export type UserUncheckedCreateWithoutEventRegistrationsInput = {
xp?: number
maxXp?: number
avatar?: string | null
+ bio?: string | null
createdAt?: Date | string
updatedAt?: Date | string
preferences?: Prisma.UserPreferencesUncheckedCreateNestedOneWithoutUserInput
@@ -801,6 +829,7 @@ export type UserUpdateWithoutEventRegistrationsInput = {
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
preferences?: Prisma.UserPreferencesUpdateOneWithoutUserNestedInput
@@ -819,6 +848,7 @@ export type UserUncheckedUpdateWithoutEventRegistrationsInput = {
xp?: Prisma.IntFieldUpdateOperationsInput | number
maxXp?: Prisma.IntFieldUpdateOperationsInput | number
avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ bio?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
preferences?: Prisma.UserPreferencesUncheckedUpdateOneWithoutUserNestedInput
@@ -868,6 +898,7 @@ export type UserSelect
@@ -888,6 +919,7 @@ export type UserSelectCreateManyAndReturn
@@ -905,6 +937,7 @@ export type UserSelectUpdateManyAndReturn
@@ -922,11 +955,12 @@ export type UserSelectScalar = {
xp?: boolean
maxXp?: boolean
avatar?: boolean
+ bio?: boolean
createdAt?: boolean
updatedAt?: boolean
}
-export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "email" | "password" | "username" | "role" | "score" | "level" | "hp" | "maxHp" | "xp" | "maxXp" | "avatar" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]>
+export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "email" | "password" | "username" | "role" | "score" | "level" | "hp" | "maxHp" | "xp" | "maxXp" | "avatar" | "bio" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]>
export type UserInclude = {
preferences?: boolean | Prisma.User$preferencesArgs
eventRegistrations?: boolean | Prisma.User$eventRegistrationsArgs
@@ -954,6 +988,7 @@ export type $UserPayload
@@ -1393,6 +1428,7 @@ export interface UserFieldRefs {
readonly xp: Prisma.FieldRef<"User", 'Int'>
readonly maxXp: Prisma.FieldRef<"User", 'Int'>
readonly avatar: Prisma.FieldRef<"User", 'String'>
+ readonly bio: Prisma.FieldRef<"User", 'String'>
readonly createdAt: Prisma.FieldRef<"User", 'DateTime'>
readonly updatedAt: Prisma.FieldRef<"User", 'DateTime'>
}
diff --git a/prisma/migrations/20251209205650_add_bio_to_user/migration.sql b/prisma/migrations/20251209205650_add_bio_to_user/migration.sql
new file mode 100644
index 0000000..d1822c5
--- /dev/null
+++ b/prisma/migrations/20251209205650_add_bio_to_user/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE "User" ADD COLUMN "bio" TEXT;
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 517696e..4d7efdc 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -41,6 +41,7 @@ model User {
xp Int @default(0)
maxXp Int @default(5000)
avatar String?
+ bio String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
preferences UserPreferences?