changement
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
const { z } = require("zod");
|
||||
const { emailSchema } = require("./email.validation");
|
||||
|
||||
const createEmployeeSchema = z.object({
|
||||
firstname: z.string().min(2),
|
||||
lastname: z.string().min(2),
|
||||
email: z.string().email(),
|
||||
password: z.string().min(8),
|
||||
// Pas de mot de passe : il est généré côté serveur (voir createEmployee).
|
||||
email: emailSchema,
|
||||
birthdate: z.string().optional(),
|
||||
gender: z.string().optional(),
|
||||
});
|
||||
|
||||
@@ -1,17 +1,27 @@
|
||||
const { z } = require("zod");
|
||||
const { passwordSchema } = require("./password.validation");
|
||||
const { emailSchema } = require("./email.validation");
|
||||
|
||||
const registerSchema = z.object({
|
||||
firstname: z.string().min(2, "Le prénom doit contenir au moins 2 caractères"),
|
||||
lastname: z.string().min(2, "Le nom doit contenir au moins 2 caractères"),
|
||||
email: z.string().email("Email invalide"),
|
||||
password: z.string().min(8, "Le mot de passe doit contenir au moins 8 caractères"),
|
||||
birthdate: z.string().optional(),
|
||||
gender: z.string().optional(),
|
||||
marketingOptIn: z.boolean().optional(),
|
||||
});
|
||||
const registerSchema = z
|
||||
.object({
|
||||
firstname: z.string().min(2, "Le prénom doit contenir au moins 2 caractères"),
|
||||
lastname: z.string().min(2, "Le nom doit contenir au moins 2 caractères"),
|
||||
email: emailSchema,
|
||||
password: passwordSchema,
|
||||
// Vérifiée aussi côté serveur : le contrôle du navigateur ne protège pas
|
||||
// un appel direct à l'API.
|
||||
confirmPassword: z.string({ error: "Veuillez confirmer le mot de passe" }),
|
||||
birthdate: z.string().optional(),
|
||||
gender: z.string().optional(),
|
||||
marketingOptIn: z.boolean().optional(),
|
||||
})
|
||||
.refine((data) => data.password === data.confirmPassword, {
|
||||
message: "Les deux mots de passe ne correspondent pas",
|
||||
path: ["confirmPassword"],
|
||||
});
|
||||
|
||||
const loginSchema = z.object({
|
||||
email: z.string().email("Email invalide"),
|
||||
email: emailSchema,
|
||||
password: z.string().min(1, "Mot de passe requis"),
|
||||
});
|
||||
|
||||
|
||||
11
backend/src/validations/email.validation.js
Normal file
11
backend/src/validations/email.validation.js
Normal file
@@ -0,0 +1,11 @@
|
||||
const { z } = require("zod");
|
||||
|
||||
// Les emails sont stockés et recherchés en minuscules, sans espaces autour :
|
||||
// « Jean@Exemple.fr » et « jean@exemple.fr » désignent le même compte.
|
||||
function normalizeEmail(email) {
|
||||
return typeof email === "string" ? email.trim().toLowerCase() : email;
|
||||
}
|
||||
|
||||
const emailSchema = z.string().trim().toLowerCase().email("Email invalide");
|
||||
|
||||
module.exports = { emailSchema, normalizeEmail };
|
||||
21
backend/src/validations/password.validation.js
Normal file
21
backend/src/validations/password.validation.js
Normal file
@@ -0,0 +1,21 @@
|
||||
const { z } = require("zod");
|
||||
|
||||
// Règle de mot de passe, reprise à l'identique par le front
|
||||
// (frontend/src/utils/passwordRules.js) : plus de 7 caractères et au moins un
|
||||
// caractère spécial, c'est-à-dire ni lettre (accentuée comprise), ni chiffre,
|
||||
// ni espace.
|
||||
const SPECIAL_CHARACTER = /[^\p{L}\p{N}\s]/u;
|
||||
|
||||
const passwordSchema = z
|
||||
.string()
|
||||
.min(8, "Le mot de passe doit contenir au moins 8 caractères")
|
||||
.regex(SPECIAL_CHARACTER, "Le mot de passe doit contenir au moins un caractère spécial");
|
||||
|
||||
// Pour les contrôleurs qui valident à la main : message de la première règle
|
||||
// non respectée, ou null si le mot de passe est valide.
|
||||
function passwordRuleError(password) {
|
||||
const result = passwordSchema.safeParse(password ?? "");
|
||||
return result.success ? null : `${result.error.issues[0].message}.`;
|
||||
}
|
||||
|
||||
module.exports = { passwordSchema, passwordRuleError, SPECIAL_CHARACTER };
|
||||
Reference in New Issue
Block a user