perplexity-hackathon-LawMitra / perplexity_hackathon / demo / scripts / server.ts
server.ts
Raw
import express from 'express';
import cors from 'cors';
import chalk from 'chalk';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import fs from 'fs/promises';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const app = express();
app.use(cors());
app.use(express.json());

// Load mock data
const dataDir = join(__dirname, '../data');
const [users, cases, questions] = await Promise.all([
  fs.readFile(join(dataDir, 'users.json'), 'utf-8').then(JSON.parse),
  fs.readFile(join(dataDir, 'cases.json'), 'utf-8').then(JSON.parse),
  fs.readFile(join(dataDir, 'questions.json'), 'utf-8').then(JSON.parse),
]);

// Auth endpoints
app.post('/api/auth/login', (req, res) => {
  const { email } = req.body;
  const user = users.users.find(u => u.email === email);
  
  if (!user) {
    return res.status(401).json({ error: 'Invalid credentials' });
  }

  res.json({
    token: 'mock-token',
    user: {
      uid: user.uid,
      name: user.name,
      email: user.email,
      role: user.role,
    },
  });
});

// NGO worker endpoints
app.get('/api/ngo/users/:phoneNumber', (req, res) => {
  const user = users.users.find(u => u.phoneNumber === req.params.phoneNumber);
  
  if (!user) {
    return res.status(404).json({ error: 'User not found' });
  }

  const userCases = cases.cases.filter(c => c.userId === user.uid);
  const userQuestions = questions.questions.filter(q => q.userId === user.uid);

  res.json({
    success: true,
    data: {
      user,
      history: {
        cases: userCases,
        questions: userQuestions,
      },
    },
  });
});

// Advocate endpoints
app.get('/api/advocate/dashboard', (req, res) => {
  const advocateId = req.headers.authorization?.split(' ')[1] || 'adv1';
  const advocateCases = cases.cases.filter(c => c.advocateId === advocateId);

  const stats = {
    totalCases: advocateCases.length,
    activeCases: advocateCases.filter(c => c.status === 'in_progress').length,
    resolvedCases: advocateCases.filter(c => c.status === 'resolved').length,
  };

  res.json({
    success: true,
    data: {
      cases: advocateCases,
      stats,
    },
  });
});

// Legal chat endpoints
app.post('/api/legal/ask-legal-question', (req, res) => {
  const { text, language = 'en' } = req.body;
  
  // Simulate processing delay
  setTimeout(() => {
    const mockResponse = {
      text: `Here is a legal response to your question: "${text}"`,
      language,
      timestamp: new Date().toISOString(),
    };

    res.json(mockResponse);
  }, 1000);
});

const port = process.env.PORT || 3001;

app.listen(port, () => {
  console.log(chalk.green(`Demo server running on port ${port}`));
  console.log(chalk.blue('Available mock data:'));
  console.log(chalk.yellow('- Users:'), users.users.length);
  console.log(chalk.yellow('- Cases:'), cases.cases.length);
  console.log(chalk.yellow('- Questions:'), questions.questions.length);
});