Skip to content

Commit

Permalink
fin seccion 10
Browse files Browse the repository at this point in the history
  • Loading branch information
GermanContrerasF committed Jan 23, 2022
1 parent a82e074 commit 21bd8a7
Show file tree
Hide file tree
Showing 12 changed files with 237 additions and 15 deletions.
18 changes: 9 additions & 9 deletions controller/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,17 @@ 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'
});
}

// validar el password
const validPassword = bcrypt.compareSync(password, usuarioDB.password);
const validPassword = bcrypt.compareSync(password, usuario.password);

if (!validPassword) {
return res.status(400).json({
Expand All @@ -74,19 +74,19 @@ 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
});


} catch (error) {
console.log(error);
res.status(500).json({
ok: true,
ok: false,
msg: process.env.NOTIF_ERROR
});
}
Expand All @@ -106,19 +106,19 @@ 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
});


} catch (error) {
console.log(error);
res.status(500).json({
ok: true,
ok: false,
msg: process.env.NOTIF_ERROR
});
}
Expand Down
29 changes: 29 additions & 0 deletions controller/mensajes.js
Original file line number Diff line number Diff line change
@@ -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
}

54 changes: 54 additions & 0 deletions controller/socket.js
Original file line number Diff line number Diff line change
@@ -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
}









32 changes: 32 additions & 0 deletions controller/usuarios.js
Original file line number Diff line number Diff line change
@@ -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
}

17 changes: 16 additions & 1 deletion helpers/jwt.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
2 changes: 2 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'));



Expand Down
1 change: 1 addition & 0 deletions middlewares/validar-jwt.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const validarJWT = (req, res, next) => {

const token = req.header('x-token');

console.log('###validando token###');
console.log(token);

if(!token) {
Expand Down
33 changes: 33 additions & 0 deletions models/mensaje.js
Original file line number Diff line number Diff line change
@@ -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);
1 change: 0 additions & 1 deletion routes/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ router.post('/', [
], login);

router.get('/renew', [validarJWT], renewToken);
// router.get('/renew', renewToken);


module.exports = router;
14 changes: 14 additions & 0 deletions routes/mensajes.js
Original file line number Diff line number Diff line change
@@ -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;
14 changes: 14 additions & 0 deletions routes/usuarios.js
Original file line number Diff line number Diff line change
@@ -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;
37 changes: 33 additions & 4 deletions sockets/sockets.js
Original file line number Diff line number Diff line change
@@ -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'});
// });



Expand Down

0 comments on commit 21bd8a7

Please sign in to comment.