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;