Optimize database calls across multiple components by implementing Promise.all for parallel fetching of data, enhancing performance and reducing loading times.
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 2m40s

This commit is contained in:
Julien Froidefond
2025-12-16 11:19:54 +01:00
parent a9a4120874
commit ffbf3cd42f
8 changed files with 162 additions and 120 deletions

View File

@@ -8,9 +8,18 @@ import { auth } from "@/lib/auth";
export const dynamic = "force-dynamic";
export default async function EventsPage() {
const events = await eventService.getAllEvents({
orderBy: { date: "desc" },
});
// Paralléliser les appels indépendants
const session = await auth();
const [events, backgroundImage, allRegistrations] = await Promise.all([
eventService.getAllEvents({
orderBy: { date: "desc" },
}),
getBackgroundImage("events", "/got-2.jpg"),
session?.user?.id
? eventRegistrationService.getUserRegistrations(session.user.id)
: Promise.resolve([]),
]);
// Sérialiser les dates pour le client
const serializedEvents = events.map((event) => ({
@@ -20,21 +29,11 @@ export default async function EventsPage() {
updatedAt: event.updatedAt.toISOString(),
}));
const backgroundImage = await getBackgroundImage("events", "/got-2.jpg");
// Récupérer les inscriptions côté serveur pour éviter le clignotement
const session = await auth();
// Construire le map des inscriptions
const initialRegistrations: Record<string, boolean> = {};
if (session?.user?.id) {
// Récupérer toutes les inscriptions (passées et à venir) pour permettre le feedback
const allRegistrations =
await eventRegistrationService.getUserRegistrations(session.user.id);
allRegistrations.forEach((reg) => {
initialRegistrations[reg.eventId] = true;
});
}
allRegistrations.forEach((reg) => {
initialRegistrations[reg.eventId] = true;
});
return (
<main className="min-h-screen bg-black relative">

View File

@@ -6,12 +6,11 @@ import { getBackgroundImage } from "@/lib/preferences";
export const dynamic = "force-dynamic";
export default async function LeaderboardPage() {
const leaderboard = await userStatsService.getLeaderboard(10);
const backgroundImage = await getBackgroundImage(
"leaderboard",
"/leaderboard-bg.jpg"
);
// Paralléliser les appels DB
const [leaderboard, backgroundImage] = await Promise.all([
userStatsService.getLeaderboard(10),
getBackgroundImage("leaderboard", "/leaderboard-bg.jpg"),
]);
return (
<main className="min-h-screen bg-black relative">

View File

@@ -7,7 +7,11 @@ import { getBackgroundImage } from "@/lib/preferences";
export const dynamic = "force-dynamic";
export default async function Home() {
const events = await eventService.getUpcomingEvents(3);
// Paralléliser les appels DB
const [events, backgroundImage] = await Promise.all([
eventService.getUpcomingEvents(3),
getBackgroundImage("home", "/got-2.jpg"),
]);
// Convert Date objects to strings for serialization
const serializedEvents = events.map((event) => ({
@@ -15,9 +19,6 @@ export default async function Home() {
date: event.date.toISOString(),
}));
// Récupérer l'image de fond côté serveur
const backgroundImage = await getBackgroundImage("home", "/got-2.jpg");
return (
<main className="min-h-screen bg-black relative">
<NavigationWrapper />

View File

@@ -12,31 +12,30 @@ export default async function ProfilePage() {
redirect("/login");
}
const user = await userService.getUserById(session.user.id, {
id: true,
email: true,
username: true,
avatar: true,
bio: true,
characterClass: true,
hp: true,
maxHp: true,
xp: true,
maxXp: true,
level: true,
score: true,
createdAt: true,
});
// Paralléliser les appels DB
const [user, backgroundImage] = await Promise.all([
userService.getUserById(session.user.id, {
id: true,
email: true,
username: true,
avatar: true,
bio: true,
characterClass: true,
hp: true,
maxHp: true,
xp: true,
maxXp: true,
level: true,
score: true,
createdAt: true,
}),
getBackgroundImage("home", "/got-background.jpg"),
]);
if (!user) {
redirect("/login");
}
const backgroundImage = await getBackgroundImage(
"home",
"/got-background.jpg"
);
// Convert Date to string for the component
const userProfile = {
...user,