UNPKG

skailan-core

Version:

Servicio de autenticación y multitenancy para Skailan.

115 lines 4.24 kB
import { Router } from "express"; import { PrismaClient } from "@prisma/client"; import bcrypt from "bcrypt"; import jwt from "jsonwebtoken"; const router = Router(); // Registro público (sin tenant) router.post("/register", async (req, res) => { try { const { email, password, name } = req.body; // Usar Prisma global para registro const prisma = new PrismaClient(); // Verificar si el usuario ya existe const existingUser = await prisma.user.findUnique({ where: { email }, }); if (existingUser) { return res.status(409).json({ error: "El email ya está registrado." }); } // Hash de la contraseña const hashedPassword = await bcrypt.hash(password, 10); // Crear usuario const user = await prisma.user.create({ data: { email, password: hashedPassword, name, }, }); // Generar token JWT const token = jwt.sign({ id: user.id, email: user.email, name: user.name }, process.env.JWT_SECRET || "secret", { expiresIn: "24h" }); return res.status(201).json({ id: user.id, email: user.email, name: user.name, token }); } catch (err) { return res.status(500).json({ error: err.message || "Error en el registro." }); } }); // Login público (sin tenant) router.post("/login", async (req, res) => { try { const { email, password } = req.body; // Usar Prisma global para login const prisma = new PrismaClient(); // Buscar usuario const user = await prisma.user.findUnique({ where: { email }, }); if (!user) { return res.status(401).json({ error: "Credenciales inválidas." }); } // Verificar contraseña const isValidPassword = await bcrypt.compare(password, user.password); if (!isValidPassword) { return res.status(401).json({ error: "Credenciales inválidas." }); } // Generar token JWT const token = jwt.sign({ id: user.id, email: user.email, name: user.name }, process.env.JWT_SECRET || "secret", { expiresIn: "24h" }); return res.status(200).json({ id: user.id, email: user.email, name: user.name, token }); } catch (err) { return res.status(500).json({ error: err.message || "Error en el login." }); } }); // Recuperación de contraseña pública router.post("/request-password-reset", async (req, res) => { try { const { email } = req.body; // Usar Prisma global const prisma = new PrismaClient(); const user = await prisma.user.findUnique({ where: { email }, }); if (!user) { return res.status(404).json({ error: "Usuario no encontrado." }); } // TODO: Implementar envío de email con token de recuperación // Por ahora solo simulamos el envío console.log(`Password reset requested for: ${email}`); return res.status(200).json({ message: "Correo de recuperación enviado." }); } catch (err) { return res.status(500).json({ error: err.message || "Error al solicitar recuperación." }); } }); // Restablecimiento de contraseña pública router.post("/reset-password", async (req, res) => { try { const { token, password } = req.body; // Usar Prisma global const prisma = new PrismaClient(); // TODO: Verificar token de recuperación // Por ahora simulamos la verificación console.log(`Password reset with token: ${token}`); // TODO: Buscar usuario por token y actualizar contraseña // const user = await prisma.user.update({ // where: { id: userId }, // data: { password: hashedPassword } // }); return res.status(200).json({ message: "Contraseña actualizada." }); } catch (err) { return res.status(500).json({ error: err.message || "Error al restablecer contraseña." }); } }); export default router; //# sourceMappingURL=publicAuth.js.map