feat: handling SSR on home page

This commit is contained in:
Julien Froidefond
2025-08-21 12:54:48 +02:00
parent e32e3b8bc0
commit 69f23db55d
14 changed files with 828 additions and 342 deletions

51
lib/score-utils.ts Normal file
View File

@@ -0,0 +1,51 @@
// Fonction pour déterminer la couleur du badge selon le niveau moyen
export function getScoreColors(score: number) {
if (score >= 2.5) {
// Expert/Maîtrise (violet)
return {
bg: "bg-violet-500/20",
border: "border-violet-500/30",
text: "text-violet-400",
gradient: "from-violet-500 to-violet-400",
};
} else if (score >= 1.5) {
// Autonome (vert)
return {
bg: "bg-green-500/20",
border: "border-green-500/30",
text: "text-green-400",
gradient: "from-green-500 to-green-400",
};
} else if (score >= 0.5) {
// Non autonome (orange/amber)
return {
bg: "bg-amber-500/20",
border: "border-amber-500/30",
text: "text-amber-400",
gradient: "from-amber-500 to-amber-400",
};
} else {
// Jamais pratiqué (rouge)
return {
bg: "bg-red-500/20",
border: "border-red-500/30",
text: "text-red-400",
gradient: "from-red-500 to-red-400",
};
}
}
export function getSkillLevelLabel(level: string): string {
switch (level) {
case "never":
return "Jamais utilisé";
case "not-autonomous":
return "Non autonome";
case "autonomous":
return "Autonome";
case "expert":
return "Expert";
default:
return "";
}
}

85
lib/server-auth.ts Normal file
View File

@@ -0,0 +1,85 @@
import { cookies } from "next/headers";
import { COOKIE_NAME } from "./auth-utils";
import { EvaluationService } from "@/services/evaluation-service";
import { TeamsService } from "@/services/teams-service";
import { SkillsService } from "@/services/skills-service";
import { SkillCategory, Team } from "./types";
/**
* Récupère l'ID utilisateur depuis le cookie côté serveur
*/
export async function getUserIdFromCookie(): Promise<number | null> {
const cookieStore = await cookies();
const userIdCookie = cookieStore.get("peakSkills_userId");
if (!userIdCookie?.value) {
return null;
}
const userId = parseInt(userIdCookie.value);
return isNaN(userId) ? null : userId;
}
/**
* Récupère l'évaluation complète de l'utilisateur côté serveur
*/
export async function getServerUserEvaluation() {
const userId = await getUserIdFromCookie();
if (!userId) {
return null;
}
try {
const evaluationService = new EvaluationService();
// Récupérer d'abord le profil utilisateur
const userProfile = await evaluationService.getUserById(userId);
if (!userProfile) {
return null;
}
// Puis charger l'évaluation avec le profil
const userEvaluation = await evaluationService.loadUserEvaluation(
userProfile
);
return userEvaluation;
} catch (error) {
console.error("Failed to get user evaluation:", error);
return null;
}
}
/**
* Charge les catégories de compétences côté serveur depuis PostgreSQL
*/
export async function getServerSkillCategories(): Promise<SkillCategory[]> {
try {
return await SkillsService.getSkillCategories();
} catch (error) {
console.error("Failed to load skill categories:", error);
return [];
}
}
/**
* Charge les équipes côté serveur depuis PostgreSQL
*/
export async function getServerTeams(): Promise<Team[]> {
try {
return await TeamsService.getTeams();
} catch (error) {
console.error("Failed to load teams:", error);
return [];
}
}
/**
* Vérifie simplement si l'utilisateur est authentifié via le cookie
*/
export async function isUserAuthenticated(): Promise<boolean> {
const userId = await getUserIdFromCookie();
return !!userId;
}