Compare commits
2 Commits
2f9c7d4f53
...
886dfa4f24
| Author | SHA1 | Date | |
|---|---|---|---|
| 886dfa4f24 | |||
| 9e247a3bfc |
@@ -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'),
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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' })
|
||||
})
|
||||
}
|
||||
@@ -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 })
|
||||
})
|
||||
}
|
||||
7
src/schemas/user.schema.ts
Normal file
7
src/schemas/user.schema.ts
Normal 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>
|
||||
@@ -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 } },
|
||||
})
|
||||
}
|
||||
@@ -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,
|
||||
},
|
||||
})
|
||||
}
|
||||
13
src/types/fastify.d.ts
vendored
13
src/types/fastify.d.ts
vendored
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user