127 lines
3.5 KiB
TypeScript
127 lines
3.5 KiB
TypeScript
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<any> {
|
|
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'
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|