feat(db): Login register and auth

This commit is contained in:
Julien Froidefond
2025-02-14 17:00:50 +01:00
parent 313cd60e74
commit 5d47b307bd
15 changed files with 630 additions and 225 deletions

View File

@@ -0,0 +1,36 @@
import mongoose from "mongoose";
const userSchema = new mongoose.Schema(
{
email: {
type: String,
required: true,
unique: true,
lowercase: true,
trim: true,
},
password: {
type: String,
required: true,
},
roles: {
type: [String],
default: ["ROLE_USER"],
},
authenticated: {
type: Boolean,
default: true,
},
},
{
timestamps: true,
}
);
// Middleware pour mettre à jour le champ updatedAt avant la sauvegarde
userSchema.pre("save", function (next) {
this.updatedAt = new Date();
next();
});
export const UserModel = mongoose.models.User || mongoose.model("User", userSchema);

View File

@@ -1,3 +1,5 @@
"use client";
import { AuthError } from "@/types/auth";
import { storageService } from "./storage.service";
@@ -7,19 +9,6 @@ interface AuthUser {
roles: string[];
authenticated: boolean;
}
// Utilisateur de développement
const DEV_USER = {
email: "demo@stripstream.local",
password: "demo123",
userData: {
id: "1",
email: "demo@stripstream.local",
roles: ["ROLE_USER"],
authenticated: true,
} as AuthUser,
};
class AuthService {
private static instance: AuthService;
@@ -36,23 +25,79 @@ class AuthService {
* Authentifie un utilisateur
*/
async login(email: string, password: string, remember: boolean = false): Promise<void> {
// En développement, on vérifie juste l'utilisateur de démo
if (email === DEV_USER.email && password === DEV_USER.password) {
storageService.setUserData(DEV_USER.userData, remember);
return;
}
try {
const response = await fetch("/api/auth/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ email, password, remember }),
});
throw {
code: "INVALID_CREDENTIALS",
message: "Email ou mot de passe incorrect",
} as AuthError;
if (!response.ok) {
const data = await response.json();
throw data.error;
}
const data = await response.json();
if (data.user) {
storageService.setUserData(data.user, remember);
}
} catch (error) {
if ((error as AuthError).code) {
throw error;
}
throw {
code: "SERVER_ERROR",
message: "Une erreur est survenue lors de la connexion",
} as AuthError;
}
}
/**
* Crée un nouvel utilisateur
*/
async register(email: string, password: string): Promise<void> {
try {
const response = await fetch("/api/auth/register", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ email, password }),
});
if (!response.ok) {
const data = await response.json();
throw data.error;
}
const data = await response.json();
if (data.user) {
storageService.setUserData(data.user, false);
}
} catch (error) {
if ((error as AuthError).code) {
throw error;
}
throw {
code: "SERVER_ERROR",
message: "Une erreur est survenue lors de l'inscription",
} as AuthError;
}
}
/**
* Déconnecte l'utilisateur
*/
logout(): void {
storageService.clear();
async logout(): Promise<void> {
try {
await fetch("/api/auth/logout", {
method: "POST",
});
} finally {
storageService.clear();
}
}
/**