diff --git a/public/js/piscina.js b/public/js/piscina.js index 0c99783..c8309a3 100644 --- a/public/js/piscina.js +++ b/public/js/piscina.js @@ -29,14 +29,25 @@ document.addEventListener('DOMContentLoaded', async () => { tipoRutina.textContent = rutina.tipoCompetencia; modalidadRutina.textContent = modalidad; - const atletas = await fetch('/api/users/athletes').then(res => res.json()); - atletas.forEach(a => { - const opt = document.createElement('option'); - opt.value = a._id; - opt.textContent = a.name; - select.appendChild(opt); - }); +const atletas = await fetch('/api/users/athletes').then(res => res.json()); +atletas.forEach(a => { + const opt = document.createElement('option'); + opt.value = JSON.stringify({ id: a._id, nombre: a.name, idPers: a.idPersonalizado }); + opt.textContent = `${a.name} (${a.idPersonalizado || 'sin ID'})`; + select.appendChild(opt); +}); + +select.addEventListener('change', () => { + const datos = JSON.parse(select.value || '{}'); + if (datos.idPers) { + document.getElementById('idPersonalizado').value = datos.idPers; + document.getElementById('idPersonalizado').disabled = true; + } else { + document.getElementById('idPersonalizado').value = ''; + document.getElementById('idPersonalizado').disabled = false; + } +}); let figurasFINA = []; try { const res = await fetch('/catalog/figurasFINA.json'); diff --git a/public/piscina.html b/public/piscina.html index 13404b4..8d7f051 100644 --- a/public/piscina.html +++ b/public/piscina.html @@ -57,7 +57,8 @@
- + +
diff --git a/routes/auth.js b/routes/auth.js index 541efa9..0e8b9ad 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -4,27 +4,33 @@ const mongoose = require('mongoose'); const bcrypt = require('bcrypt'); require('dotenv').config(); -// === Conexión a MongoDB === 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)); -// === Modelo de usuario === +// 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' }, // <- CAMPO AÑADIDO - createdAt: { type: Date, default: Date.now } + language: { type: String, default: 'es' }, + createdAt: { type: Date, default: Date.now }, + idPersonalizado: { type: String, unique: true } // <- CAMBIO AQUÍ }); const User = mongoose.model('User', userSchema); -// === Ruta: Registro de usuario === +// 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; @@ -33,19 +39,34 @@ router.post('/register', async (req, res) => { if (existing) return res.status(400).send('Correo ya registrado'); const passwordHash = await bcrypt.hash(password, 10); - const user = new User({ name, username, email, passwordHash, role, language }); + + 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.redirect('/index.html'); res.status(200).send('Usuario registrado correctamente'); - } catch (error) { console.error('Error en registro:', error); res.status(500).send('Error interno del servidor'); } }); -// === Ruta: Login de usuario === +// Login router.post('/login', async (req, res) => { const { email, password } = req.body; @@ -60,7 +81,7 @@ router.post('/login', async (req, res) => { userId: user._id, name: user.name, role: user.role, - language: user.language // <- También puedes enviar este dato al frontend + language: user.language }); } catch (error) { console.error('Error en login:', error); diff --git a/routes/user.js b/routes/user.js index 3a5c2bf..5eaa6e5 100644 --- a/routes/user.js +++ b/routes/user.js @@ -2,7 +2,8 @@ const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, - role: String + role: String, + idPersonalizado: { type: String, unique: true } }); module.exports = mongoose.models.User || mongoose.model('User', userSchema); diff --git a/routes/users.js b/routes/users.js index b2fe061..f0d6717 100644 --- a/routes/users.js +++ b/routes/users.js @@ -13,7 +13,7 @@ router.get('/athletes', async (req, res) => { const db = client.db('swimartdb'); const athletes = await db.collection('users') .find({ role: 'athlete' }) - .project({ _id: 1, name: 1 }) + .project({ _id: 1, name: 1, idPersonalizado: 1 }) .toArray(); res.json(athletes);