diff --git a/src/errors/AppError.ts b/src/errors/AppError.ts index f45c974..70b3ba1 100644 --- a/src/errors/AppError.ts +++ b/src/errors/AppError.ts @@ -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'), } \ No newline at end of file diff --git a/src/middleware/verifyAuth.ts b/src/middleware/verifyAuth.ts index df2a836..9606b07 100644 --- a/src/middleware/verifyAuth.ts +++ b/src/middleware/verifyAuth.ts @@ -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 } } \ No newline at end of file diff --git a/src/routes/auth.ts b/src/routes/auth.ts index f1518a9..b355a0b 100644 --- a/src/routes/auth.ts +++ b/src/routes/auth.ts @@ -19,6 +19,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,6 +35,7 @@ export default async function authRoutes(fastify: FastifyInstance) { httpOnly: true, sameSite: 'strict', maxAge: 60 * 60 * 24 * 7, + path: '/', }) return reply.status(200).send({ user }) diff --git a/src/routes/users.ts b/src/routes/users.ts index 7aa9bc5..f4bb5af 100644 --- a/src/routes/users.ts +++ b/src/routes/users.ts @@ -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 }) + }) } \ No newline at end of file diff --git a/src/schemas/user.schema.ts b/src/schemas/user.schema.ts new file mode 100644 index 0000000..db10236 --- /dev/null +++ b/src/schemas/user.schema.ts @@ -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 \ No newline at end of file diff --git a/src/services/user.service.ts b/src/services/user.service.ts index f371b3e..fa22dcc 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -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, + }, + }) } \ No newline at end of file diff --git a/src/types/fastify.d.ts b/src/types/fastify.d.ts index 6e92df4..c1dddae 100644 --- a/src/types/fastify.d.ts +++ b/src/types/fastify.d.ts @@ -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 + } + } } \ No newline at end of file