perplexity-hackathon-LawMitra / perplexity_hackathon / src / routes / ngoRoutes.ts
ngoRoutes.ts
Raw
import { Router, Request, Response } from 'express';
import { authenticate, requireRole } from '../middleware/authMiddleware';
import { firebaseService } from '../services/firebaseService';
import { z } from 'zod';

const router = Router();

// Apply authentication middleware to all routes
router.use(authenticate);
router.use(requireRole(['ngo_worker']));

// Get user by phone number
router.get('/users/:phoneNumber', async (req: Request, res: Response) => {
  try {
    const { phoneNumber } = req.params;
    const user = await firebaseService.getUserByPhone(phoneNumber);

    if (!user) {
      return res.status(404).json({
        success: false,
        error: 'User not found',
      });
    }

    const userHistory = await firebaseService.getUserHistory(user.uid);

    res.json({
      success: true,
      data: {
        user,
        history: userHistory,
      },
    });
  } catch (error) {
    console.error('Error fetching user:', error);
    res.status(500).json({
      success: false,
      error: 'Failed to fetch user data',
    });
  }
});

// Get unassigned cases
router.get('/cases/unassigned', async (req: Request, res: Response) => {
  try {
    const cases = await firebaseService.getUnassignedCases();
    res.json({
      success: true,
      data: cases,
    });
  } catch (error) {
    console.error('Error fetching unassigned cases:', error);
    res.status(500).json({
      success: false,
      error: 'Failed to fetch unassigned cases',
    });
  }
});

// Assign case to advocate
router.post('/cases/:caseId/assign', async (req: Request, res: Response) => {
  try {
    const { caseId } = req.params;
    const { advocateId } = req.body;

    await firebaseService.assignCase(caseId, advocateId);

    res.json({
      success: true,
      message: 'Case assigned successfully',
    });
  } catch (error) {
    console.error('Error assigning case:', error);
    res.status(500).json({
      success: false,
      error: 'Failed to assign case',
    });
  }
});

// Add follow-up question
const followUpSchema = z.object({
  question: z.string().min(1),
  caseId: z.string(),
});

router.post('/follow-up', async (req: Request, res: Response) => {
  try {
    const validatedData = followUpSchema.parse(req.body);
    await firebaseService.addFollowUp(validatedData.caseId, validatedData.question, req.user!.uid);

    res.json({
      success: true,
      message: 'Follow-up question added successfully',
    });
  } catch (error) {
    if (error instanceof z.ZodError) {
      return res.status(400).json({
        success: false,
        error: 'Validation error',
        details: error.errors,
      });
    }

    console.error('Error adding follow-up:', error);
    res.status(500).json({
      success: false,
      error: 'Failed to add follow-up question',
    });
  }
});

export default router;