skailan-core
Version:
Servicio de autenticación y multitenancy para Skailan.
115 lines • 4.24 kB
JavaScript
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