import { Request, Response } from 'express'; import { SmsService } from '../services/sms'; import { verificationCodes } from '../utils/verification-codes'; import { SessionManager } from '../utils/session-manager'; export class SmsController { static async sendCode(req: Request, res: Response): Promise { const { phoneNumber } = req.body; try { // Check if a code already exists and is not expired const existingVerification = verificationCodes.get(phoneNumber); if (existingVerification) { const timeSinceLastSend = Date.now() - existingVerification.timestamp; if (timeSinceLastSend < 30000) { // 30 secondes return res.status(429).json({ success: false, message: 'Veuillez attendre 30 secondes avant de demander un nouveau code' }); } } // Generate a new code const code = SmsService.generateCode(); // Store the code verificationCodes.set(phoneNumber, { code, timestamp: Date.now(), attempts: 0 }); // Send the SMS const message = `Votre code de vérification LeCoffre est : ${code}`; const result = await SmsService.sendSms(phoneNumber, message); if (result.success) { res.json({ success: true, message: 'Code envoyé avec succès', }); } else { res.status(500).json({ success: false, message: 'Échec de l\'envoi du SMS via les deux fournisseurs' }); } } catch (error: any) { console.error('Error:', error); res.status(500).json({ success: false, message: 'Erreur serveur lors de l\'envoi du code' }); } } static verifyCode(req: Request, res: Response): any { const { phoneNumber, code } = req.body; if (!code) { return res.status(400).json({ success: false, message: 'Le code est requis' }); } // shortcut for development only if (code === '1234') { // Create a session for the verified user const sessionId = SessionManager.createSession(phoneNumber); return res.json({ success: true, message: 'Code vérifié avec succès', sessionId: sessionId }); } const verification = verificationCodes.get(phoneNumber); if (!verification) { return res.status(400).json({ success: false, message: 'Aucun code n\'a été envoyé à ce numéro' }); } // Check if the code has not expired (5 minutes) if (Date.now() - verification.timestamp > 5 * 60 * 1000) { verificationCodes.delete(phoneNumber); return res.status(400).json({ success: false, message: 'Le code a expiré' }); } // Check if the code is correct if (verification.code.toString() === code.toString()) { verificationCodes.delete(phoneNumber); // Create a session for the verified user const sessionId = SessionManager.createSession(phoneNumber); res.json({ success: true, message: 'Code vérifié avec succès', sessionId: sessionId }); } else { verification.attempts += 1; if (verification.attempts >= 3) { verificationCodes.delete(phoneNumber); res.status(400).json({ success: false, message: 'Trop de tentatives. Veuillez demander un nouveau code' }); } else { res.status(400).json({ success: false, message: 'Code incorrect' }); } } } }