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);
}