control audio remoto
This commit is contained in:
56
src/app.js
56
src/app.js
@@ -13,6 +13,7 @@ const googleClient = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);
|
||||
|
||||
//importando rutas
|
||||
const rutasGlobales = require('./rutas/rutasGlobales');
|
||||
const rutas_auth = require('./rutas/rutas_auth');
|
||||
|
||||
//configuraciones
|
||||
var puertoApp=2000;
|
||||
@@ -32,7 +33,7 @@ app.use(myConecction(mysql,{
|
||||
user:'admin',
|
||||
password:'Dx.1706%',
|
||||
port:3306,
|
||||
database:'AUDIO_CTRL'
|
||||
database:'AUDIO_CTRL',
|
||||
},'single'));
|
||||
//cuando reciba dato desde req body
|
||||
app.use(express.urlencoded({extended:false}));
|
||||
@@ -40,6 +41,7 @@ app.use(express.json()); // Middleware para parsear JSON
|
||||
|
||||
//rutas
|
||||
app.use('/', rutasGlobales);
|
||||
app.use('/api/auth', rutas_auth); // Es mejor agrupar las rutas de autenticación
|
||||
//prueba de json directa
|
||||
app.get('/pruebaJson',function(req,res){
|
||||
res.json([
|
||||
@@ -60,58 +62,6 @@ app.get('/cmd', (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// --- NUEVA RUTA DE AUTENTICACIÓN CON GOOGLE ---
|
||||
app.post('/api/auth/google', (req, res) => {
|
||||
const { token } = req.body;
|
||||
|
||||
if (!token) {
|
||||
return res.status(400).json({ message: 'No se proporcionó el token de Google.' });
|
||||
}
|
||||
|
||||
req.getConnection(async (err, conn) => {
|
||||
if (err) {
|
||||
console.error("Error de conexión a la BD:", err);
|
||||
return res.status(500).json({ message: "Error de conexión a la base de datos" });
|
||||
}
|
||||
|
||||
try {
|
||||
// 1. Verificar el token de Google
|
||||
const ticket = await googleClient.verifyIdToken({
|
||||
idToken: token,
|
||||
audience: process.env.GOOGLE_CLIENT_ID,
|
||||
});
|
||||
const { sub: googleId, email, name, picture } = ticket.getPayload();
|
||||
|
||||
// 2. Buscar o crear el usuario en la base de datos
|
||||
conn.query('SELECT * FROM users WHERE email = ?', [email], (err, rows) => {
|
||||
if (err) throw err;
|
||||
|
||||
let user = rows[0];
|
||||
if (!user) {
|
||||
// Crear nuevo usuario
|
||||
const newUser = { google_id: googleId, email, name, picture_url: picture };
|
||||
conn.query('INSERT INTO users SET ?', newUser, (err, result) => {
|
||||
if (err) throw err;
|
||||
user = { id: result.insertId, ...newUser };
|
||||
generateTokenAndRespond(user, res);
|
||||
});
|
||||
} else {
|
||||
// Usuario existente
|
||||
generateTokenAndRespond(user, res);
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error en la autenticación con Google:', error);
|
||||
res.status(401).json({ message: 'Token de Google inválido o expirado.' });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function generateTokenAndRespond(user, res) {
|
||||
// 3. Crear nuestro propio token (JWT) para la sesión
|
||||
const appToken = jwt.sign({ userId: user.id, email: user.email }, process.env.JWT_SECRET, { expiresIn: '7d' });
|
||||
res.status(200).json({ message: 'Autenticación exitosa', token: appToken, user });
|
||||
}
|
||||
|
||||
//archivos staticos
|
||||
app.use(express.static(path.join(__dirname, 'public')));
|
||||
|
||||
67
src/controladores/controlador_auth.js
Normal file
67
src/controladores/controlador_auth.js
Normal file
@@ -0,0 +1,67 @@
|
||||
const controlador_auth = {};
|
||||
const { OAuth2Client } = require('google-auth-library'); // Cliente de Google
|
||||
const jwt = require('jsonwebtoken'); // JSON Web Token
|
||||
|
||||
const googleClient = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);
|
||||
|
||||
function generateTokenAndRespond(user, res) {
|
||||
// Crear nuestro propio token (JWT) para la sesión
|
||||
const appToken = jwt.sign({ userId: user.id, email: user.email }, process.env.JWT_SECRET, { expiresIn: '7d' });
|
||||
res.status(200).json({ message: 'Autenticación exitosa', token: appToken, user });
|
||||
}
|
||||
|
||||
// --- NUEVA RUTA DE AUTENTICACIÓN CON GOOGLE ---
|
||||
controlador_auth.authenticateWithGoogle = (req, res) => {
|
||||
const { token } = req.body;
|
||||
|
||||
if (!token) {
|
||||
return res.status(400).json({ message: 'No se proporcionó el token de Google.' });
|
||||
}
|
||||
|
||||
req.getConnection(async (err, conn) => {
|
||||
if (err) {
|
||||
console.error("Error de conexión a la BD:", err);
|
||||
return res.status(500).json({ message: "Error de conexión a la base de datos" });
|
||||
}
|
||||
|
||||
try {
|
||||
// 1. Verificar token de Google
|
||||
const ticket = await googleClient.verifyIdToken({
|
||||
idToken: token,
|
||||
audience: process.env.GOOGLE_CLIENT_ID,
|
||||
});
|
||||
const { sub: googleId, email, name, picture } = ticket.getPayload();
|
||||
|
||||
// 2. Buscar usuario por email
|
||||
conn.query('SELECT * FROM users WHERE email = ?', [email], (err, rows) => {
|
||||
if (err) {
|
||||
console.error("Error en consulta SQL:", err);
|
||||
return res.status(500).json({ message: "Error en la base de datos" });
|
||||
}
|
||||
|
||||
const user = rows[0];
|
||||
|
||||
if (!user) {
|
||||
// Crear nuevo usuario
|
||||
const newUser = { google_id: googleId, email, name, picture_url: picture };
|
||||
conn.query('INSERT INTO users SET ?', newUser, (err, result) => {
|
||||
if (err) {
|
||||
console.error("Error al crear usuario:", err);
|
||||
return res.status(500).json({ message: "Error al registrar usuario" });
|
||||
}
|
||||
const createdUser = { id: result.insertId, ...newUser };
|
||||
generateTokenAndRespond(createdUser, res);
|
||||
});
|
||||
} else {
|
||||
// Usuario existente
|
||||
generateTokenAndRespond(user, res);
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error en autenticación con Google:', error.message);
|
||||
return res.status(401).json({ message: 'Token de Google inválido o expirado.' });
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = controlador_auth;
|
||||
@@ -118,7 +118,8 @@ $(document).ready(function() {
|
||||
youtubePlaylist.forEach((video, index) => {
|
||||
$playlistEl.append(`<li><a href="#" data-video-id="${video.video_id}" data-index="${index}">${video.title || video.video_id}</a></li>`);
|
||||
});
|
||||
$playlistEl.find('a').on('click', function(e) {
|
||||
// Usar delegación de eventos para los elementos de la playlist
|
||||
$playlistEl.off('click', 'a').on('click', 'a', function(e) {
|
||||
e.preventDefault();
|
||||
playVideo($(this).data('index'));
|
||||
});
|
||||
@@ -128,28 +129,30 @@ $(document).ready(function() {
|
||||
if (youtubePlaylist.length > 0 && index >= 0 && index < youtubePlaylist.length) {
|
||||
currentVideoIndex = index;
|
||||
youtubePlayer.loadVideoById(youtubePlaylist[currentVideoIndex].video_id);
|
||||
youtubePlayer.playVideo();
|
||||
$('#yt-play-pause i').text('pause'); // Cambiar icono a pausa
|
||||
// No es necesario llamar a playVideo() aquí, onPlayerReady o el evento de click lo harán.
|
||||
// El estado del icono se actualizará en onPlayerStateChange.
|
||||
}
|
||||
}
|
||||
|
||||
function playNextVideo() {
|
||||
if (youtubePlaylist.length === 0) return;
|
||||
currentVideoIndex = (currentVideoIndex + 1) % youtubePlaylist.length;
|
||||
playVideo(currentVideoIndex);
|
||||
}
|
||||
|
||||
// Eventos para los controles del reproductor de YouTube
|
||||
$('#yt-play-pause').on('click', function() {
|
||||
const $icon = $(this).find('i');
|
||||
if (youtubePlayer.getPlayerState() == YT.PlayerState.PLAYING || youtubePlayer.getPlayerState() == YT.PlayerState.BUFFERING) {
|
||||
youtubePlayer.pauseVideo();
|
||||
$(this).find('i').text('play_arrow');
|
||||
$icon.text('play_arrow');
|
||||
} else {
|
||||
if (youtubePlaylist.length > 0 && youtubePlayer.getPlayerState() == YT.PlayerState.UNSTARTED) {
|
||||
playVideo(currentVideoIndex); // Si no ha empezado, empieza el video actual
|
||||
} else {
|
||||
youtubePlayer.playVideo();
|
||||
}
|
||||
$(this).find('i').text('pause');
|
||||
$icon.text('pause');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
8
src/rutas/rutas_auth.js
Normal file
8
src/rutas/rutas_auth.js
Normal file
@@ -0,0 +1,8 @@
|
||||
const express = require('express');
|
||||
const rutas_auth = express.Router();
|
||||
|
||||
const controlador_auth = require('../controladores/controlador_auth');
|
||||
//ver listar items /formulario/:varNomCampoDb, controlador clase.funcion
|
||||
rutas_auth.post('/google', controlador_auth.authenticateWithGoogle); // Cambiado a POST y nombre más descriptivo
|
||||
|
||||
module.exports = rutas_auth;
|
||||
Reference in New Issue
Block a user