perplexity-hackathon-LawMitra / perplexity_hackathon / src / middleware / authMiddleware.ts
authMiddleware.ts
Raw
import { Request, Response, NextFunction } from 'express';
import { firebaseService } from '../services/firebaseService';

declare global {
  namespace Express {
    interface Request {
      user?: {
        uid: string;
        role: string;
        email: string;
        name: string;
      };
    }
  }
}

export const authenticate = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  try {
    const authHeader = req.headers.authorization;
    if (!authHeader?.startsWith('Bearer ')) {
      return res.status(401).json({ error: 'No token provided' });
    }

    const token = authHeader.split('Bearer ')[1];
    const decodedToken = await firebaseService.auth.verifyIdToken(token);
    const userRole = await firebaseService.getUserRole(decodedToken.uid);

    if (!userRole) {
      return res.status(403).json({ error: 'User not found' });
    }

    req.user = {
      uid: decodedToken.uid,
      role: userRole.role,
      email: userRole.email,
      name: userRole.name,
    };

    next();
  } catch (error) {
    console.error('Auth error:', error);
    res.status(401).json({ error: 'Invalid token' });
  }
};

export const requireRole = (roles: string[]) => {
  return (req: Request, res: Response, next: NextFunction) => {
    if (!req.user) {
      return res.status(401).json({ error: 'Authentication required' });
    }

    if (!roles.includes(req.user.role)) {
      return res.status(403).json({ error: 'Insufficient permissions' });
    }

    next();
  };
};