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

declare global {
  namespace Express {
    interface Request {
      sessionId?: string;
      language?: {
        code: string;
        code3: string;
        name: string;
        confidence: number;
      };
    }
  }
}

export const languageMiddleware = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  try {
    // Generate or get session ID from headers or cookies
    const sessionId = req.headers['x-session-id'] as string || 
                     req.cookies?.sessionId ||
                     `session_${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;

    // Add session ID to request
    req.sessionId = sessionId;

    // Try to get language preference
    const languagePreference = languageService.getLanguagePreference(sessionId);
    
    if (languagePreference) {
      req.language = languagePreference;
      // Set response header for client reference
      res.setHeader('X-Detected-Language', languagePreference.code);
      return next();
    }

    // If no stored preference, try to detect from request
    if (req.body?.text) {
      // Detect from text in request body
      const detected = await languageService.detectFromText(req.body.text, sessionId);
      req.language = detected;
      res.setHeader('X-Detected-Language', detected.code);
    } else {
      // Default to English if no text to detect from
      req.language = {
        code: 'en',
        code3: 'eng',
        name: 'English',
        confidence: 1.0,
      };
      res.setHeader('X-Detected-Language', 'en');
    }

    // Set session ID header for client to store
    res.setHeader('X-Session-ID', sessionId);
    next();
  } catch (error) {
    console.error('Error in language middleware:', error);
    // Don't fail the request on language detection error
    next();
  }
};