From 21bd8a7e21fe0fe8b9ffcd1e9808c6b8ac014551 Mon Sep 17 00:00:00 2001 From: german contreras f Date: Sun, 23 Jan 2022 16:51:53 -0300 Subject: [PATCH] fin seccion 10 --- controller/auth.js | 18 ++++++------- controller/mensajes.js | 29 ++++++++++++++++++++ controller/socket.js | 54 ++++++++++++++++++++++++++++++++++++++ controller/usuarios.js | 32 ++++++++++++++++++++++ helpers/jwt.js | 17 +++++++++++- index.js | 2 ++ middlewares/validar-jwt.js | 1 + models/mensaje.js | 33 +++++++++++++++++++++++ routes/auth.js | 1 - routes/mensajes.js | 14 ++++++++++ routes/usuarios.js | 14 ++++++++++ sockets/sockets.js | 37 +++++++++++++++++++++++--- 12 files changed, 237 insertions(+), 15 deletions(-) create mode 100644 controller/mensajes.js create mode 100644 controller/socket.js create mode 100644 controller/usuarios.js create mode 100644 models/mensaje.js create mode 100644 routes/mensajes.js create mode 100644 routes/usuarios.js diff --git a/controller/auth.js b/controller/auth.js index d2c69c9..ee48b9e 100644 --- a/controller/auth.js +++ b/controller/auth.js @@ -54,9 +54,9 @@ const login = async (req, res=response) => { try { - const usuarioDB = await Usuario.findOne({ email }); + const usuario = await Usuario.findOne({ email }); - if (!usuarioDB) { + if (!usuario) { return res.status(404).json({ ok: false, msg: 'Email no encontrado' @@ -64,7 +64,7 @@ const login = async (req, res=response) => { } // validar el password - const validPassword = bcrypt.compareSync(password, usuarioDB.password); + const validPassword = bcrypt.compareSync(password, usuario.password); if (!validPassword) { return res.status(400).json({ @@ -74,11 +74,11 @@ const login = async (req, res=response) => { } // generar JWT - const token = await generarJWT(usuarioDB.id); + const token = await generarJWT(usuario.id); res.json({ ok: true, - usuarioDB, + usuario, token }); @@ -86,7 +86,7 @@ const login = async (req, res=response) => { } catch (error) { console.log(error); res.status(500).json({ - ok: true, + ok: false, msg: process.env.NOTIF_ERROR }); } @@ -106,11 +106,11 @@ const renewToken = async (req, res=response) => { // obtener el usuario desde la base de datos - const usuarioDB = await Usuario.findById(uid); + const usuario = await Usuario.findById(uid); res.json({ ok: true, - usuarioDB, + usuario, token }); @@ -118,7 +118,7 @@ const renewToken = async (req, res=response) => { } catch (error) { console.log(error); res.status(500).json({ - ok: true, + ok: false, msg: process.env.NOTIF_ERROR }); } diff --git a/controller/mensajes.js b/controller/mensajes.js new file mode 100644 index 0000000..17ba220 --- /dev/null +++ b/controller/mensajes.js @@ -0,0 +1,29 @@ +const { response } = require('express'); +const Mensaje = require('../models/mensaje'); + + +const obtenerChat = async (request, response = response) => { + + const miId = request.uid; + const mensajeDe = request.params.de; + + + const last30 = await Mensaje.find({ + $or: [{de: miId, para: mensajeDe}, {de: mensajeDe, para: miId}] + }) + .sort({createdAt: 'desc'}) + .limit(30); + + + return response.json({ + ok: true, + mensajes: last30 + }); + +} + + +module.exports = { + obtenerChat +} + diff --git a/controller/socket.js b/controller/socket.js new file mode 100644 index 0000000..4ad9cbf --- /dev/null +++ b/controller/socket.js @@ -0,0 +1,54 @@ +const Usuario = require('../models/usuario'); +const Mensaje = require('../models/mensaje'); + + +const usuarioConectado = (uid = '') => { + return usuarioEstado(uid, true); +} + +const usuarioDesconectado = (uid = '') => { + return usuarioEstado(uid); +} + +const usuarioEstado = async ( uid = '', estado = false) => { + const usuario = await Usuario.findById(uid); + + usuario.online = estado; + await usuario.save(); + + return usuario; +} + +const grabarMensaje = async (payload) => { + /* + payload = { + de: '', + para: '', + mensaje: '', + } + */ + try { + const mensaje = new Mensaje(payload); + await mensaje.save(); + return true; + } catch (error) { + return false; + } +} + + + +module.exports = { + usuarioConectado, + usuarioDesconectado, + grabarMensaje +} + + + + + + + + + diff --git a/controller/usuarios.js b/controller/usuarios.js new file mode 100644 index 0000000..ceafbd9 --- /dev/null +++ b/controller/usuarios.js @@ -0,0 +1,32 @@ +const { response } = require('express'); +const Usuario = require('../models/usuario'); + + +const getUsuarios = async (request, response = response) => { + + // console.log(request); + + // se agrega en la url mediante ?desde=12 + const desde = Number( request.query.desde ) || 0; + + + const usuarios = await Usuario + .find({ _id: { $ne: request.uid } }) + .sort('-online') + .skip(desde) + .limit(20) + ; + + return response.json({ + ok: true, + usuarios, + desde + }); + +} + + +module.exports = { + getUsuarios +} + diff --git a/helpers/jwt.js b/helpers/jwt.js index c377290..d1e821e 100644 --- a/helpers/jwt.js +++ b/helpers/jwt.js @@ -23,7 +23,22 @@ const generarJWT = (uid) => { } +const comprobarJWT = (token = '') => { + try { + + const { uid } = jwt.verify(token, process.env.JWT_KEY); + return [true, uid]; + + } catch (error) { + return [false, null]; + } +} + + + + module.exports = { - generarJWT + generarJWT, + comprobarJWT } \ No newline at end of file diff --git a/index.js b/index.js index e2b0796..2370ac0 100644 --- a/index.js +++ b/index.js @@ -32,6 +32,8 @@ app.use(express.static(publicPath)); // mis rutas app.use('/api/login', require('./routes/auth')); +app.use('/api/usuarios', require('./routes/usuarios')); +app.use('/api/mensajes', require('./routes/mensajes')); diff --git a/middlewares/validar-jwt.js b/middlewares/validar-jwt.js index 5b43990..9c5749d 100644 --- a/middlewares/validar-jwt.js +++ b/middlewares/validar-jwt.js @@ -6,6 +6,7 @@ const validarJWT = (req, res, next) => { const token = req.header('x-token'); + console.log('###validando token###'); console.log(token); if(!token) { diff --git a/models/mensaje.js b/models/mensaje.js new file mode 100644 index 0000000..d873c38 --- /dev/null +++ b/models/mensaje.js @@ -0,0 +1,33 @@ +const { Schema, model } = require('mongoose'); + +const MensajeSchema = Schema({ + de: { + type: Schema.Types.ObjectId, // existe en las coleccion de datos + ref: 'Usuario', + required: true, + }, + para: { + type: Schema.Types.ObjectId, // existe en las coleccion de datos + ref: 'Usuario', + required: true, + }, + mensaje: { + type: String, + required: true + }, + +}, { + timestamps: true +}); + +MensajeSchema.method('toJSON', function() { + const { __v, _id, ...object } = this.toObject(); + object.uid = _id; + return object; +}); + + +// por defecto mongoose agrega una s al final de cada modelo creado +// por eso solo se define el modelo como Mensaje +// pero en la base de datos se creara el modelo Mensajes +module.exports = model('Mensaje', MensajeSchema); diff --git a/routes/auth.js b/routes/auth.js index e3caeb2..8cfbd80 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -23,7 +23,6 @@ router.post('/', [ ], login); router.get('/renew', [validarJWT], renewToken); -// router.get('/renew', renewToken); module.exports = router; \ No newline at end of file diff --git a/routes/mensajes.js b/routes/mensajes.js new file mode 100644 index 0000000..f073d3f --- /dev/null +++ b/routes/mensajes.js @@ -0,0 +1,14 @@ +// path: api/mensajes + +const {Router} = require('express'); + +const { validarJWT } = require('../middlewares/validar-jwt'); +const { obtenerChat } = require('../controller/mensajes'); + +const router = Router(); + + +router.get('/:de', [validarJWT], obtenerChat); + + +module.exports = router; \ No newline at end of file diff --git a/routes/usuarios.js b/routes/usuarios.js new file mode 100644 index 0000000..4d6004f --- /dev/null +++ b/routes/usuarios.js @@ -0,0 +1,14 @@ +// path: api/usuarios + +const {Router} = require('express'); + +const { getUsuarios } = require('../controller/usuarios'); +const { validarJWT } = require('../middlewares/validar-jwt'); + +const router = Router(); + + +router.get('/', [validarJWT], getUsuarios); + + +module.exports = router; \ No newline at end of file diff --git a/sockets/sockets.js b/sockets/sockets.js index 35c042b..24e7ca4 100644 --- a/sockets/sockets.js +++ b/sockets/sockets.js @@ -1,18 +1,47 @@ const { io } = require('../index'); +const { comprobarJWT } = require('../helpers/jwt'); +const { usuarioConectado, usuarioDesconectado, grabarMensaje } = require('../controller/socket'); // mensajes de sockets io.on('connection', client => { console.log('Cliente conectado'); + // validando token + const [valido, uid] = comprobarJWT(client.handshake.headers['x-token']); + + // verificando conexion + if (!valido) { return client.disconnect(); } + + console.log('Cliente autenticado'); + usuarioConectado(uid); + + // ingresar al usuario a una sala especifica + // sala global, client.id, uid + client.join(uid); + + + // escuchar del cliente el mensaje privado + client.on('mensaje-personal', async (payload) => { + // console.log(payload); + // grabar mensaje en la base de datos + + await grabarMensaje(payload); + io.to(payload.para).emit('mensaje-personal', payload); + + }); + + client.on('disconnect', () => { console.log('Cliente desconectado'); + usuarioDesconectado(uid); }); - client.on('mensaje', (payload) => { - console.log('mensaje!!!!!', payload); - io.emit('mensaje', {admin: 'saludando a todos'}); - }); + + // client.on('mensaje', (payload) => { + // console.log('mensaje!!!!!', payload); + // io.emit('mensaje', {admin: 'saludando a todos'}); + // });