perplexity-hackathon-LawMitra / perplexity_hackathon / src / routes / twilioRoutes.ts
twilioRoutes.ts
Raw
import express from 'express';
import { TwilioService } from '../services/twilioService';
import { LegalQuestionService } from '../services/legalQuestionService';
import { SimplificationService } from '../services/simplificationService';
import { VoiceService } from '../services/voiceService';
import { TTSService } from '../services/ttsService';
import { Request } from 'express';

const router = express.Router();
const twilioService = new TwilioService();
const legalQuestionService = new LegalQuestionService();
const simplificationService = new SimplificationService();
const voiceService = new VoiceService();
const ttsService = new TTSService();

router.post('/webhook', async (req, res) => {
  try {
    // Validate that the request is coming from Twilio
    const isValidRequest = twilioService.validateWebhook(
      req.headers['x-twilio-signature'] as string,
      req.url,
      req.body
    );
    if (!isValidRequest) {
      return res.status(403).json({ error: 'Invalid request signature' });
    }

    const messageType = req.body.MediaContentType0 ? 'voice' : 'text';
    let question: string;

    if (messageType === 'voice') {
      // Download and transcribe voice message
      const mediaUrl = req.body.MediaUrl0;
      const voiceBuffer = await twilioService.downloadVoiceMessage(mediaUrl);
      question = await voiceService.transcribeAudio(voiceBuffer);
    } else {
      // Get text message
      question = req.body.Body;
    }

    // Get legal answer
    const legalAnswer = await legalQuestionService.getLegalAnswer(question);

    // Simplify the answer
    const simplifiedAnswer = await simplificationService.simplifyText(legalAnswer);
    const simplifiedText = typeof simplifiedAnswer === 'string' ? simplifiedAnswer : simplifiedAnswer.text;

    // Prepare response
    if (messageType === 'voice') {
      // Generate voice response
      const audioBuffer = await ttsService.generateSpeech({ text: simplifiedText });
      await twilioService.sendVoiceMessage(req.body.From, audioBuffer.audioContent);
      // Also send text for reference
      await twilioService.sendTextMessage(req.body.From, simplifiedText);
    } else {
      // Send text response
      await twilioService.sendTextMessage(req.body.From, simplifiedText);
    }

    res.status(200).send();
  } catch (error) {
    console.error('Error processing Twilio webhook:', error);
    res.status(500).json({ error: 'Internal server error' });
  }
});

export default router;