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;