93 lines
2.6 KiB
JavaScript
93 lines
2.6 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const mongoose = require('mongoose');
|
|
const bcrypt = require('bcrypt');
|
|
require('dotenv').config();
|
|
|
|
mongoose.connect(process.env.MONGODB_URI, {
|
|
useNewUrlParser: true,
|
|
useUnifiedTopology: true
|
|
}).then(() => console.log('[auth.js] Conectado a MongoDB'))
|
|
.catch(err => console.error(' [auth.js] Error de conexión:', err));
|
|
|
|
// Schema corregido
|
|
const userSchema = new mongoose.Schema({
|
|
name: String,
|
|
username: { type: String, unique: true, required: true },
|
|
email: { type: String, unique: true, required: true },
|
|
passwordHash: String,
|
|
role: { type: String, enum: ['coach', 'athlete'], required: true },
|
|
language: { type: String, default: 'es' },
|
|
createdAt: { type: Date, default: Date.now },
|
|
idPersonalizado: { type: String, unique: true } // <- CAMBIO AQUÍ
|
|
});
|
|
|
|
const User = mongoose.model('User', userSchema);
|
|
|
|
// Genera ID como JP, FM, etc.
|
|
function generarIdPersonalizado(name) {
|
|
const [nombre, apellido = ''] = name.trim().toUpperCase().split(' ');
|
|
return (nombre[0] || '') + (apellido[0] || '');
|
|
}
|
|
|
|
// Registro de usuario
|
|
router.post('/register', async (req, res) => {
|
|
const { name, username, email, password, role, language } = req.body;
|
|
|
|
try {
|
|
const existing = await User.findOne({ email });
|
|
if (existing) return res.status(400).send('Correo ya registrado');
|
|
|
|
const passwordHash = await bcrypt.hash(password, 10);
|
|
|
|
let idPersonalizado = generarIdPersonalizado(name);
|
|
|
|
const repetido = await User.findOne({ idPersonalizado });
|
|
if (repetido) {
|
|
idPersonalizado += Math.floor(100 + Math.random() * 900);
|
|
}
|
|
|
|
const user = new User({
|
|
name,
|
|
username,
|
|
email,
|
|
passwordHash,
|
|
role,
|
|
language,
|
|
idPersonalizado // <- CAMBIO AQUÍ
|
|
});
|
|
|
|
await user.save();
|
|
|
|
res.status(200).send('Usuario registrado correctamente');
|
|
} catch (error) {
|
|
console.error('Error en registro:', error);
|
|
res.status(500).send('Error interno del servidor');
|
|
}
|
|
});
|
|
|
|
// Login
|
|
router.post('/login', async (req, res) => {
|
|
const { email, password } = req.body;
|
|
|
|
try {
|
|
const user = await User.findOne({ email });
|
|
if (!user) return res.status(401).send('Correo no registrado');
|
|
|
|
const valid = await bcrypt.compare(password, user.passwordHash);
|
|
if (!valid) return res.status(401).send('Contraseña incorrecta');
|
|
|
|
res.json({
|
|
userId: user._id,
|
|
name: user.name,
|
|
role: user.role,
|
|
language: user.language
|
|
});
|
|
} catch (error) {
|
|
console.error('Error en login:', error);
|
|
res.status(500).send('Error interno del servidor');
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|