feat: integrate NextAuth for authentication, refactor login and registration processes, and enhance middleware for session management

This commit is contained in:
Julien Froidefond
2025-10-16 15:50:37 +02:00
parent 9ecdd72804
commit 7426bfb33c
33 changed files with 417 additions and 729 deletions

View File

@@ -0,0 +1,3 @@
import { handlers } from "@/lib/auth";
export const { GET, POST } = handlers;

View File

@@ -1,44 +0,0 @@
import { NextResponse } from "next/server";
import { AuthServerService } from "@/lib/services/auth-server.service";
import { ERROR_CODES } from "@/constants/errorCodes";
import { AppError } from "@/utils/errors";
import type { UserData } from "@/lib/services/auth-server.service";
import { getErrorMessage } from "@/utils/errors";
import type { NextRequest } from "next/server";
export async function POST(request: NextRequest) {
try {
const { email, password, remember } = await request.json();
try {
const userData: UserData = await AuthServerService.loginUser(email, password);
await AuthServerService.setUserCookie(userData, remember);
return NextResponse.json({
message: "✅ Connexion réussie",
user: userData,
});
} catch (error) {
if (error instanceof AppError) {
return NextResponse.json(
{
error,
},
{ status: 401 }
);
}
throw error;
}
} catch (error) {
console.error("Erreur lors de la connexion:", error);
return NextResponse.json(
{
error: {
code: ERROR_CODES.AUTH.INVALID_CREDENTIALS,
name: "Invalid credentials",
message: getErrorMessage(ERROR_CODES.AUTH.INVALID_CREDENTIALS),
} as AppError,
},
{ status: 500 }
);
}
}

View File

@@ -1,27 +0,0 @@
import { NextResponse } from "next/server";
import { cookies } from "next/headers";
import { ERROR_CODES } from "@/constants/errorCodes";
import { getErrorMessage } from "@/utils/errors";
import type { AppErrorType } from "@/types/global";
export async function POST() {
try {
// Supprimer le cookie
const cookieStore = await cookies();
cookieStore.delete("stripUser");
return NextResponse.json({ message: "👋 Déconnexion réussie" });
} catch (error) {
console.error("Erreur lors de la déconnexion:", error);
return NextResponse.json(
{
error: {
code: ERROR_CODES.AUTH.LOGOUT_ERROR,
name: "Logout error",
message: getErrorMessage(ERROR_CODES.AUTH.LOGOUT_ERROR),
} as AppErrorType,
},
{ status: 500 }
);
}
}

View File

@@ -1,48 +1,52 @@
import { NextResponse } from "next/server";
import type { UserData } from "@/lib/services/auth-server.service";
import { NextRequest, NextResponse } from "next/server";
import { AuthServerService } from "@/lib/services/auth-server.service";
import { ERROR_CODES } from "@/constants/errorCodes";
import { ERROR_MESSAGES } from "@/constants/errorMessages";
import { AppError } from "@/utils/errors";
import { getErrorMessage } from "@/utils/errors";
import type { NextRequest } from "next/server";
export async function POST(request: NextRequest) {
try {
const { email, password } = await request.json();
try {
const userData: UserData = await AuthServerService.createUser(email, password);
await AuthServerService.setUserCookie(userData);
return NextResponse.json({
message: "✅ Inscription réussie",
user: userData,
});
} catch (error) {
if (error instanceof AppError) {
const status =
error.code === ERROR_CODES.AUTH.EMAIL_EXISTS ||
error.code === ERROR_CODES.AUTH.PASSWORD_NOT_STRONG
? 400
: 500;
return NextResponse.json(
{
error,
},
{ status }
);
}
throw error;
if (!email || !password) {
return NextResponse.json(
{
error: {
code: ERROR_CODES.AUTH.INVALID_USER_DATA,
name: "Invalid user data",
message: ERROR_MESSAGES[ERROR_CODES.AUTH.INVALID_USER_DATA],
} as AppError,
},
{ status: 400 }
);
}
const userData = await AuthServerService.registerUser(email, password);
return NextResponse.json({ success: true, user: userData });
} catch (error) {
console.error("Erreur lors de l'inscription:", error);
console.error("Registration error:", error);
if (error instanceof AppError) {
return NextResponse.json(
{
error: {
code: error.code,
name: error.name,
message: error.message,
} as AppError,
},
{ status: 400 }
);
}
return NextResponse.json(
{
error: {
code: ERROR_CODES.AUTH.INVALID_USER_DATA,
name: "Invalid user data",
message: getErrorMessage(ERROR_CODES.AUTH.INVALID_USER_DATA),
},
code: ERROR_CODES.AUTH.REGISTRATION_FAILED,
name: "Registration failed",
message: ERROR_MESSAGES[ERROR_CODES.AUTH.REGISTRATION_FAILED],
} as AppError,
},
{ status: 500 }
);

View File

@@ -6,6 +6,7 @@ import ClientLayout from "@/components/layout/ClientLayout";
import { PreferencesService } from "@/lib/services/preferences.service";
import { PreferencesProvider } from "@/contexts/PreferencesContext";
import { I18nProvider } from "@/components/providers/I18nProvider";
import { AuthProvider } from "@/components/providers/AuthProvider";
import "@/i18n/i18n"; // Import i18next configuration
import { cookies } from "next/headers";
import { defaultPreferences } from "@/types/preferences";
@@ -158,13 +159,15 @@ export default async function RootLayout({ children }: { children: React.ReactNo
<body
className={cn("min-h-screen bg-background font-sans antialiased h-full", inter.className)}
>
<I18nProvider locale={locale}>
<PreferencesProvider initialPreferences={preferences}>
<ClientLayout initialLibraries={libraries} initialFavorites={favorites}>
{children}
</ClientLayout>
</PreferencesProvider>
</I18nProvider>
<AuthProvider>
<I18nProvider locale={locale}>
<PreferencesProvider initialPreferences={preferences}>
<ClientLayout initialLibraries={libraries} initialFavorites={favorites}>
{children}
</ClientLayout>
</PreferencesProvider>
</I18nProvider>
</AuthProvider>
</body>
</html>
);