diff --git a/app/api/auth/route.ts b/app/api/auth/route.ts deleted file mode 100644 index 0f998d4..0000000 --- a/app/api/auth/route.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { AuthService, userService, TeamsService } from "@/services"; - -/** - * GET /api/auth - Récupère les informations de l'utilisateur connecté - */ -export async function GET(request: NextRequest) { - try { - // Récupérer l'UUID utilisateur depuis le cookie - const userUuid = await AuthService.getUserUuidFromCookie(); - - if (!userUuid) { - return NextResponse.json({ error: "Non authentifié" }, { status: 401 }); - } - - // Récupérer le profil utilisateur - const userProfile = await userService.getUserByUuid(userUuid); - - if (!userProfile) { - return NextResponse.json( - { error: "Utilisateur non trouvé" }, - { status: 404 } - ); - } - - // Récupérer le nom de l'équipe - let teamName = "Équipe non définie"; - if (userProfile.teamId) { - try { - const team = await TeamsService.getTeamById(userProfile.teamId); - if (team) { - teamName = team.name; - } - } catch (error) { - console.error("Failed to fetch team name:", error); - } - } - - // Retourner les informations complètes de l'utilisateur - return NextResponse.json({ - user: { - firstName: userProfile.firstName, - lastName: userProfile.lastName, - teamId: userProfile.teamId, - teamName: teamName, - uuid: userUuid, - }, - }); - } catch (error) { - console.error("Auth GET error:", error); - return NextResponse.json( - { error: "Erreur interne du serveur" }, - { status: 500 } - ); - } -} diff --git a/app/layout.tsx b/app/layout.tsx index 845d4cd..9fdbdac 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -7,6 +7,7 @@ import { ThemeProvider } from "@/components/layout/theme-provider"; import { Toaster } from "@/components/ui/sonner"; import { UserProvider } from "@/hooks/use-user-context"; import { NavigationWrapper } from "@/components/layout/navigation-wrapper"; +import { AuthService, TeamsService } from "@/services"; export const metadata: Metadata = { title: "PeakSkills - Auto-évaluation de compétences", @@ -14,11 +15,42 @@ export const metadata: Metadata = { "Plateforme d'auto-évaluation de compétences techniques pour les équipes", }; -export default function RootLayout({ +export default async function RootLayout({ children, }: { children: React.ReactNode; }) { + // Récupérer les infos utilisateur côté serveur + let userInfo = null; + try { + const { userUuid, userProfile } = + await AuthService.requireAuthenticatedUser(); + + // Récupérer le nom de l'équipe + let teamName = "Équipe non définie"; + if (userProfile.teamId) { + try { + const team = await TeamsService.getTeamById(userProfile.teamId); + if (team) { + teamName = team.name; + } + } catch (error) { + console.error("Failed to fetch team name:", error); + } + } + + userInfo = { + firstName: userProfile.firstName, + lastName: userProfile.lastName, + teamName, + teamId: userProfile.teamId, + uuid: userUuid, + }; + } catch (error) { + // Utilisateur non authentifié, userInfo reste null + console.log("User not authenticated:", error); + } + return ( - +
{children}
diff --git a/clients/domains/auth-client.ts b/clients/domains/auth-client.ts index ae4a925..ae17752 100644 --- a/clients/domains/auth-client.ts +++ b/clients/domains/auth-client.ts @@ -47,31 +47,4 @@ export class AuthClient extends BaseHttpClient { async logout(): Promise<{ message: string }> { return await this.post("/auth/logout"); } - - /** - * Récupère l'utilisateur actuel depuis le cookie - */ - async getCurrentUser(): Promise<{ - firstName: string; - lastName: string; - teamId: string; - teamName: string; - uuid: string; - } | null> { - try { - const response = await this.get<{ - user: { - firstName: string; - lastName: string; - teamId: string; - teamName: string; - uuid: string; - }; - }>("/auth"); - return response.user; - } catch (error) { - console.error("Failed to get current user:", error); - return null; - } - } } diff --git a/hooks/use-user-context.tsx b/hooks/use-user-context.tsx index 1694b8f..34f8abd 100644 --- a/hooks/use-user-context.tsx +++ b/hooks/use-user-context.tsx @@ -1,18 +1,13 @@ "use client"; -import { - createContext, - useContext, - useState, - useEffect, - ReactNode, -} from "react"; -import { authClient } from "@/clients"; +import { createContext, useContext, useState, ReactNode } from "react"; interface UserInfo { firstName: string; lastName: string; teamName: string; + teamId?: string; + uuid?: string; } interface UserContextType { @@ -23,33 +18,14 @@ interface UserContextType { const UserContext = createContext(undefined); -export function UserProvider({ children }: { children: ReactNode }) { - const [userInfo, setUserInfo] = useState(null); - const [loading, setLoading] = useState(true); +interface UserProviderProps { + children: ReactNode; + initialUserInfo: UserInfo | null; +} - useEffect(() => { - const fetchUserInfo = async () => { - try { - // Récupérer les informations utilisateur depuis l'API - const user = await authClient.getCurrentUser(); - if (user) { - setUserInfo({ - firstName: user.firstName, - lastName: user.lastName, - teamName: user.teamName || "Équipe non définie", - }); - } - } catch (error) { - console.error("Failed to fetch user info:", error); - // En cas d'erreur, on considère que l'utilisateur n'est pas connecté - setUserInfo(null); - } finally { - setLoading(false); - } - }; - - fetchUserInfo(); - }, []); +export function UserProvider({ children, initialUserInfo }: UserProviderProps) { + const [userInfo, setUserInfo] = useState(initialUserInfo); + const [loading, setLoading] = useState(false); // Plus de loading initial return ( diff --git a/middleware.ts b/middleware.ts index e388223..1b7a44f 100644 --- a/middleware.ts +++ b/middleware.ts @@ -9,7 +9,7 @@ export function middleware(request: NextRequest) { const publicPaths = ["/login"]; // Pages API qui ne nécessitent pas d'authentification - const publicApiPaths = ["/api/auth", "/api/teams"]; + const publicApiPaths = ["/api/teams"]; // Vérifier si c'est une route publique if (