diff --git a/prisma/schema.prisma b/prisma/schema.prisma index afc9d28..0fec6c2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -45,9 +45,9 @@ model User { } model UserPreference { - id String @id @default(uuid()) + id String @id userId String @unique language String @default("fr") theme String @default("light") User User @relation(fields: [userId], references: [id], onDelete: Cascade) -} \ No newline at end of file +} diff --git a/src/routes/auth.ts b/src/routes/auth.ts index ae718d0..f8f96f8 100644 --- a/src/routes/auth.ts +++ b/src/routes/auth.ts @@ -9,10 +9,17 @@ export default async function authRoutes(fastify: FastifyInstance) { fastify.post('/auth/register', async (request, reply) => { const body = RegisterSchema.parse(request.body) // Zod throw → handler global + const lang = request.headers['accept-language'] + ?.split(',')[0] + .split('-')[0] as 'fr' | 'en' + + const validLang = ['fr', 'en'].includes(lang) ? lang : 'fr' + const { user, authToken } = await registerUser( fastify.prisma, fastify.mailer, - body + body, + validLang ) reply.setCookie('authToken', authToken, { diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts index 6f0fb62..f47012b 100644 --- a/src/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -10,7 +10,8 @@ import { Errors } from '../errors/AppError.js' export async function registerUser( prisma: PrismaClient, mailer: Transporter, - input: RegisterInput + input: RegisterInput, + lang: 'fr' | 'en' = 'fr' ) { // 1. Vérif email unique const existing = await prisma.user.findUnique({ @@ -53,8 +54,8 @@ export async function registerUser( }, }) - // 5. Envoi du mail - await sendConfirmationMail(mailer, user.email, confirmToken) + // 5. Envoi du mail avec la langue + await sendConfirmationMail(mailer, user.email, confirmToken, lang) // 6. AuthToken pour la persistance const authToken = generateToken() @@ -66,6 +67,16 @@ export async function registerUser( expiresAt: generateAuthTokenExpiry(), }, }) + + // 7 Création des préférences avec la langue détectée + await prisma.userPreference.create({ + data: { + id: crypto.randomUUID(), + userId: user.id, + language: lang, + theme: 'light', + }, +}) return { user, authToken } } diff --git a/src/services/mail.service.ts b/src/services/mail.service.ts index 999edd9..dfbc33b 100644 --- a/src/services/mail.service.ts +++ b/src/services/mail.service.ts @@ -1,20 +1,51 @@ import { Transporter } from 'nodemailer' +type Lang = 'fr' | 'en' + +const templates = { + fr: (url: string) => ({ + subject: 'Merci de confirmer votre e-mail', + html: ` +
+Bienvenue sur le gestionnaire de listes !
++ Pour pouvoir utiliser le site, vous devez confirmer votre adresse mail sous 7 jours en cliquant sur + + ce lien + . +
+ + `, + }), + en: (url: string) => ({ + subject: 'Please confirm your email address', + html: ` + +Welcome to the list manager!
++ To start using the site, please confirm your email address within 7 days by clicking + + this link + . +
+ + `, + }), +} + export async function sendConfirmationMail( mailer: Transporter, email: string, - token: string + token: string, + lang: Lang = 'fr' ): PromiseMerci de vous être inscrit !
-Cliquez sur ce lien pour confirmer votre adresse mail (valable 24h) :
- ${url} - `, + subject, + html, }) } \ No newline at end of file