almeira-web/dripzone-app/src/app/api/auth/send-otp/route.ts

70 lines
2.5 KiB
TypeScript

import { NextResponse } from 'next/server';
import { dataService } from '@/lib/data-service';
import { otpStore } from '@/lib/otp-store';
import { sendWhatsAppMessage } from '@/lib/evolution-api';
export async function POST(request: Request) {
try {
const { identifier, name } = await request.json();
if (!identifier) {
return NextResponse.json({ success: false, error: 'Ingresa tu número de celular o correo' }, { status: 400 });
}
const cleanInput = identifier.trim();
// Buscar usuario en base de datos
const user = dataService.authenticate(cleanInput);
let phoneToSend = cleanInput.replace(/\D/g, '');
let userName = name?.trim() || (user ? user.name : 'Cliente');
if (user) {
if (!user.isActive) {
return NextResponse.json({ success: false, error: 'Esta cuenta se encuentra inactiva.' }, { status: 403 });
}
phoneToSend = user.phone.replace(/\D/g, '');
}
if (!phoneToSend || phoneToSend.length < 7) {
return NextResponse.json(
{ success: false, error: 'Número de celular inválido. Ingresa un número válido de WhatsApp.' },
{ status: 400 }
);
}
// Generar código de 6 dígitos
const code = otpStore.generateOtp(cleanInput, phoneToSend);
// Redactar mensaje de seguridad utilizando plantilla
const storeSettings = dataService.getSettings();
const message = dataService.renderMessageTemplate('auth_login_otp', {
tienda_nombre: storeSettings?.storeName || 'DripZone Sneakers',
usuario_nombre: userName,
codigo_otp: code,
});
// Enviar a WhatsApp via Evolution API
const sent = await sendWhatsAppMessage(phoneToSend, message);
if (!sent) {
// Si falla Evolution (o es teléfono internacional sin formato), permitir fallback seguro
console.warn(`[OTP] No se pudo enviar por WhatsApp a ${phoneToSend}. Código generado: ${code}`);
}
// Enmascarar teléfono para la respuesta pública (ej: 316***5877)
const maskedPhone = phoneToSend.length >= 10
? `${phoneToSend.slice(0, 3)}***${phoneToSend.slice(-4)}`
: 'tu número';
return NextResponse.json({
success: true,
message: `Código de 6 dígitos enviado por WhatsApp a ${maskedPhone}`,
phone: maskedPhone,
isRegistered: !!user,
});
} catch (error: any) {
console.error('Error enviando OTP:', error);
return NextResponse.json({ success: false, error: error.message || 'Error al enviar código' }, { status: 500 });
}
}