Spaces:
Build error
Build error
File size: 1,919 Bytes
ef73937 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import type { FastifyRequest, FastifyReply, FastifyInstance } from 'fastify';
import { getSessionUser } from './session.js';
import { userRepository } from '@core/storage/repositories/users.js';
declare module 'fastify' {
interface FastifyRequest {
user?: {
id: string;
username: string;
isAdmin: boolean;
isBanned: boolean;
};
sessionId?: string;
}
}
export async function authMiddleware(request: FastifyRequest, reply: FastifyReply): Promise<void> {
const sessionId = request.cookies?.session_id;
if (!sessionId) return;
request.sessionId = sessionId;
const user = await getSessionUser(sessionId);
if (user) {
request.user = user;
}
}
export async function requireAuth(request: FastifyRequest, reply: FastifyReply): Promise<void> {
if (!request.user) {
return reply.status(401).send({ error: 'Authentication required' });
}
}
export async function requireAdmin(request: FastifyRequest, reply: FastifyReply): Promise<void> {
if (!request.user) {
return reply.status(401).send({ error: 'Authentication required' });
}
if (!request.user.isAdmin) {
return reply.status(403).send({ error: 'Admin access required' });
}
}
export async function optionalAuth(request: FastifyRequest, reply: FastifyReply): Promise<void> {
const sessionId = request.cookies?.session_id;
if (!sessionId) return;
request.sessionId = sessionId;
const user = await getSessionUser(sessionId);
if (user) {
request.user = user;
}
}
export async function checkBanned(request: FastifyRequest, reply: FastifyReply): Promise<void> {
if (request.user?.isBanned) {
const user = await userRepository.findById(request.user.id);
return reply.status(403).send({
error: 'Account banned',
reason: user?.banReason,
});
}
}
export function setupAuthHooks(app: FastifyInstance): void {
app.addHook('preHandler', authMiddleware);
} |