2 Commits

Author SHA1 Message Date
886dfa4f24 route et logique du logout 2026-04-01 21:43:35 +02:00
9e247a3bfc route et logique pour update du display name 2026-04-01 21:30:47 +02:00
8 changed files with 77 additions and 4 deletions

View File

@@ -25,4 +25,5 @@ export const Errors = {
//Auth errors
UNAUTHORIZED: new AppError('UNAUTHORIZED', 401, 'Non authentifié'),
USER_NOT_FOUND: new AppError('USER_NOT_FOUND', 404, 'Utilisateur introuvable'),
}

View File

@@ -4,13 +4,16 @@ import { Errors } from '../errors/AppError.js'
export async function verifyAuth(request: FastifyRequest, reply: FastifyReply) {
const token = request.cookies['authToken']
console.log('token reçu:', token)
if (!token) throw Errors.UNAUTHORIZED
try {
const payload = await verifyAuthToken(request.server, request.server.prisma, token)
console.log('payload:', payload)
request.user = payload
} catch {
} catch (e) {
console.log('erreur:', e)
throw Errors.UNAUTHORIZED
}
}

View File

@@ -1,7 +1,8 @@
import { FastifyInstance } from 'fastify'
import { RegisterSchema, LoginSchema } from '../schemas/auth.schema.js'
import { registerUser, loginUser } from '../services/auth.service.js'
import { registerUser, loginUser, logoutUser } from '../services/auth.service.js'
import { signAuthToken } from '../services/authToken.service.js'
import { verifyAuth } from '../middleware/verifyAuth.js'
export default async function authRoutes(fastify: FastifyInstance) {
fastify.post('/auth/register', async (request, reply) => {
@@ -19,6 +20,7 @@ export default async function authRoutes(fastify: FastifyInstance) {
httpOnly: true,
sameSite: 'strict',
maxAge: 60 * 60 * 24 * 7,
path: '/',
})
return reply.status(201).send({ user })
@@ -34,8 +36,15 @@ export default async function authRoutes(fastify: FastifyInstance) {
httpOnly: true,
sameSite: 'strict',
maxAge: 60 * 60 * 24 * 7,
path: '/',
})
return reply.status(200).send({ user })
})
fastify.post('/auth/logout', { preHandler: verifyAuth }, async (request, reply) => {
await logoutUser(fastify.prisma, request.user.userId)
reply.clearCookie('authToken', { path: '/' })
return reply.status(200).send({ message: 'Déconnecté avec succès' })
})
}

View File

@@ -1,6 +1,10 @@
import { FastifyInstance } from 'fastify'
import { Errors } from '../errors/AppError'
import { confirmEmail } from '../services/user.service'
import { verifyAuth } from '../middleware/verifyAuth'
import { UpdateDisplayNameSchema } from '../schemas/user.schema.js'
import { updateDisplayName } from '../services/user.service.js'
export default async function userRoutes(fastify: FastifyInstance) {
fastify.get('/users', async (request, reply) => {
@@ -27,6 +31,12 @@ export default async function userRoutes(fastify: FastifyInstance) {
}
const result = await confirmEmail(fastify.prisma, token)
return reply.status(200).send(result)
})
return reply.status(200).send(result)
})
fastify.patch('/user/display-name', { preHandler: verifyAuth }, async (request, reply) => {
const body = UpdateDisplayNameSchema.parse(request.body)
const user = await updateDisplayName(fastify.prisma, request.user.userId, body)
return reply.status(200).send({ user })
})
}

View File

@@ -0,0 +1,7 @@
import { z } from 'zod'
export const UpdateDisplayNameSchema = z.object({
displayName: z.string().min(2).max(32),
})
export type UpdateDisplayNameInput = z.infer<typeof UpdateDisplayNameSchema>

View File

@@ -68,4 +68,11 @@ export async function loginUser(prisma: PrismaClient, input: LoginInput) {
tokenVersion: user.tokenVersion,
},
}
}
export async function logoutUser(prisma: PrismaClient, userId: string) {
await prisma.user.update({
where: { id: userId },
data: { tokenVersion: { increment: 1 } },
})
}

View File

@@ -1,5 +1,6 @@
import { PrismaClient } from '../generated/prisma/client.js'
import { Errors } from '../errors/AppError.js'
import { UpdateDisplayNameInput } from '../schemas/user.schema.js'
export async function confirmEmail(prisma: PrismaClient, token: string) {
const actionToken = await prisma.actionToken.findUnique({
@@ -34,4 +35,26 @@ export async function confirmEmail(prisma: PrismaClient, token: string) {
])
return { success: true }
}
export async function updateDisplayName(
prisma: PrismaClient,
userId: string,
input: UpdateDisplayNameInput
) {
const user = await prisma.user.findUnique({ where: { id: userId } })
if (!user) throw Errors.USER_NOT_FOUND
return await prisma.user.update({
where: { id: userId },
data: { displayName: input.displayName },
select: {
id: true,
email: true,
displayName: true,
avatar: true,
isConfirmed: true,
createdAt: true,
},
})
}

View File

@@ -11,4 +11,17 @@ declare module 'fastify' {
tokenVersion: number
}
}
}
declare module '@fastify/jwt' {
interface FastifyJWT {
payload: {
userId: string
tokenVersion: number
}
user: {
userId: string
tokenVersion: number
}
}
}